ステートメントとユーザー定義のテーブル タイプExecute Immediate
を含むステートメントを使用しようとすると問題が発生します。Oracle 11g でCREATE TABLE
エラーが発生します。
この問題を解決するための回避策はありますか?ORA-22905
CREATE TYPE MY_TABLE_TYPE AS TABLE OF VARCHAR2(30);
/
DECLARE
MT MY_TABLE_TYPE;
BEGIN
SELECT * BULK COLLECT INTO MT FROM DUAL;
-- Two steps
EXECUTE IMMEDIATE 'CREATE TABLE MY_TABLE1 (A VARCHAR2(30))';
EXECUTE IMMEDIATE 'INSERT INTO MY_TABLE1 SELECT * FROM TABLE(:T)' USING MT; -- OK
-- One step
EXECUTE IMMEDIATE 'CREATE TABLE MY_TABLE2 AS SELECT * FROM TABLE(:T)' USING MT; -- ERROR ORA-22905
END;
の実際のコードSELECT * FROM TABLE(:T)
は動的 (メイン テーブル名は一時的なもの) であり、低速です。そのため、2 つのステップでテーブルを作成することは避けようとしています ( のようにMY_TABLE1
)。また、2つのステップでは使用できませんSELECT *
が、すべての列を指定する必要があります(可変量と100列以上)。