SQL 데이터
SQL(세 개별 문자로 발음함)은 관계형 데이터베이스 관리 시스템(DBMS)과 통신하는 데 사용되는 언어이며, 이 시스템은 서로 연결된 여러 테이블에서 비즈니스 정보를 유지보수하는 데이터베이스를 제어합니다.
- 일반적인 단순한 태스크를 수행하는 경우에는 모든 I/O 조작을 수행하는 데 EGL 명령문을 사용합니다(레코드 읽기 및 쓰기 참조). 이 경우 EGL은 사용자를 대신하여 모든 실제 SQL문을 작성합니다.
- #sql 지시문을 사용하여 사용자 고유의 SQL문을 EGL 코드에 포함시킵니다.
EGL을 사용하면 이 두 가지 스타일을 결합할 수 있습니다. EGL이 사용자의 EGL 코드로부터 생성하는 SQL문에 액세스하고 이를 수정할 수 있습니다(암시 SQL문 보기 참조).
- EGL을 SQL 데이터베이스에 연결하는 데 대한 지시사항(SQL 데이터베이스 연결 작성 참조)
- SQL 레코드의 간편 작성법(SQL 테이블 데이터 검색 참조)
- 완전한 SQL 애플리케이션의 간편 작성법(데이터 액세스 애플리케이션 작성 참조)
EGL 접근법
다음 표에는 EGL을 사용하여 관계형 데이터베이스와 상호작용하는 방법이 간략하게 설명되어 있습니다.
| SQL의 목적 | EGL 접근법 |
|---|---|
| 단순 SQL 데이터 조작(SELECT, UPDATE, INSERT, DELETE). 기본 키가 WHERE 및 ORDER BY를 제어합니다. | EGL 키워드(get, replace, add, delete)를 사용하고 EGL이 암시 SQL을 생성하도록 합니다. |
| 재사용가능 사용자 정의 WHERE 절을 사용한 단순 SQL 데이터 조작 | 사용자 정의 WHERE 절을 defaultSelectCondition 특성에 삽입합니다. |
| 사용자 정의 WHERE 절을 사용한 SQL SELECT 문 | #sql 지시문을 통해 명시 SQL을 사용합니다. |
| SQL 테이블 JOIN 문 | 워크벤치의 SQL 검색 기능을 사용한 후 defaultSelectCondition 특성을 사용하여 기본 키 및 외부 키의 테이블을 올바르게 결합합니다.
|
| SELECT 명령의 파생 데이터(MAX() 또는 AVG() 등) | #sql 지시문을 통해 명시 SQL을 사용합니다(파생 필드를 중괄호로 묶음). |
| 개별 필드의 column 특성이 파생 또는 계산된 표현식을 지정하는 사용자 정의 SQLRecord를 작성합니다. | |
| 복합 또는 사용자 정의 SQL UPDATE, INSERT 또는 DELETE 문 | EGL replace, add 또는 delete 문을 명시 SQL(#sql 지시문)과 함께 사용합니다. |
| execute #sql 문을 통해 명시 SQL을 사용합니다. | |
| 단순 데이터 조작이 아닌 SQL문(CREATE TABLE 등) | execute #sql 문을 통해 명시 SQL을 사용합니다. |
| 동적 SQL(준비된 SQL문) | execute #sql 문을 통해 명시 SQL을 사용합니다. |
| 스토어드 프로시저 | 다음과 같은 명시 SQL을 사용합니다. |
| SQL SELECT 문의 결과 세트에 있는 개별 행의 처리 | EGL open 명령을 사용하여 결과 세트를 연 후 다음 명령문 중 하나를 사용하여 루프를 시작합니다.
|
| 온라인 검색에 대한 프로그램된 페이지 지정 | 데이터 액세스 애플리케이션 마법사를 사용합니다. |
| SQL 테이블에 대한 데이터 추가 | 워크벤치 데이터 퍼스펙티브의 테이블 편집기를 사용합니다. |
| SQL문 유효성 검증 | EGL 편집기의 컨텍스트 메뉴에서 SQL 유효성 검증을 선택합니다. |
| 워크벤치 데이터 퍼스펙티브의 SQL 편집기를 사용하여 대화식 SQL 실행 |
결과 세트 처리
- EGL open 문을 forUpdate 옵션과 함께 실행하여 커서를 선언하고 여십시오. 이 옵션은 후속 업데이트 또는 삭제를 위해 선택한 행을 잠급니다.
- EGL get next 문을 실행하여 행을 페치하십시오.
- forEach 루프에서 다음 조치를 수행하십시오.
- 결과 세트로부터 데이터를 검색하여 호스트 변수로 가져오십시오. 호스트 변수는 호스트 언어의 변수와 이름이 같으며 추가 시작 콜론 문자(:)가 있는 SQL문 내의 변수입니다.
- EGL replace 또는 delete 문을 실행하여 행을 업데이트하거나 삭제하십시오.
- EGL get next 문을 실행하여 또 다른 행을 페치하십시오.
- EGL commit() 함수를 실행하여 변경을 커미트하십시오.
커서를 여는 명령문과 해당 커서의 행에 조치를 수행하는 명령문은 결과 세트 ID를 통해 서로 연관되며, 이 ID는 프로그램 내의 모든 결과 세트 ID 및 프로그램 변수에서 고유해야 합니다. 사용자는 이 ID를 커서를 여는 open 문에 지정하며, 루프를 작성하는 forEach 문에서도 이와 동일한 ID를 참조합니다. 이 ID는 개별 행에 영향을 주는 get next, delete 및 replace 문과 커서를 닫는 close 문에서도 참조합니다.
try
open selectEmp forUpdate for emp;
onException(sqlx SqlException)
myErrorHandler(sqlx); // exits program
end
foreach(emp)
emp.empname = emp.empname :: " " :: "III";
try
replace emp;
onException(sqlx SqlException)
myErrorHandler(sqlx); // exits program
end end // end while; cursor is closed automatically
// when the last row in the result set is read
sysLib.commit();
EGL open 문을 처리하면서 변경을 주기적으로 커미트하려면(SQL 레코드 사용 여부에 관계없이) 커미트 후에 커서 위치를 유지하는 hold 문 옵션을 사용하십시오. 그러나 CICS®를 대상으로 하는 프로그램이 세그먼트된 경우 세그먼트된 프로그램 내의 converse는 CICS 트랜잭션을 종료시켜 프로그램이 파일 또는 데이터베이스 위치를 유지할 수 없게 하므로 hold 옵션이 효과가 없습니다.
SQL 레코드와 그 사용법
add myEmpRecord;
try
add myEmpRecord;
onException(sqlx SqlException)
if (myEmpRecord is unique) // if a table row had the same key
myErrorHandler(sqlx);
end end
- SQLRecord 파트를 정의하고 관련 레코드 변수를 선언하십시오.
- SQL 레코드를 사용하여 I/O를 수행하는 EGL 명령문을 작성하십시오.
- EGL 명령문의 기본 동작을 수락하거나(대부분의 경우 원하는 결과를 얻을 수 있음), 사용자의 비즈니스 로직에 적합하게 SQL을 변경하십시오.
SQLRecord 파트 및 관련 레코드 정의
사용자는 SQLRecord 파트를 정의하고 각 필드를 관계형 테이블 또는 보기에 있는 열과 연관시킵니다. EGL은 사용자를 위해 이를 자동으로 수행할 수 있습니다. SQL 테이블 데이터 검색의 내용을 참조하십시오.
- 다른 SQL 레코드. 각 변수는 상위 테이블과 하위 테이블 간의 일대일 관계를 나타냅니다.
- SQL 레코드의 배열. 각 변수는 상위 테이블과 하위 테이블 간의 일대다 관계를 나타냅니다.
기본 유형의 필드만 데이터베이스 열을 나타낼 수 있습니다.
- 각 SQLRecord 파트의 구조는 일반(계층 구조가 없음)이어야 함
- 모든 필드는 BLOB, CLOB 또는 STRING이 아닌 기본 필드여야 함
- 레코드 필드는 구조 필드 배열이 아니어야 함
SQLRecord 파트를 정의하면 해당 파트를 기반으로 레코드 변수가 선언됩니다.
SQL 관련 EGL 명령문
각각 레코드 변수를 명령문의 I/O 오브젝트로 사용하는 EGL 명령문 세트를 작성할 수 있습니다. 각 명령문에 대해 EGL은 소스에 없지만 레코드 변수와 EGL 명령문의 조합에 의해 암시되는 암시 SQL문을 제공합니다. EGL add 문의 경우를 예로 들면, 암시 SQL INSERT 문이 해당 레코드의 필드 값을 연관된 테이블 열에 삽입합니다. 레코드 변수가 테이블 열이 지정되지 않은 필드를 포함하는 경우 EGL은 이 필드의 이름이 열의 이름과 동일하다는 전제 하에 암시 SQL 문을 생성합니다.
다음 EGL 명령문은 표시된 SQL문에 해당합니다.
| EGL 명령문 | SQL문 |
|---|---|
| add | INSERT |
| delete | DELETE |
| get, open | SELECT |
| replace | UPDATE |
암시 SELECT 문
Record Employee type sqlRecord
{ tableNames = [["EMPLOYEE"]],
keyItems = ["empnum"] }
empnum decimal(6,0);
empname char(40);
end
myEmpRecord Employee;
get myEmpRecord;
SELECT empnum, empname
FROM EMPLOYEE
WHERE empnum = :empnum
INTO :empnum, :empname
- defaultSelectCondition 레코드 특성에 지정한 값.
- 다음 두 값 세트 간의 관계(예: 상등).
- 테이블 키를 구성하는 열의 이름
- 레코드 키를 구성하는 호스트 변수의 값
암시 SELECT 문에 대한 세부사항은 EGL 언어 참조에 있는 개별 키워드 주제를 참조하십시오.
커서가 있는 SQL 레코드
SQL 레코드를 사용할 때는 결과 세트 ID를 사용하는 경우와 유사한 방식으로 여러 EGL 명령문에 같은 레코드 변수를 사용하여 커서 처리 명령문을 관련시킬 수 있습니다. 그러나 결과 세트 ID가 나타내는 교차 명령문 관계는 레코드 변수가 나타내는 관계에 우선합니다. 몇몇 경우에는 resultSetID를 지정해야 합니다.
또한 특정 레코드 변수에 대해 열릴 수 있는 커서는 하나뿐입니다. EGL 명령문이 동일한 레코드 변수에 대해 다른 커서가 열려 있는 상태에서 커서를 여는 경우 생성된 코드는 첫 번째 커서를 자동으로 닫습니다.
SQL문 사용자 정의
- 암시 SQL문을 수락합니다. 이 경우에는 SQLRecord 파트를 변경하면 런타임 시에 사용되는 SQL문이 영향을 받습니다. 예를 들어, SQL 레코드의 키로 다른 필드를 사용하도록 나중에 표시하는 경우 EGL은 해당 SQLRecord 파트를 기반으로 하는 커서 선언에 사용된 암시 SELECT 문을 변경합니다.
- SQL문을 명시로 변경하도록 선택합니다. EGL은 사용자가 수정할 수 있도록 사용자 대신 코드에 암시 SQL문을 삽입할 수 있습니다. 이 경우 해당 SQL문의 세부사항은
SQLRecord 파트로부터 분리되며 이 SQLRecord 파트에 대한 후속 변경은 런타임 시에 사용되는 SQL문에 영향을 주지 않습니다.
소스에서 명시 SQL문을 제거하면 암시 SQL 문이 존재하는 경우 생성 시에 이를 다시 사용할 수 있게 됩니다.
레코드 내에서 레코드를 사용하는 데 대한 예제
DataItem DeptNo { column = "deptNo" } end
Record Dept type SQLRecord
deptNo DeptNo;
managerID CHAR(6);
employees Employee[];
end
Record Employee type SQLRecord
employeeID CHAR(6);
empDeptNo DeptNo;
end
Function getDeptEmployees(myDeptRecord Dept)
get myDeptRecord.employees usingKeys myDeptRecord.deptNo;
end
널 테스트 및 설정
Record Employee type SQLRecord
employeeID CHAR(6);
empDeptNo INT?;
end
if (myEmpRecord.empDeptNo == null)
...
end
myEmpRecord.empDeptNo = null;
set myEmpRecord.empDeptNo empty;
호환성
| 플랫폼 | 문제 |
|---|---|
| z/OS®용 CICS, z/OS 일괄처리, iSeriesC | 생성된 코드가 DB2® UDB에 직접 액세스할 수 있음 |
| AIX®, HP-UX, iSeriesJ, Linux, Solaris, z/OS UNIX System Services, Windows 2000/NT/XP | JDBC가 DB2 UDB, Oracle, Informix® 또는 Microsoft SQL Server에 대한 액세스를 제공함 |