Я создаю скрипт для копирования таблицы от пользователя 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;
Почему это происходит?