Столкнулся с такой проблемой: необходимо выполнить с помощью 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, то на деревьях вырастут булки, и обратно в строке выдачу переменной наружу производить не придется, типа она автоматом обновится. но чудес не случилось: