Вмъкване на DML с променлива за свързване:Защо?
Да преминем към преследването! Двете най-големи предимства на свързващите променливи са сигурността срещу SQL инжекции и подобряване на производителността чрез намаляване на твърдия анализ. Поради тези предимства, използването на променливи за свързване във вашия код не само се препоръчва, но и се препоръчва.
Няма ли да бъде черешката на тортата, ако можем да измислим начин да използваме Bind Variables с Native Dynamic SQL? Ако се чудите, скъпи приятели, вие сте на правилното място, тъй като ще направим точно това в този блог.
Какво е свързваща променлива?
Можем да дефинираме променлива за свързване като променливата, която създаваме в SQL*Plus и след това препращаме в PL/SQL. Освен това можем да декларираме Bind променлива навсякъде в средата на хоста. Следователно свързващите променливи са известни също като хост променлива.
Можете да прочетете повече за свързващите променливи в PL/SQL урок 6 тук.
Как да използвам променлива за свързване с Native Dynamic SQL?
За да използваме променлива за свързване в динамичен SQL, трябва да използваме помощта на „Използване на клауза ” на Изпълнение на незабавно изявление.
Какво е това Using Clause of Execute Immediate statement?
В статичен SQL трябваше да посочим стойността за свързваща променлива след изпълнение на програмата PL/SQL. Докато в Dynamic SQL трябва да споменем предварително стойностите за всички променливи за свързване. Същите, които се използват в SQL израза, който желаем да изпълняваме динамично с помощта на Execute Immediate.
Следователно, за да посочим стойностите за всички променливи за свързване, ние използваме клаузата USING на Изпълнение на непосредствена инструкция. Чрез прилагането на клаузата „USING“ ние изброяваме всички стойности за всяка променлива за свързване, използвана в SQL израза, която желаем да изпълняваме динамично.
Сега, след като научихме какво представляват променливите за свързване и използването на клауза за изпълнение на непосредствена инструкция, нека направим пример.
Пример за изпълнение незабавно с клауза за използване
За демонстрация ще вмъкнем данните в таблица. И за това ще използваме оператора Execute Immediate. Освен това, за да подобрим сигурността и производителността, ще използваме променлива за свързване с Insert DML.
За да направим това, първо ще ни трябва таблица, в която можем да вмъкнем данните. Затова нека бързо да създадем такъв. И както винаги ще поддържам кода възможно най-прост за лесно разбиране на концепцията.
Стъпка 1:Създайте таблица
CREATE TABLE stu_info( student_name VARCHAR2 (20) );
Стъпка 2:Подгответе DML изявление
Добра практика за програмиране е предварително да подготвите своя SQL оператор, който желаете да изпълните, като използвате execute immediate. По този начин ще намалите шансовете за синтактични грешки.
Ограничението за писане на DML за Execute Immediate ще остане същото като това за DDL израза. Подобно на DDL израза, DML изразът не трябва да завършва с точка и запетая. Следователно, имайки предвид това, нека напишем изявлението INSERT.
INSERT INTO stu_info (student_name) VALUES (:stu_name)
В стандартния INSERT DML обикновено записваме данните в клаузата за стойности в скоби. Освен това при изпълнение тези данни ще бъдат вмъкнати в съответната колона. Но както можете да видите, тук сме използвали променлива за свързване „:stu_name“ вместо твърдо кодиране на конкретна стойност за вмъкване в таблицата.
Стъпка 3:Напишете PL/SQL код
Последната стъпка в цикъла е да изпълните INSERT DML с променлива за свързване чрез прилагане на клауза USING на Изпълняване на незабавен израз на Native Dynamic SQL.
SET SERVEROUTPUT ON; DECLARE sql_smt VARCHAR2 (150); BEGIN sql_smt := 'INSERT INTO stu_info (student_name) VALUES (:stu_name)'; EXECUTE IMMEDIATE sql_smt USING 'Steve'; END; /
Нека разберем какво ще се случи при изпълнение на този PL/SQL блок. Когато изпълните тази програма, PL/SQL машината ще замени тази стойност „Steve“ на мястото на свързваща променлива :stu_name и след това ще изпълни INSERT DML, който ще вмъкне тази стойност в споменатата таблица.
Освен това има няколко неща, за които трябва да се погрижите, докато пишете горната PL/SQL програма от своя страна.
- Уверете се, че сте поставили INSERT DML или произволен SQL израз, който искате да изпълните с помощта на Execute Immediate, в двойка единични кавички. Също така, не забравяйте да завършите оператора за присвояване (ред 5), както и оператора Execute Immediate с точка и запетая.
- Стойността, която присвоявате на вашата свързваща променлива чрез клаузата USING, трябва или да е същата, или да е съвместима с типа данни на колоната на таблицата, в която я вмъквате. Например в нашия случай вмъкваме името „Стив“, което е низ от знаци в колоната student_name на таблицата stu_info, която е от тип данни Varchar2. Типът на символните данни е много съвместим с типа данни Varchar2.
Чрез тази програма научихме две много важни неща.
- Как да използвате INSERT DML с Execute Immediate на Dynamic SQL и
- Как да приложим клауза USING за присвояване на стойности на променливата за свързване, използвана в SQL заявката, която желаем да изпълняваме динамично.
Освен това, не забравяйте да проверите видеоклипа, тъй като там съм обсъдил как да се справя с грешката „ORA-01008:Not All Variables Bound“. Обзалагам се, че не искате да пропуснете решението на тази грешка, тъй като е много важно от гледна точка на сертифицирането на база данни на Oracle.
Освен това, следете информацията, тъй като в следващия урок ще научим как да се справяме с множество променливи за свързване, като приложим клауза Using на execute immediate в Oracle Database.
Надяваме се, че сте научили нещо ценно от този блог. Междувременно, моля, споделете го с приятелите си във вашия Facebook, Twitter, WhatsApp или всяка среда, която намирате за удобна. Освен това се абонирайте за моя канал в YouTube за още бързи и интересни уроци. Благодаря и приятен ден!