Zapytania SQL’a w programach CL – RUNSQL
Zdarza się, że potrzebujemy uruchomić zapytanie SQL’a wprost z programu w języku CL. Choćby po to by utworzyć tymczasowy plik roboczy w bibliotece QTEMP.
Oczywiście moglibyśmy użyć programu RPG z wbudowanym SQL’em, lub wykorzystać komendę RUNSQLSTM ale po co zadawać sobie aż tyle trudu by uruchomić proste zapytanie. IBM wyszedł naprzeciw naszym oczekiwaniom i od wersji systemu 6.1 mamy możliwość korzystania z nowej komendy nazwanej RUNSQL.
W wersji OS’a 7.1 musimy posiadać DB2 PTF Group SF99701 na poziomie 14 lub wyższym a dla wersji 6.1 DB2 PTF Group SF99601 poziom 25.
Poniższy przykład prezentuje wspomniane już wykorzystanie komendy do utworzenia pliku bazy danych w bibliotece QTEMP.
PGM
RUNSQL SQL('Drop table QTEMP/TEST_DB') +
COMMIT(*NONE)
MONMSG MSGID(SQL9010)
RUNSQL SQL('Create table QTEMP/TEST_DB as +
(select USER, NAME +
from TEST_PF +
where USER = ''Szymon'') +
with data') +
COMMIT(*NONE)
ENDPGM
Pierwsze użycie komendy RUNSQL wywołuje komendę SQL’a DROP TABLE służącą do usunięcia zbioru z biblioteki QTEMP. Ponieważ nie stosuję zatwierdzania transakcji parametr COMMIT w komendach ustawiony jest na wartość *NONE. Jeśli wystąpi błąd – plik o podanej nazwie nie istnieje w bibliotece – monitorujemy go za pomocą komunikatu SQL9010. Drugie użycie komendy RUNSQL tworzy plik bazy danych za pomocą wyrażenia CREATE TABLE.
Drugi z przykładów ilustruje możliwość użycia zmiennych w wyrażeniu SQL-a komendy RUNSQL.
PGM
DCL VAR(&VALUE) TYPE(*CHAR) LEN(10) VALUE('TEST')
DCL VAR(&PARM) TYPE(*CHAR) LEN(100)
RUNSQL SQL('Insert into QTEMP/TEST_DB +
values(''' *CAT &VALUE *BCAT ''', +
''ABC'')') +
COMMIT(*NONE)
CHGVAR VAR(&PARM) +
VALUE('Delete from TEST_DB +
where USER = ''' *CAT &VALUE *BCAT +
''' ')
RUNSQL SQL(&PARM) COMMIT(*NONE)
ENDPGM
Możemy wykorzystać użycie zmiennych na dwa sposoby. Umieszczając je bezpośrednio w wyrażeniu SQL’a lub tworząc zmienną która będzie przechowywać całą treść zapytania i podstawiając ją do komendy RUNQSL.
Nie wszystkie wyrażenia SQL-a można uruchomić za pomocą nowej komendy, ale jej przydatność nie ulega wątpliwości. Po szczegóły odsyłam na strony IBM’a.
