Oracle SQL

Фильтр по тегу: execute immediate


Динамический SQL в ORACLE (часть 4 - Фишки, секреты и типичные ошибки)

Чалышев М.М www.orasource.ru ; резюме автора
изучаем SQL группа в контакте - присоединяйтесь

Подари, продай, обменяй - множество недорогих и отличных вещей: объявления вместо AVITO - ВКонтакте

В этом разделе показано, как в использовать динамический SQL и избежать некоторых распространенных ошибок.
Повышение производительности

В приведенном ниже примере, Oracle открывает различные курсоры для каждого отдельного значения emp_id . Это может привести к конфликту ресурсов и резкой потере производительности.
  CREATE PROCEDURE fire_employee (emp_id NUMBER) AS
BEGIN
   EXECUTE IMMEDIATE
      'DELETE FROM emp WHERE empno = ' || TO_CHAR(emp_id);
END;


Чтобы избежать данной ошибки можно использовать связанные переменные, как показано ниже. Это позволяет повторно использовать Oracle один и тот же курсор для различных значений emp_id .
CREATE PROCEDURE fire_employee (emp_id NUMBER) AS
BEGIN
   EXECUTE IMMEDIATE
      'DELETE FROM emp WHERE empno = :num' USING emp_id;
END;


читать дальше...
добавлено: 09 сен 13 просмотры: 9640, комментарии: 2



Динамический SQL в Oracle - легко и понятно (часть третья - BULK, операции с множествами)

Чалышев М.М www.orasource.ru изучаем SQL группа в контакте - присоединяйтесь

Использование множеств при работе с динамическим SQL

Работа со сложными типами данных BULK– массивами и коллекциями повышает производительность за счет минимизации количества переключений контекста между PL / SQL и SQL. То есть целые коллекции, а не только отдельные элементы, передаются туда и обратно.

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

Синтаксис
BULK FETCH statement
BULK EXECUTE IMMEDIATE statement
FORALL statement
COLLECT INTO clause
RETURNING INTO clause
%BULK_ROWCOUNT cursor attribute

Синтаксис для динамического связывания с использованием инструкции BULK

Инструкция BULK позволяет Oracle работать переменной в SQL , так , чтобы обрабатывать множества значений. Тип множества может быть любой допустимы в PL / SQL (индекс-таблицы, вложенные таблицы, и массивы переменного размера). Однако элементы должны иметь строго заданный тип данных SQL, CHAR , DATE или NUMBER . Динамические коллекции могут применяться в командах: EXECUTE IMMEDIATE , FETCH и FORALL .

EXECUTE IMMEDIATE и BULK

Эти операторы позволяет вам позволяет связывать заданные переменные или OUT аргументы и передавать их, как параметры, для динамического оператора SQL. Синтаксис имеет следующий вид:
EXECUTE IMMEDIATE dynamic_string
   [[BULK COLLECT] INTO define_variable[, define_variable ...]]
   [USING bind_argument[, bind_argument ...]]
   [{RETURNING | RETURN} 
   BULK COLLECT INTO bind_argument[, bind_argument ...]];

Благодаря инструкции BULK можно возвращать данные в коллекции из динамического SQL.
читать дальше...
добавлено: 08 сен 13 просмотры: 8626, комментарии: 0



Использование динамического SQL - легко и понятно (часть первая EXECUTE IMMEDIATE)

Чалышев М.М www.orasource.ru изучаем SQL группа в контакте - присоединяйтесь


Динамический SQL. Часть первая
В некоторых задачах требуется использование динамических запросов. Это случается , когда мы заранее не знаем какой нам нужен SQL запрос, какие обьекты будут использоваться для получения данных.

Подобные задачи, иногда возникают при построении сложной банковской, бухгалтерской отчетности, а также в моделях данных - обьект, атрибут , связь, при формировании динамических разнородных списков, в задачах миграции и интеграции .

Так же динамический SQL незаменим в случаях ,когда требуется назначить или изменить для определённого пользователя права или привилегии, или роли, или для изменения параметров сессии

Ключевое отличие динамического sql от статического , в том, что команда динамического SQL строится непосредственно во время выполнения процедуры или функции PL/SQL.

Таким образом, команда динамического SQL - это , построенная во время выполнения программы строка SQL запроса , так же такая строка может быть использована во время выполнения анонимного PLSQL блока.
читать дальше...
добавлено: 06 сен 13 просмотры: 59697, комментарии: 3



Oracle экранируем кавычки или Волшебный Ку

В Oracle операторах, в которых требуется передача запроса в качестве текстовой строки
иногда в тексте sql строки требуется передать символ кавычек
обычно это взывает недоумение интерпретатора запросов oracle
для этого используется оператор Oracle - q
рассмотрим несколько примеров
например фраза I'm О’Коннор
Подари, продай, обменяй - множество недорогих и отличных вещей: объявления вместо AVITO - ВКонтакте

скрипт

   SET serveroutput ON
   begin
     DBMS_OUTPUT.PUT_LINE('I'm О’Коннор');
   end;'


вызовет ошибку
для корректного выполнения можно написать следующее

    SET serveroutput ON
    begin
      DBMS_OUTPUT.PUT_LINE('I''m О''Коннор');
    end;


но в больших и сложных зaпросах с большим кол вом текстовых выражений

логичнее было бы использовать оператор экранирования кавычек Q

BEGIN
  dbms_output.put_line(q'[I'm О'Коннор]');
END;


приведем так же некоторые другие интересные примеры

select DBMS_XMLGEN.getxml (q'[select count(ao.OBJECT_TYPE) countOBject, ao.OBJECT_TYPE OT , max(ao.CREATED) maxdtcr
     from all_objects ao where owner='SYS' group by OBJECT_TYPE order by OBJECT_TYPE]') myxml from dual;
execute immediate(q'[insert into q values('qwerty')]'


Чалышев М.М www.orasource.ru
добавлено: 19 окт 12 просмотры: 7138, комментарии: 1