SQL 데이터 액세스

EGL은 SQL을 통해 관계형 데이터베이스 액세스를 지원합니다.

EGL은 다음과 같은 방법으로 SQL(Structured Query Language)을 지원합니다.
  • SQL 레코드 변수를 대상으로 지정하는 EGL 데이터 액세스 명령문(예: add 또는 get)을 사용할 때마다 EGL은 암시적 SQL문을 작성합니다. SQL을 전혀 몰라도 관계형 데이터베이스에 액세스하는 함수를 쓸 수 있습니다.
  • #sql 지시문을 통해 임베디드 SQL문을 코드할 수 있습니다. 임베디드 SQL문은 항상 암시적 SQL문을 대체합니다. 임베디드 SQL문을 사용하여 SQL 어휘의 전체 범위를 하니스할 수 있습니다. 그러나 이를 사용하려면 SQL에 능숙해야 합니다.
  • 동적 SQL을 사용하는 경우 실제 SQL문은 런타임 시까지 완료되지 않습니다. 동적 SQL을 사용하는 경우에는 일반적으로 준비된 명령문을 사용합니다. EGL prepare 문을 사용하여 런타임에 이 SQL 코드를 어셈블한 후 처리를 위해 EGL open, get 또는 execute 문으로 전달하십시오.

일반 SQL 처리

일반 SQL 처리는 EGL open 문으로 시작합니다. open 문은 기준 세트를 데이터베이스 관리 소프트웨어로 전송하고 리턴 시 결과 세트(일치하는 데이터의 행)를 가져옵니다. 결과 세트는 가리키는 행을 계속 추적합니다. get 문의 변형 중 하나를 사용하여 결과 세트에서 순차적으로 읽거나 상대 또는 절대 위치에서 읽을 수 있습니다.

백그라운드에서 작동하는 경우, EGL은 COBOL에서 Java™에서와 다르게 작동합니다. COBOL 코드는 open 문을 일련의 SQL문으로 해석하고 SQL 커서를 사용하여 결과 세트에서 위치를 유지합니다. 다음 SQL문은 COBOL에서 EGL open 문과 동등합니다.
  • 커서를 작성하는 DECLARE 문
  • 커서 사용을 준비하는 OPEN 문
  • 결과 세트를 작성하는 SELECT 문

Java 코드는 Statement 오브젝트를 사용하여 ResultSet 오브젝트를 작성합니다.

위치 옵션(예: next 또는 absolute)이 있는 get 문은 COBOL에서 SQL FETCH 문을 생성(Java에서도 같음)하여 특정 행의 데이터를 검색합니다.

또한 위치 옵션을 사용하지 않고 이전에 open 문을 사용하지 않은 상태로 get 문을 사용할 수도 있습니다. 이 경우 get은 COBOL로 다음 SQL을 생성(Java에서도 같음)합니다.
  • 커서를 작성하는 DECLARE 문
  • 커서 사용을 준비하는 OPEN 문
  • 결과 세트를 작성하는 SELECT 문
  • 첫 번째 열을 검색하기 위한 FETCH 명령문
  • 결과 세트와 커서를 삭제하는 CLOSE 문(get 문에 일반적이지 않은 forUpdate 절이 포함된 경우 제외)

get 문으로 결과 세트를 작성하는 경우 EGL은 첫 번째 행을 페치한 후 결과 세트를 닫습니다. get이 결과 세트를 닫으므로 위치 get을 사용하여 계속할 수 없습니다. 반복되는 위치 get 문을 사용하려면 EGL open으로 처리를 시작하고 완료될 때 EGL close를 수행해야 합니다.

암시적 SQL문

EGL은 SQL 레코드 변수의 특성과 값을 기반으로 SQL문을 생성합니다(SQLRecord 스테레오타입 참조).

예를 들어, 다음 EGL 소스 코드를 고려하십시오.
Record CustomerRecord type SQLRecord 
{ tableNames=[["Customer"]], keyItems=["customerNumber"] }
  customerNumber INT {column = "customer_number"};
  customerName STRING {column = "customer_name"};
  customerBalance DECIMAL(9,2) {column = "customer_balance"};
end
program CustomerTest type BasicProgram

myCustomer CustomerRecord;

  function main()
    myCustomer.customerNumber = 1001;
    get myCustomer;
    printCustomer(myCustomer);
  endend
EGL은 get myCustomer; 문을 SQL DECLARE 및 OPEN 문, 다음 SQL SELECT 코드, 그리고 마지막으로 SQL FETCH 및 CLOSE 문으로 변환합니다.
select
	customer_number, customer_name, customer_balance
into :myCustomer.customerNumber, :myCustomer.customerName, 
	:myCustomer.customerBalance
from Customer
where
	customer_number = :myCustomer.customerNumber
이 코드 내의 모든 것은 myCustomer SQL 레코드 변수의 요소에 의해 암시되므로 이 코드를 암시적이라고 합니다. EGL은 이 코드의 결과로 다음 조치를 수행합니다.
  • SELECT 절은 EGL 필드 레벨 column 특성을 사용하여 레코드 내의 필드에 해당하는 모든 열을 찾습니다.
  • INTO 절은 SELECT 절의 열에 해당하는 변수를 나열합니다. 콜론 문자(:)로 시작하는 변수를 호스트 변수라고 합니다. 호스트 변수의 내용을 참조하십시오.
  • FROM 절은 EGL 레코드 레벨 tableNames 특성에서 테이블 이름을 가져옵니다.
  • WHERE 절은 EGL 레코드 레벨 keyItems 특성의 값을 데이터베이스 테이블에 대한 키로 사용합니다.

이 SQL SELECT 절은 편집기를 통해 표시됩니다. 편집기를 사용하여 사용자가 수정할 수 있는 임베드된 SQL로 변환하면 코드를 명시적으로 만들 수 있습니다. 자세한 정보는 EGL 프로그래머 안내서에서 암시 SQL문 보기의 내용을 참조하십시오.

SQL문 쓰는 방법을 이미 아는 경우, 임베디드 SQL을 작성하는 것이 더 유연합니다.

임베디드 SQL문

EGL은 사용자가 임베드한 SQL문에서 매우 작은 구문 또는 기타 검사를 수행합니다. 임베디드 SQL문은 항상 암시적 SQL문을 대체합니다. 임베디드 명령문에 오류가 포함된 경우에도 마찬가지입니다. 따라서 임베디드 SQL문을 사용하는 경우에는 주의해야 합니다.

#sql 지시문의 구문과 예제에 대해서는 ""#sql 지시문"을 참조하십시오.

동적 SQL

동적 SQL 코드는 런타임에 어셈블되며, 특히 사용자가 사용자 애플리케이션을 통해 직접 조회를 생성하는 상황에서 유용합니다. 예를 들어, 사용자에게 잠재적 보고서 필드를 위한 선택란 목록이 있을 수 있습니다. 애플리케이션은 사용자가 제공하는 기준을 기반으로 SELECT 문을 빌드할 수 있습니다.

동적 SQL은 성능에 부정적인 영향을 미칠 수 있습니다. 추가되는 유연성과 이 단점을 비교해 보아야 합니다.

일반적으로 EGL prepare 문을 사용하여 선택 기준, 데이터 집계 방법 또는 행이 리턴되는 순서를 다양하게 지정합니다. 이러한 세부사항은 WHERE, HAVING, GROUP BY 또는 ORDER BY 절로 제어합니다. 자세한 정보는 prepare를 참조하십시오.

EGL과 VisualAge® Generator 간 호환성의 일부로, 테이블 변수를 사용하여 런타임 처리를 위한 테이블을 동적으로 선택할 수 있습니다. 이 옵션에 대한 자세한 정보는 SQLRecord 스테레오타입의 내용을 참조하십시오. 일반적으로 prepare 문을 통해 동적 테이블 선택을 수행합니다.