9 янв. 2015 г.

Новые возможности в динамическом SQL в Oracle 12c (определение схемы по умолчанию)

Следующая новая возможность в динамическом SQL тоже связана с процедурой PARSE пакета DBMS_SQL.
До Oracle Database 12c, если в тексте запроса или анонимного PL/SQL-блока в имени объекта не была явна указана схема, то будет использована текущая схема.
Для программных единиц PL/SQL (пакетов, процедур, функций и т.д.) созданных с правами создателя, это будет схема в которой происходила компиляция, для созданных с правами вызывающего - схема пользователя, под которым происходит вызов динамического SQL.

Начиная с Oracle Database 12c, можно четко контролировать схему в имени объекта, для которых она была не указана в динамическом SQL:
[oracle@rac1 ~]$ sqlplus rscott/rtiger

SQL*Plus: Release 12.1.0.2.0 Production on Fri Jan 9 16:24:34 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management options

SQL> create or replace package body account_service as

  procedure deleteAccount(v_pId in number) is
    v_xCursor    integer;
    v_xRowCount  integer;
    v_xPLSQL_Str varchar2(1600);
  begin
    v_xPLSQL_Str := 'delete from accounts where id = :v_pId';

    v_xCursor := dbms_sql.open_cursor;
  
    dbms_sql.parse(c                  => v_xCursor,
                   statement          => v_xPLSQL_Str,
                   language_flag      => DBMS_SQL.NATIVE,
                   schema             => 'DATA_OWNER');
    dbms_sql.bind_variable(v_xCursor, ':v_pId', v_pId);       

    v_xRowCount := dbms_sql.execute(c => v_xCursor);

    dbms_sql.close_cursor(c => v_xCursor);    
  end;

end;
/

Package body created.
Важно отметить, что параметр SCHEMA в процедуре PARSE отвечает лишь за имя схемы, в которой происходит поиск объекта при парсинге. Выполнение динамического SQL происходит с правами той программной единицы PL/SQL, в которой происходит вызов пакета DBMS_SQL - с правами создателя, либо с правами вызывающего.

Комментариев нет:

Отправить комментарий