SQL에 대한 execute 고려사항

SQL의 컨텍스트에서 EGL execute 문은 일반적으로 동적 요소가 있는 준비된 SQL문을 수행하는 데 사용됩니다.

또한 이 명령문을 사용하여 암시적 delete, insert 또는 update 조회를 작성하거나 사용 가능한 명령의 제한된 목록으로부터 임베드된 SQL을 쓸 수도 있습니다.

구문

execute 문의 구문 다이어그램
preparedStatementID
EGL prepare 문을 사용할 때 준비된 SQL 코드에 지정한 식별자입니다. 이는 execute 문의 가장 일반적인 사용이며, 일반적으로 동적 SQL을 포함합니다. 동적 SQL에 대한 자세한 정보는 SQL 데이터 액세스의 내용을 참조하십시오.
using ... field
런타임에 준비된 SQL문이 사용할 수 있는 EGL 호스트 변수를 식별합니다(호스트 변수 참조). #sql 블록의 외부에 있는 이러한 유형의 절에서는 호스트 변수 이름 앞에 콜론을 포함하지 마십시오.
for SQLRecordVariable
이 주제의 "암시적 SQL 코드 생성"에서 설명하는 것처럼, 암시적 SQL문(delete, insert 또는 update)을 작성 중인 경우 EGL은 이 SQL 레코드 변수를 사용하여 해당 명령문의 컨텐츠를 판별합니다. 다음 예제와 같이 SQL 레코드를 사용하여 조작의 결과를 테스트할 수 있습니다.
onException (sqlEx SQLException)
  if (myCustomer is unique)
    myErrorHandler(8); 
  endend
delete, insert, update
이러한 키워드를 사용하여 지정된 유형의 암시적 SQL문을 요청하십시오. 암시적 SQL문의 개요에 대해서는 SQL 데이터 액세스의 내용을 참조하십시오. 이러한 키워드를 사용하는 경우, execute 문에 SQL 레코드 변수를 포함시키십시오.
#sql{ sqlStatement }
이 유형의 임베디드 SQL문 사용에 대한 자세한 정보는 sql 지시문의 내용을 참조하십시오. SQL문이 결과 세트의 행을 업데이트하거나 삭제하도록 하려면 다음 절을 포함하는 SQL UPDATE 또는 DELETE 문을 코딩하십시오.
  WHERE CURRENT OF resultSetID
resultSetID
결과 세트를 사용 가능하게 만드는 EGL open 또는 get 문에 지정된 resultSetID입니다.

#sql과 왼쪽 중괄호 사이에 공백을 남기지 마십시오.

암시적 SQL 코드 생성

execute 문을 통해 암시적 SQL을 생성하면 우선 open 또는 get을 수행하지 않고도 특정 데이터베이스 조작을 수행할 수 있습니다. EGL은 일반적으로 SQL 데이터베이스 액세스의 세부사항(예: 결과 세트 행 위치의 처리)을 숨깁니다. execute 문을 통해 SQL 레코드 파트의 defaultSelectCondition 특성을 설정하여 변경할 데이터베이스의 행을 직접 지정할 수 있습니다.

