Водич за динамички СКЛ за Орацле ПЛ / СКЛ: Извршите тренутно & амп; ДБМС_СКЛ

Преглед садржаја:

Anonim

Шта је Динамиц СКЛ?

Динамиц СКЛ је програмска методологија за генерисање и покретање израза током извођења. Углавном се користи за писање општих и флексибилних програма у којима ће се СКЛ изрази креирати и извршавати током извођења на основу захтева.

У овом упутству ћете научити-

  • Начини писања динамичког СКЛ-а
  • НДС (Нативе Динамиц СКЛ) - извршава одмах
  • ДБМС_СКЛ за Динамиц СКЛ

Начини писања динамичког СКЛ-а

ПЛ / СКЛ пружа два начина за писање динамичког СКЛ-а

  1. НДС - Изворни динамички СКЛ
  2. ДБМС_СКЛ

НДС (Нативе Динамиц СКЛ) - извршава одмах

Изворни динамички СКЛ је лакши начин писања динамичког СКЛ-а. Користи наредбу 'ЕКСЕЦУТЕ ИММЕДИАТЕ' за креирање и извршавање СКЛ-а током извршавања. Али да бисмо користили овај начин, тип података и број променљиве који ће се користити у време извођења морају бити познати пре. Такође даје боље перформансе и мање сложености у поређењу са ДБМС_СКЛ.

Синтакса

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, излазећи тако из петље.

Резиме

У овом одељку смо разговарали о динамичком СКЛ-у и начинима извршавања ДИНАМИЦ СКЛ-а. Такође смо видели различите кораке у извршавању динамичког СКЛ-а на оба начина. Такође смо видели примере у којима се исти сценарио обрађује и на НДС и на ДБМС_СКЛ начине да би се извршило извршавање током извођења.