Что такое динамический SQL?
Динамический SQL - это методология программирования для создания и выполнения операторов во время выполнения. Он в основном используется для написания универсальных и гибких программ, в которых операторы SQL будут создаваться и выполняться во время выполнения в зависимости от требований.
В этом руководстве вы узнаете:
- Способы написания динамического SQL
- NDS (собственный динамический SQL) - немедленное выполнение
- DBMS_SQL для динамического SQL
Способы написания динамического SQL
PL / SQL предоставляет два способа написания динамического SQL
- NDS - собственный динамический SQL
- DBMS_SQL
NDS (собственный динамический SQL) - немедленное выполнение
Собственный динамический SQL - это более простой способ написать динамический SQL. Он использует команду EXECUTE IMMEDIATE для создания и выполнения SQL во время выполнения. Но чтобы использовать этот способ, тип данных и количество переменных, которые будут использоваться во время выполнения, должны быть известны заранее. Он также обеспечивает лучшую производительность и меньшую сложность по сравнению с DBMS_SQL.
Синтаксис
EXECUTE IMMEDIATE()[INTO ][USING ]
- Приведенный выше синтаксис показывает команду EXECUTE IMMEDIATE.
- Предложение INTO является необязательным и используется только в том случае, если динамический SQL содержит оператор выбора, который выбирает значения. Тип переменной должен соответствовать типу переменной оператора select.
- Предложение USING является необязательным и используется только в том случае, если динамический SQL содержит какую-либо переменную связывания.
Пример 1 : В этом примере мы собираемся получить данные из таблицы emp для emp_no '1001' с помощью оператора NDS.
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 : Создание SQL во время выполнения. SQL содержит переменную связывания, в которой условие ': empno'.
- Строка кода 9 : Выполнение текста SQL в рамке (что выполняется в строке кода 8) с помощью команды NDS 'EXECUTE IMMEDIATE'
- Переменные в предложении INTO (lv_emp_name, ln_emp_no, ln_salary, ln_manager) используются для хранения значений, полученных из запроса SQL (emp_name, emp_no, salary, manager)
- Предложение USING передает значения переменной связывания в запросе SQL (: emp_no).
- Строка кода 10-13 : Отображение выбранных значений.
DBMS_SQL для динамического SQL
PL / SQL предоставляет пакет DBMS_SQL, который позволяет вам работать с динамическим SQL. Процесс создания и выполнения динамического SQL состоит из следующего процесса.
- ОТКРЫТЫЙ КУРСОР : динамический SQL будет выполняться так же, как и курсор. Итак, чтобы выполнить оператор SQL, мы должны открыть курсор.
- PARSE SQL : Следующим шагом является анализ динамического SQL. Этот процесс просто проверит синтаксис и сохранит готовность запроса к выполнению.
- Значения BIND VARIABLE : Следующим шагом является присвоение значений для переменных связывания, если они есть.
- DEFINE COLUMN : Следующим шагом является определение столбца, используя их относительные положения в операторе select.
- ВЫПОЛНИТЬ : следующий шаг - выполнить проанализированный запрос.
- ПОЛУЧИТЬ ЗНАЧЕНИЯ : Следующим шагом является получение выполненных значений.
- ЗАКРЫТЬ КУРСОР : после получения результатов курсор должен быть закрыт.
Пример 1 : В этом примере мы собираемся получить данные из таблицы emp для emp_no '1001' с помощью оператора DBMS_SQL.
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 : Обрамление оператора SQL.
- Строка кода 11 : Открытие курсора с помощью DBMS_SQL.OPEN_CURSOR. Он вернет идентификатор открытого курсора.
- Строка кода 12 : после открытия курсора выполняется синтаксический анализ SQL.
- Строка кода 13 : переменная привязки «1001» присваивается идентификатору курсора вместо «: empno».
- Строка кода 14-17 : определение имени столбца на основе их относительного положения в операторе SQL. В нашем случае относительная позиция: (1) emp_name, (2) emp_no (3) зарплата (4) менеджер. Итак, на основе этой позиции мы определяем целевую переменную.
- Строка кода 18 : Выполнение запроса с использованием DBMS_SQL.EXECUTE. Возвращает количество обработанных записей.
- Строка кода 19-33 : выборка записей с использованием цикла и их отображение.
- Строка кода 20: DBMS_SQL.FETCH_ROWS извлечет одну запись из обработанных строк. Его можно вызывать повторно, чтобы получить все строки. Если он не может получить строки, он вернет 0, таким образом выйдя из цикла.
Резюме
В этом разделе мы обсудили динамический SQL и способы выполнения ДИНАМИЧЕСКОГО SQL. Мы также видели разные этапы выполнения динамического SQL обоими способами. Мы также видели примеры, в которых один и тот же сценарий обрабатывается как в NDS, так и в DBMS_SQL для выполнения во время выполнения.