Шта је Динамиц СКЛ?
Динамиц СКЛ је програмска методологија за генерисање и покретање израза током извођења. Углавном се користи за писање општих и флексибилних програма у којима ће се СКЛ изрази креирати и извршавати током извођења на основу захтева.
У овом упутству ћете научити-
- Начини писања динамичког СКЛ-а
- НДС (Нативе Динамиц СКЛ) - извршава одмах
- ДБМС_СКЛ за Динамиц СКЛ
Начини писања динамичког СКЛ-а
ПЛ / СКЛ пружа два начина за писање динамичког СКЛ-а
- НДС - Изворни динамички СКЛ
- ДБМС_СКЛ
НДС (Нативе Динамиц СКЛ) - извршава одмах
Изворни динамички СКЛ је лакши начин писања динамичког СКЛ-а. Користи наредбу 'ЕКСЕЦУТЕ ИММЕДИАТЕ' за креирање и извршавање СКЛ-а током извршавања. Али да бисмо користили овај начин, тип података и број променљиве који ће се користити у време извођења морају бити познати пре. Такође даје боље перформансе и мање сложености у поређењу са ДБМС_СКЛ.
Синтакса
EXECUTE IMMEDIATE()[INTO ][USING ]
- Горња синтакса приказује наредбу ЕКСЕЦУТЕ ИММЕДИАТЕ.
- Клаузула ИНТО није обавезна и користи се само ако динамички СКЛ садржи наредбу селецт која преузима вредности. Тип променљиве треба да се подудара са типом променљиве израза селецт.
- Клаузула УСИНГ није обавезна и користи се само ако динамички СКЛ садржи било коју променљиву везивања.
Пример 1 : У овом примеру ћемо дохватити податке из емп табеле за емп_но '1001' помоћу НДС израза.
DECLARElv_sql VARCHAR2(500);lv_emp_name VARCHAR2(50):ln_emp_no NUMBER;ln_salary NUMBER;ln_manager NUMBER;BEGINly_sql:=;SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_no=:empmo:;EXECUTE IMMEDIATE lv_sql INTO lv_emp_name,ln_emp_no:ln_salary,ln_managerUSING 1001;Dbms_output.put_line('Employee Name:‘||lv_emp_name);Dbms_output.put_line('Employee Number:‘||ln_emp_no);Dbms_output.put_line(‘Salary:'||ln_salaiy);Dbms_output.put_line('Manager ID:‘||ln_manager);END;/
Оутпут
Employee Name : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000
Објашњење кода:
- Линија кода 2-6 : Декларисање променљивих.
- Редак кода 8 : Уоквиривање СКЛ-а током извођења. СКЛ садржи променљиву везања у услову вхере ': емпно'.
- Редак 9 кода : Извршење уоквиреног СКЛ текста (што се изводи у линији кода 8) помоћу НДС наредбе „ИЗВРШИ ИМЕДИЈАТ“
- Варијабле у клаузули 'ИНТО' (лв_емп_наме, лн_емп_но, лн_салари, лн_манагер) користе се за задржавање преузетих вредности из СКЛ упита (емп_наме, емп_но, плата, менаџер)
- Клаузула 'УСИНГ' даје вредности променљивој везивања у СКЛ упиту (: емп_но).
- Редак кода 10-13 : Приказ преузетих вредности.
ДБМС_СКЛ за Динамиц СКЛ
ПЛ / СКЛ пружа пакет ДБМС_СКЛ који вам омогућава рад са динамичким СКЛ-ом. Процес креирања и извршавања динамичког СКЛ-а садржи следећи процес.
- ОТВОРЕНИ КУРСОР : Динамички СКЛ ће се извршавати на исти начин као и курсор. Дакле, да бисмо извршили СКЛ наредбу, морамо отворити курсор.
- ПАРСЕ СКЛ : Следећи корак је рашчлањивање динамичког СКЛ-а. Овај процес ће само проверити синтаксу и одржати упит спреман за извршење.
- ВАРИЈАБИЛЕ ВЕЗА Вредности : Следећи корак је додељивање вредности за променљиве везивања ако постоје.
- ДЕФИНИРАЈ КОЛОНУ : Следећи корак је дефинисање колоне помоћу њихових релативних положаја у наредби за одабир.
- ИЗВРШИ : Следећи корак је извршавање рашчлањеног упита.
- ФЕТЦХ ВАЛУЕС : Следећи корак је преузимање извршених вредности.
- ЗАТВОРИ КУРСОР : Када се преузму резултати, курсор треба да се затвори.
Пример 1 : У овом примеру ћемо дохватити податке из емп табеле за емп_но '1001' помоћу ДБМС_СКЛ наредбе.
DECLARElv_sql VARCHAR2(500);lv_emp_name VARCHAR2(50);ln_emp_no NUMBER;ln_salary NUMBER;ln_manager NUMBER;ln_cursor_id NUMBER;ln_rows_processed;BEGINlv_sql:=‘SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_no=:empmo’;in_cursor_id:=DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(ln_cursor_id,lv_sql,DBMS_SQL.NATIVE);DBMS_SQL.BIXD_VARLABLE(ln_cursor_id:‘empno‘,1001);DBMS_SQL.DEFINE_COLUMN(ln_cursor_ici,1,ln_emp_name);DBMS_SQL.DEFINE_COLUMN(ln_cursor_id,2,ln_emp_no);DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,3,ln_salary);DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,4,ln_manager);ln_rows__processed:=DBMS_SQL.EXECUTE(ln_cursor_id);
LOOPIF DBMS_SQL.FETCH_ROWS(ln_cursor_id)=0THENEXIT;ELSEDBMS_SQL.COLUMN_VALUE(ln_cursor_id,1,lv_emp_name);DBMS_SQL.COLUMN_VALUE(ln_cursor_id,2,ln_emp_no);DBMS_SQL.COLUMN_VALUE(ln_cursor_id,3,In_salary);DBMS_SQL.COLUMN_VALUE(ln_cursor_id,4,In_manager);Dbms_output.put_line('Employee Name:‘||lv_emp_name);Dbms_output.put_line('Employee Number:l‘||ln_emp_no);Dbms_output.put_line(‘Salary:‘||ln_salary);Dbms_output.put_line('Manager ID :‘| ln_manager);END IF;END LOOP;DBMS_SQL.CLOSE_ClIRSOR(ln_cursor_id);END:/
Оутпут
Employee Name:XXXEmployee Number:1001Salary:15000Manager ID:1000
Објашњење кода:
- Редак 1-9 : Декларација променљиве.
- Редак кода 10 : Уоквиривање СКЛ израза.
- Линија 11 : Отварање курсора помоћу ДБМС_СКЛ.ОПЕН_ЦУРСОР. Вратит ће се ид курсора који је отворен.
- Редак кода 12 : Након отварања курсора, СКЛ се рашчлањује.
- Редак кода 13 : Променљива везивања '1001' додељује се ИД-у курсора уместо ': емпно'.
- Редак 14-17 : Дефинисање назива колоне на основу њиховог релативног положаја у СКЛ изразу. У нашем случају, релативни положај је (1) емп_наме, (2) емп_но (3) плата (4) менаџер. Дакле, на основу ове позиције дефинишемо циљну променљиву.
- Редак кода 18 : Извршење упита помоћу ДБМС_СКЛ.ЕКСЕЦУТЕ. Враћа број обрађених записа.
- Линија кода 19-33 : Дохваћање записа помоћу петље и приказивање истих.
- Редак кода 20: ДБМС_СКЛ.ФЕТЦХ_РОВС ће дохватити један запис из обрађених редова. Може се позивати више пута да преузме све редове. Ако не може да преузме редове, вратиће 0, излазећи тако из петље.
Резиме
У овом одељку смо разговарали о динамичком СКЛ-у и начинима извршавања ДИНАМИЦ СКЛ-а. Такође смо видели различите кораке у извршавању динамичког СКЛ-а на оба начина. Такође смо видели примере у којима се исти сценарио обрађује и на НДС и на ДБМС_СКЛ начине да би се извршило извршавање током извођења.