Я нахожусь в ситуации, когда моему коду нужно выполнить динамический оператор, сформированный неизвестным числом (по крайней мере, одним, но может быть больше) других динамических операторов, конкатенированных 'пересечением 'и' union '.Динамическое связывание для динамического запроса в Native Dynamic SQL
Вот пример с тремя querys (я знаю, что это может быть решена с одним запросом, я пытаюсь сохранить его простым):
sql1 varchar2(500) := 'select empno from emp where deptno = :1';
sql2 varchar2(500) := 'select empno from emp where sal > :2 and hiredate >=:3';
sql3 varchar2(500) := 'select empno from emp where sal <= :2 and hiredate =:3'
realStatement varchar(1500) := sql1 || ' insersect ' || sql2 || ' union ' sql3;
Теперь, учитывая, что число вспомогательных утверждений это неизвестно во время выполнения, но известны все значения переменных связывания (т.е. deptno, sal и hiredate всегда будут: 1,: 2 и: 3 соответственно). Я не могу использовать «EXECUTE IMMEDIATE realStatement USING» формы, потому что это привязка позиционные и для этого примера, я должен передать Сала и HireDate параметров дважды, в результате чего в заявлении:
EXECUTE IMMEDIATE realStatement USING l_deptno,l_sal,l_hiredate,l_sal,l_hiredate;
Что нет никакого способа Я мог заранее знать, чтобы включать все повторения для каждого подзаголовка.
Я знаю, что я мог бы использовать пакет DBMS_SQL с функцией bind(), но производительность в 1,5-3 раза хуже, чем с родной динамикой (из oracle docs), и в этом случае производительность имеет значение.
То, что я на самом деле делаю, заменяет все «: 1» вхождения с помощью l_deptno, все «: 2» вхождения с l_sal и все ': 3' вхождения с 'to_date (' '' || l_hiredate || «» «„“DD/MM/YYYY„“)» в строке realStatement перед его выполнением, как это:
realStatement := replace(realStatement,':1',l_deptno);
realStatement := replace(realStatement,':2',l_sal);
realStatement := replace(realStatement,':3','to_date(''' || l_hiredate || ''',''DD/MM/YYYY'')');
EXECUTE IMMEDIATE realStatement;
Но я не уверен, что это лучшее решение, вопросы:
есть способ улучшить производительность или передать привязки динамически с использованием встроенной динамической S QL?
будет использовать результат DBSM_SQL с более высокой производительностью , чем у выбранного решения?
Будет ли 'sql1 varchar2 (500): = 'выбрать empno из emp где deptno =' || : 1 удовлетворяют ваши потребности? –
@ Politank-Z Я забыл упомянуть, что строка запроса восстановлена из таблицы, поэтому ссылка уже существует, плюс она не обязательно будет всегда в конце запроса. – Typo
Где вы краснели о ухудшении производительности для привязки()? –