예를 들어, CustomerRecord 파트에 defaultSelectCondition을 설정하여 5년간 활동하지 않은 모든 고객을 찾을 수 있습니다. (이를 수행하는 방법에 대한 정보는 #sqlCondition 지시문의 내용을 참조하십시오.) 그런 다음 연관된 myCustomer SQL 레코드 변수에서 키 필드를 지워서 모든 고객 번호가 필터를 통과하도록 허용하십시오. 결과 세트를 작성할 필요 없이 선택된 모든 고객을 고객 데이터베이스에서 제거하려면 다음 EGL 문을 사용하십시오.
execute delete myCustomer;

보호 장치가 없으므로, 이러한 암시적 SQL 명령을 사용하는 경우에는 주의하십시오.

암시적 SQL DELETE

암시적 SQL DELETE 문은 defaultSelectCondition SQL 레코드 특성을 사용하여 각 SQL 테이블 키 열의 값이 SQL 레코드 변수의 해당 키 필드 값과 같을 때 삭제할 테이블 행을 판별합니다. 레코드 키 또는 기본 선택 조건을 지정하지 않으면 모든 테이블 행이 삭제됩니다.

EGL이 생성하는 암시적 SQL DELETE 문의 구문은 다음과 같습니다.
  DELETE FROM tableName
  WHERE  [ defaultSelectCondition AND ]
         keyColumn01 = :keyField01 [ AND
         ...
         keyColumnnn = :keyFieldnn ]

단일 EGL 문을 사용하여 둘 이상의 데이터베이스 테이블에서 행을 삭제할 수는 없습니다.

암시적 SQL INSERT

기본적으로 암시적 SQL INSERT 문은 다음 조치를 수행합니다.
  • SQL 레코드 변수의 키 값은 테이블에서 데이터의 논리적 위치를 판별합니다. 키가 없는 레코드는 SQL 테이블 정의 및 데이터베이스 규칙에 따라 처리됩니다.
  • SQL 레코드 선언에서 레코드 필드와 SQL 테이블 열을 연관시키면 생성된 코드는 레코드 변수의 각 필드에 있는 데이터를 관련된 SQL 테이블 열에 배치합니다.
  • 레코드 필드를 읽기 전용으로 선언한 경우, 생성된 SQL INSERT 문에 해당 레코드 필드가 포함되지 않으며 데이터베이스 관리 시스템은 관련된 SQL 테이블 열의 값을 열 정의 시 지정된 기본값으로 설정합니다.
EGL이 생성하는 암시적 SQL INSERT 문의 구문은 다음과 같습니다.
  INSERT INTO tableName
    (column01, ... columnNN)
    values (:recordField01, ... :recordFieldNN)

암시적 SQL UPDATE

기본적으로 암시적 SQL UPDATE 문은 다음 조치를 수행합니다.
  • 각 SQL 테이블 키 열의 값이 SQL 레코드의 해당 키 필드 값과 같으면 defaultSelectCondition SQL 레코드 특성은 선택할 테이블 행을 판별합니다. 레코드 키 또는 기본 선택 조건을 지정하지 않으면 모든 테이블 행이 업데이트됩니다.
  • SQL 레코드 선언에서 레코드 필드와 SQL 테이블 열을 연관시키면 주어진 SQL 테이블 열은 레코드 변수에서 관련 필드의 컨텐츠를 수신합니다. 그러나 SQL 테이블 열이 읽기 전용인 레코드 필드와 연관된 경우에는 해당 열이 업데이트되지 않습니다.
암시적 SQL UPDATE 문의 구문은 다음과 같습니다.
  UPDATE tableName
  SET    column01 = :recordField01, 
         column02 = :recordField01, ... 
         columnNN = :recordFieldNN
  WHERE  keyColumn01 = :keyField01 [ AND
         ...
         keyColumnnn = :keyFieldnn ] 

임베디드 SQL

execute 문을 사용하면 먼저 open 또는 get 문을 수행할 필요 없이 데이터베이스에서 긴 일련의 행을 삭제할 수 있습니다. 일련의 행을 삭제하려면 삭제할 조건을 설정하는 WHERE 절이 있는 SQL DELETE 문을 임베드하십시오. 다음 예제에서 회사는 EGL 코드에서 이전에 설정된 날짜인 targetDate 이후로 아무것도 주문하지 않은 모든 고객을 데이터베이스에서 제거합니다.
execute #sql{
  DELETE FROM Customer
  WHERE last_order_date < :targetDate
};

EGL 변수 targetDate는 SQL 코드에서 호스트 변수(앞에 콜론이 있음)가 되었습니다. 자세한 정보는 호스트 변수의 내용을 참조하십시오.

참고: 복수 행 조작의 경우 구조화된 레코드의 정적 배열을 호스트 변수로 사용할 수 없습니다.

또한 유사한 구문을 사용하여 SQL INSERT 또는 UPDATE 문을 임베드할 수 있습니다.

EGL execute 문을 사용하여 결과 세트를 리턴하는 SQL문을 임베드할 수는 없습니다. 사용자가 커서를 직접 제어할 수 없기 때문입니다. EGL은 모든 커서 정의와 관리를 내부적으로 처리합니다.

execute 문을 사용하여 다음 유형의 SQL문을 실행할 수 있습니다.
  • ALTER
  • CALL
  • CREATE ALIAS
  • CREATE INDEX
  • CREATE SYNONYM
  • CREATE TABLE
  • CREATE VIEW
  • DECLARE global temporary table
  • DELETE
  • DROP INDEX
  • DROP SYNONYM
  • DROP TABLE
  • DROP VIEW
  • GRANT
  • INSERT
  • LOCK
  • RENAME
  • REVOKE
  • SAVEPOINT
  • SET
  • SIGNAL
  • UPDATE
  • VALUES
execute 문을 사용하여 다음 유형의 SQL문을 실행할 수는 없습니다.
  • CLOSE
  • COMMIT
  • CONNECT
  • CREATE FUNCTION
  • CREATE PROCEDURE
  • DECLARE CURSOR
  • DESCRIBE
  • DISCONNECT
  • EXECUTE
  • EXECUTE IMMEDIATE
  • FETCH
  • OPEN
  • PREPARE
  • ROLLBACK WORK
  • SELECT
  • INCLUDE SQLCA
  • INCLUDE SQLDA
  • WHENEVER

예제

여기에 execute 문의 여러 예제가 있습니다. 이러한 예제에서 myCustomer는 SQL 레코드 변수입니다.
execute #sql{ 
  create table Customer (
    customer_number int not null,
    customer_name char(40) not null,
    customer_balance decimal(9,2) not null)
};

execute update for myCustomer;

execute #sql{ 
  call aStoredProcedure( :parameterVar)
};

execute myPreparedStatement;

오류 조건

암시적 delete, insert 또는 update 조회를 호출하는 경우 SQL 레코드 변수를 지정하지 않으면 선언 시간 오류가 발생합니다.

사용 가능한 호스트 변수가 모두 읽기 전용인 경우 암시적 insert 또는 update 조회에서 오류가 발생합니다.