Динамический SQL, страница 2

         DBMS_SQL.COLUMN_VALUE(v_Cursor, 1, v_Name);

         INSERT INTO Temp_tab (char_col) VALUES(v_Name);

     END LOOP;

     DBMS_SQL.CLOSE_CURSOR(v_Cursor);

     COMMIT;

EXCEPTION

     WHEN  OTHERS  THEN

     DBMS_SQL. CLOSE_CURSOR(v_Cursor);

     RAISE;

END DynaQuery;

2.5. Обработка анонимных блоков PL/SQL

1.  Открытие курсора (OPEN_CURSOR)

2.  Грамматический разбор оператора (PARSE)

3.  Привязка всех входных переменных (BIND_VARIABLE)

4.  Обработка оператора (EXECUTE)

5.  Считывание значений выходных переменных (VARIABLE_VALUE)

6.  Закрытие курсора (CLOSE_CURSOR)


3. Использование внутреннего динамического SQL

·  EXECUTE IMMEDIATE

·  OPENFOR (для запросов, возвращающих более одной строки)

3.1. Обработка операторов, не являющихся запросами, и для блоков PL/SQL

EXECUTE IMMEDIATE строка_символов_sql

[INTO {перемменная[, переменная]…| запись}]

[USING [IN | OUT | IN OUT] аргумент

[,  [IN | OUT | IN OUT] аргумент ]…];

3.1.1. Операторы без переменных привязки

DECLARE

v_SQLString     VARCHAR2(200);

v_PLSQLBlock VARCHAR2(500);

BEGIN

EXECUTE IMMEDIATE ‘CREATE TABLE exe_tab (col1 VARCHAR2(10))’;

FOR  v_Cnt  IN  1..5  LOOP

v_SQLString := ‘INSERT INTO exe_tab VALUES (‘’Row ‘|| v_Cnt || ’’’)’;

EXECUTE IMMEDIATE  v_SQLString;

END LOOP;

v_PLSQLBlock :=

‘BEGIN

FOR v_Rec IN (SELECT * FROM exe_tab) LOOP

DBMS_OUTPUT.PUT_LINE(v_Rec.col1);

END LOOP;

END;’;

EXECUTE IMMEDIATE  v_PLSQLBlock;

EXECUTE IMMEDIATE ‘DROP TABLE exe_tab’;

END;

3.1.2. Операторыспеременнымипривязки

DECLARE

         v_SQLString     VARCHAR2(200);

BEGIN

         v_SQLString :=

                   ‘INSERT INTO cust(cnum,cname,city,rating,snum)

  VALUES(:cn, :cnm, :ct, :rt, :sn)’;

         EXECUTE IMMEDIATE v_SQLString

                   USING  2020,  ‘Tom’,  ‘Berlin’, 100, 1002;

END;

3.2. Обработка запросов

3.2.1. Многострочные запросы

OPENкурсорная_переменнаяFORстрока_символов_sql

[USING  аргумент [, аргумент]… ];

DECLARE

         TYPE t_SalCur IS REF CURSOR;

         v_SalCur     t_SalCur;

         v_Sal             sal%ROWTYPE;

         v_SQLSring  VARCHAR2(200);

BEGIN

         v_SQLSring  :=  ‘SELECT  *  FROM  sal  WHERE  city=’’London’’’;

         OPEN  v_SalCur  FOR  v_SQLSring; 

LOOP

                   FETCH v_SalCUR    INTO  v_Sal;

                   EXIT WHEN  v_SalCur%NOTFOUND;

                   DBMS_OUTPUT.PUT_LINE(‘Fetched sname is ’ || v_Sal.sname);