DBMS_METADATA.GET_DDL не работают внутри ПРОЦЕДУРЫ - PullRequest
0 голосов
/ 10 октября 2019

Я создаю скрипт для копирования таблицы от пользователя DEVBASE:

DECLARE
  YTABLE_NAME   CONSTANT VARCHAR2 (50) := 'TABLE_NAME';
  YRECREATE     CONSTANT BOOLEAN       := FALSE;
--
  XCOMMAND               CLOB;

  FUNCTION TABLE_EXISTS (ZTABLE_NAME IN VARCHAR2)
    RETURN BOOLEAN IS
    XCOUNT   NUMBER;
  BEGIN
    SELECT COUNT (*)
      INTO XCOUNT
      FROM USER_TABLES A
     WHERE A.TABLE_NAME = ZTABLE_NAME;

    RETURN XCOUNT > 0;
  END;
BEGIN
  IF TABLE_EXISTS (YTABLE_NAME) THEN
    IF YRECREATE THEN
      EXECUTE IMMEDIATE 'DROP TABLE ' || YTABLE_NAME || ' CASCADE CONSTRAINTS';
    ELSE
      RAISE_APPLICATION_ERROR (-20000, 'TABLE ' || YTABLE_NAME || ' ALREADY EXISTS');
    END IF;
  END IF;

  DBMS_METADATA.SET_TRANSFORM_PARAM (DBMS_METADATA.SESSION_TRANSFORM, 'SQLTERMINATOR', FALSE);
  DBMS_METADATA.SET_TRANSFORM_PARAM (DBMS_METADATA.SESSION_TRANSFORM, 'PRETTY', FALSE);
  DBMS_METADATA.SET_TRANSFORM_PARAM (DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE);
  DBMS_METADATA.SET_TRANSFORM_PARAM (DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE);
  DBMS_METADATA.SET_TRANSFORM_PARAM (DBMS_METADATA.SESSION_TRANSFORM, 'EMIT_SCHEMA', FALSE);
  DBMS_METADATA.SET_TRANSFORM_PARAM (DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_CREATION', FALSE);
  DBMS_METADATA.SET_TRANSFORM_PARAM (DBMS_METADATA.SESSION_TRANSFORM, 'CONSTRAINTS_AS_ALTER', FALSE);
  XCOMMAND := DBMS_METADATA.GET_DDL ('TABLE', YTABLE_NAME, 'DEVUSER');

  EXECUTE IMMEDIATE XCOMMAND;
END;

Это работает, но если я создаю процедуру с этим кодом, я получаю сообщение об ошибке "ORA-31603: object {table name} типа TABLE не найден в схеме DEVUSER ".

CREATE OR REPLACE PROCEDURE COPY_TABLE (YTABLE_NAME IN VARCHAR2, YRECREATE IN BOOLEAN) IS
BEGIN
  -- exact same code
END;

Почему это происходит?

1 Ответ

1 голос
/ 10 октября 2019

Oracle Документация состояния:

В хранимых процедурах, функциях и пакетах определителей прав роли отключены. Следовательно, такая программа на PL / SQL может извлекать метаданные только для объектов в своей собственной схеме . Если вы хотите написать программу на PL / SQL, которая извлекает метаданные для объектов в другой схеме, вы должны настроить права на вызов программы.

Для этого необходимо добавить authid к вашемупроцедура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...