SQLRecord 스테레오타입

SQLRecord 스테레오타입은 관계형 데이터베이스와 함께 사용하기 위해 레코드 파트를 특수화합니다.

스테레오타입(스테레오타입 참조)은 레코드 레벨 및 필드 레벨에서 고유 특성을 제공합니다. 이 유형의 변수를 get 또는 replace와 같은 EGL 데이터 액세스의 대상으로 사용하는 경우, 이는 특정 동작을 트리거합니다.

EGL은 데이터베이스의 정보를 기반으로 SQLRecord 파트를 자동으로 작성할 수 있습니다. 자세한 정보는 EGL 프로그래머 안내서에서 데이터 액세스 애플리케이션 작성의 내용을 참조하십시오.

SQLRecord 스테레오타입을 기반으로 하는 각 사용자 정의 레코드 유형에는 다음과 같은 선택적 특성이 있습니다.
tableNames
각 요소가 레코드 정의와 연관될 SQL 테이블을 식별하는 2차원 배열입니다. 선택적으로 테이블을 위한 테이블 레이블(SQL 별명)을 지정할 수 있습니다(이 주제의 "테이블 레이블" 참조). 테이블 이름을 지정하지 않으면 특성은 SQL 레코드의 이름으로 기본값을 설정합니다. 다음 예제의 코드는 EGL에게 데이터 액세스 명령문에서 CustomerRecord 변수를 사용할 때마다 "Customer"라는 데이터베이스 테이블을 사용한다고 가정함을 알립니다.
Record CustomerRecord type SQLRecord
  { tableNames = [["Customer"]] }
  ...
end
defaultSelectCondition
기본 SQL문에서 WHERE 절의 파트가 되는 조건을 지정합니다. WHERE 절은 EGL execute, open 또는 get 문에서 SQL 레코드가 사용되는 경우에 의미가 있습니다.

대부분의 경우 SQL 기본 선택 조건은 SQL 레코드의 키 필드 값과 SQL 테이블의 키 열 사이의 연관을 기반으로 하는 2차 조건을 보충합니다.

#sqlCondition 지시문을 사용하여 조건을 지정하십시오. 자세한 정보는 #sqlCondition 지시문의 내용을 참조하십시오.

tableNameVariables
다음 예제에서처럼 런타임에 액세스할 데이터베이스 테이블을 판별하는 컨텐츠가 있는 하나 이상의 변수를 지정할 수 있습니다.
myTable STRING;
Record CustomerRecord type SQLRecord
  { tableNameVariables = [["myTable"]] }
  ...
end
myCustomer CustomerRecord;

  function main()
    myTable = requestTableName();
    get myCustomer;
    displayCustomer(myCustomer);
  end
EGL get myCustomer 문은 myTable 변수가 이름 지정한 데이터베이스 테이블에서 데이터를 읽습니다. myTable 변수를 사용하여 유사한 열이 있는 여러 테이블을 가질 수 있습니다. 로직은 액세스할 테이블을 판별합니다. 각 테이블을 위해 새 EGL 코드를 작성할 필요가 없습니다.
tableNameVariables는 2차원 배열을 받습니다. 테이블 이름을 보유하는 변수에 추가로 두 번째 차원을 사용하여 테이블 레이블을 지정하십시오(이 주제의 "테이블 레이블" 참조).
{ tableNameVariables = [["myTable", "T1"], 
                        ["myOtherTable", "T2"]] }
keyItems
이 배열은 키를 구성하는 레코드에서 하나 이상의 필드를 식별합니다. 키는 데이터베이스 테이블의 해당 필드와 일치시키는 데 사용됩니다. 이러한 각 필드를 지정하려면 규정되지 않은 참조를 사용해야 합니다. 예를 들어, myRecord.myItem이 아니라 myItem을 사용하십시오. EGL 문에서는 다른 모든 필드와 동일한 방식으로 키 필드를 참조할 수 있습니다. get 또는 open 문과 함께 usingKeys 키워드를 지정하여 이러한 키 값을 대체할 수 있습니다.
fieldsMatchColumns
모든 필드의 유형, 길이, 10진수의 수 및 널 입력 가능성이 해당 데이터베이스 열의 해당 특성과 정확히 일치하는 경우 이 특성을 YES로 설정하십시오. 이 특성을 사용하면 데이터베이스에서 데이터를 검색할 때 EGL 프로그램이 Java™가 수행하도록 생성한 일관성 검사가 무시되어 프로세스의 속도가 빨라집니다. 기본값은 NO입니다.

테이블 레이블

tableNames 또는 tableNameVariables 배열의 각 요소에는 테이블 레이블이 포함될 수 있습니다. DB2® 버전 7은 최대 18자 길이의 테이블 레이블을 지원합니다. DB2 버전 8에서는 테이블 레이블 길이에 제한이 없습니다. SQL JOIN 문을 사용하여 테이블을 결합하는 경우 이 레이블(SQL에서는 별명이라고 함)을 사용하여 동일한 이름의 두 열을 구별할 수 있습니다. 다음 예제는 tableNames 배열을 나타냅니다.
package com.CompanyB.CustomerPackage;

Record CustomerRecord type SQLRecord 
{ tableNames=[["Customer", "T1"]], keyItems=["customerNumber"] }
	customerNumber INT {column = "customer_number"};
	customerName STRING {column = "customer_name"};
	customerBalance DECIMAL(9,2) {column = "customer_balance"};
end
Record OrderRecord type SQLRecord 
{ tableNames=[["Orders", "T2"]], keyItems=["orderNumber"] }
	orderNumber INT {column = "order_number"};
	customerNumber INT {column = "customer_number"};
	orderTotal DECIMAL(9,2) {column = "order_total"};
end
program CustomerTest type BasicProgram 
	myCustomer CustomerRecord; 
	myOrder OrderRecord;

	function main()
		myCustomer.customerNumber = 1001;
		get myCustomer with
			#sql{
				select
					customer_name, order_total
				from Customer T1, Orders T2
				join Orders on T1.customer_number = T2.customer_number
				where
					T1.customer_number = :myCustomer.customerNumber
			}
			into myCustomer.customerName, myCustomer.customerBalance;  
	end	
end

customerNumber 필드는 Customer 테이블의 기본 키이며 Order 테이블의 외부 키입니다. 그러나 두 테이블을 결합한 후에는 T1 또는 T2 지정을 사용하여 해당 코드가 참조하는 customerNumber를 지정해야 합니다.