EGL prepare 문을 사용하여 동적으로 SQL 문을 생성할 수 있습니다.
function printExpensiveItems(maxPrice Price in)
tempItem Item;
open expensiveItems for tempItem with
#sql{
select
EGL.ITEM.ITEM_ID, EGL.ITEM.NAME, EGL.ITEM.IMAGE,
EGL.ITEM.PRICE, EGL.ITEM.DESCRIPTION
from EGL.ITEM
where
EGL.ITEM.PRICE >= :maxPrice
order by
EGL.ITEM.ITEM_ID asc
};
forEach (tempItem)
SysLib.writeStdout(tempItem.Name :: " " ::
tempItem.Description :: " $" :: tempItem.Price);
end
매개변수 이하인 가격의 항목을 표시하려는 경우를
고려해보십시오. 또는, 최대 및 최소 가격 사이의 항목을 표시하려는 경우를
고려해보십시오. SQL 문의 WHERE절에서의 비교는 하드 코딩되어 있으므로
open 문에서 명시적 SQL을 사용하여 세 함수(각 경우에
대해 하나씩)를 코딩해야 합니다. selectStatement STRING = "select * from EGL.ITEM where EGL.ITEM.PRICE >= 500";그런 다음, prepare 문을 사용하여 문자열을 SQL 문으로 변환합니다. 명령문의 이름과 선택적으로 레코드 변수를 지정하여 명령문이 작동할 SQLRecord 부분을 표시해야 합니다.
tempItem Item; prepare preparedStatement from selectStatement for tempItem;그런 다음, 다음과 같이 EGL get, open 또는 execute 문의 명시적 SQL 대신 prepared 문을 사용할 수 있습니다(이후에 execute에 대해 자세히 학습).
open expensiveItems for tempItem with preparedStatement;
이 방식으로 문자열에서 SQL 문을 작성하는 것은 SQL에 능숙한 프로그래머를 위한 고급 기술입니다. EGL은 설계 시 SQL 문이 정확한지 확인하지 않으므로 런타임 시 문자열이 올바른 SQL 문으로 해석되는지 확인해야 합니다. 다음은 prepared 문을 사용하여 작업할 때 일반적으로 발생하는 실수 목록입니다.
tempItem Item; maxPrice Price = 500; selectStatement STRING = "select * from EGL.ITEM where EGL.ITEM.PRICE >= :maxPrice"; prepare preparedStatement from selectStatement for tempItem;이 경우, 실제 SQL 문은 :maxPrice 문자열을 호스트 변수로 사용하여 maxPrice 변수의 값으로 바꾸지 않고 있는 그대로를 포함합니다. 결과적으로 잘못된 SQL 문이 생성됩니다.
tempItem Item; maxPrice Price = 500; selectStatement STRING = "select * from EGL.ITEM where EGL.ITEM.PRICE >= " :: maxPrice; prepare preparedStatement from selectStatement for tempItem;이 경우, EGL이 문자열을 작성할 때 maxPrice 변수의 값이 해석되어 다음 SQL 문이 작성됩니다.
select * from EGL.ITEM where EGL.ITEM.PRICE >= 500나중에 prepared 문에서 변수를 사용하는 방법의 대안에 대해 설명할 것입니다.
incorrectSQL STRING; incorrectSQL = "select * from EGL.ITEM where"; incorrectSQL ::= "EGL.ITEM.PRICE >= :maxPrice"; incorrectSQL ::= "order by EGL.ITEM.PRICE";이 예제는 다음과 같은 잘못된 SQL 문을 생성합니다.
select * from EGL.ITEM whereEGL.ITEM.PRICE >= :maxPriceorder by EGL.ITEM.PRICE이 명령문은 WHERE 뒤와 ORDER BY 앞에 공백이 필요합니다.
명시적 SQL과 같이 prepared SQL 문은 함께 사용되는 EGL 문에 적합해야 합니다. 예를 들어, EGL get 및 open 문은 결과 세트를 예상합니다. 이 명령문 중 하나와 함께 prepared 문을 사용하려면 SQL 코드가 결과 세트를 리턴해야 합니다. 이러한 이유로 인해 SQL INSERT 또는 DELETE 문을 준비하여 해당 명령문을 get 또는 open과 사용할 수 없습니다.
이 학습에서는 하나 또는 둘 모두가 널(null)이 될 수 있는 두 개의 매개변수를 승인하도록 이전 학습에서 작성한 프로그램을 변경할 것입니다. 함수는 널(null)이 아닌 매개변수를 기반으로 조회를 작성하여 특정 가격 범위의 항목을 리턴합니다.
Completed query: select * from EGL.ITEM where EGL.ITEM.PRICE between 50.00 and 500.00 order by EGL.ITEM.PRICE Serial Mouse Great little mouse. All kinds'a applications. $65.22 Keyboard Got QWERTY? If not, go get this awesome flat keyboard. $78.99 Watch Keep time - and look rakish! $99.01 Shredder Don't let that politically-sensitive document fall into the wrong hands! $198.99 Combination Safe Keep your valuables safe and secure. Put 'em in here. $222.22다음 예제에서와 같이 매개변수 값을 편집하여 널 값을 포함하는 다른 범위를 시도할 수 있습니다.
function main()
minPrice, maxPrice Price?;
minPrice = 500;
maxPrice = null;
try
printItemRange(minPrice, maxPrice);
onException(exception SQLException)
handleDBException(exception);
end
end
500과 널 값을 전달하면 다음과 같은 결과가 발생합니다. Completed query: select * from EGL.ITEM where EGL.ITEM.PRICE >= 500.00 order by EGL.ITEM.PRICE Desktop PC Lots'a power, at the right price. Includes monitor. $888.55 Laptop PC Great little machine. Take it anywhere with you. $1111.11
selectItems.egl 파일의 전체 코드가 생성되었습니다. 파일에 빨간색 X 기호로 표시된 오류가 나타나면 코드가 학습 4A에서 완성된 selectItems.egl 파일의 코드와 일치하는지 확인하십시오.
이전 예제의 SQL 문은 WHERE절의 변수가 고정되었다는 점에서 한계가 있습니다. 명령문에서 사용할 변수를 알기 전에 prepared 문을 작성할 수도 있습니다. 이 유형의 명령문은 다소 복잡하지만 명령문을 준비한 다음에 세부사항을 입력하려는 경우에는 유연성을 제공할 수 있습니다.
selectStatement STRING = "select * from EGL.ITEM where "; ... selectStatement ::= "EGL.ITEM.PRICE between " :: minPrice :: " and " :: maxPrice :: " ";prepared 문을 작성할 때 명령문에 물음표(?)를 두어 나중에 값을 입력할 것이라는 것을 나타낼 수 있습니다.
selectStatement2 STRING = "select * from EGL.ITEM where " :: "EGL.ITEM.PRICE between ? and ? " :: "order by EGL.ITEM.PRICE"; tempItem Item; prepare preparedStatement2 from selectStatement2 for tempItem;이제, prepared 문에는 두 호스트 변수의 위치가 있으며 BETWEEN절에서 물음표로 표시됩니다. prepared 문을 사용할 준비가 되면 using 문을 사용하여 값을 삽입하십시오. 예를 들어, 5 - 500의 가격이 있는 행을 검색하려면 다음과 같이 리터럴 5와 500을 명령문에 전달하십시오.
open expensiveItems2 for tempItem with preparedStatement2 using 5, 500;물론 다음과 같이 using 키워드와 함께 변수를 사용할 수도 있습니다.
open expensiveItems2 for tempItem with preparedStatement2 using minPrice, maxPrice;
function printRanges()
tempItem Item;
selectStatement string = "select * from EGL.ITEM where " ::
"EGL.ITEM.PRICE between ? and ? " ::
"order by EGL.ITEM.PRICE";
prepare preparedStatement from selectStatement for tempItem;
SysLib.writeStdout("\nPrinting values between 0 and 200");
open expensiveItems for tempItem with preparedStatement using 0, 200;
forEach(tempItem)
SysLib.writeStdout(tempItem.Name :: " " :: tempItem.Description ::
" $" :: tempItem.Price);
end
SysLib.writeStdout("\nPrinting values between 200 and 500");
open expensiveItems for tempItem with preparedStatement using 200, 500;
forEach(tempItem)
SysLib.writeStdout(tempItem.Name :: " " :: tempItem.Description ::
" $" :: tempItem.Price);
end
SysLib.writeStdout("\nPrinting values between 500 and 1,000");
open expensiveItems for tempItem with preparedStatement
using 500, 1000;
forEach(tempItem)
SysLib.writeStdout(tempItem.Name :: " " :: tempItem.Description ::
" $" :: tempItem.Price);
end
end
이 방식으로 호스트 변수를 사용하면 각 경우의 명령문을 수정하는 대신 단일 prepared 문을 사용하여 이전 섹션에서 프로그램을 다시 쓸 수 있습니다.
올바른 prepared 문을 작성하는 것은 복잡할 수 있습니다. 하지만 그 결과로 생성된 명령문은 명시적 SQL 문으로 하드 코딩된 명령문보다 더 유연합니다. 이후의 학습에서는 다른 방식으로 SQL 문을 사용자 정의할 수 있는, SQLRecord 파트의 기본 SQL 코드 설정에 대해 설명합니다.