17.09.2014


Oracle. Execute Immediate, передача и возврат переменных в unnamed block PL/SQL.


Категории: PL/SQL — Administrator

Столкнулся с такой проблемой: необходимо выполнить с помощью Dynamic SQL блок кода (не SQL-предложение) с заранее неизвестным содержимым и получить наружу результат. Явного примера в документации не нашел, после небольших упражнений получилось примерно вот что:

DECLARE
  varIn  NUMBER := 2;
  varOut NUMBER;
BEGIN
  EXECUTE IMMEDIATE '
DECLARE
  var NUMBER;
BEGIN
  var := :1;
  var := 2 * var;
  :2 := var;
END;
' USING IN varIn, OUT varOut;
  Raise_application_error(-20666,'Out variable : [' || varOut || ']');	
END;  

Результат выполнения в PL/SQL Developer выглядит примерно вот так:



Если посмотреть на пример, то можно увидеть, где в строке происходит передача (присвоение) переменной varIn, это:

var := :1;

Если посмотреть на примеры в документации, то вместо :1 можно поставить переменную с любым названием, лишь бы перед ней было двоеточие, что подразумевает параметр.
Наружу значение передается с помощью присвоения параметру внутренней переменной:

:2 := var;

Основная тонкость заключается в ключевом слове USING, переменные, которые передаются и получаются должны следовать через запятую в том порядке, как они записаны в строке выполнения, ключевые слова IN и OUT описывают типы переменных (входная или выходная).

В документации я обнаружил конструкцию IN OUT для передаваемой переменной, вроде бы я уже взрослый человек, но все равно захотелось чудес, и мне показалось, что если я передам в строку выполнения переменную типа IN OUT, то на деревьях вырастут булки, и обратно в строке выдачу переменной наружу производить не придется, типа она автоматом обновится. но чудес не случилось:





Календарь


Архив