我試圖將一個預定義的Oracle數據庫管理用戶帳戶存儲到一個表DBOMIT_SCHEMAS使用列表schema_list在代碼中。在EXECUTE IMMEDIATE中使用SQL時如何解決ORA-00984?
DECLARE
TYPE schema_list_type IS TABLE OF "DBCONTROL"."DBSCHEMA_INFO".SCHEMA%TYPE;
schema_list schema_list_type;
BEGIN
schema_list := schema_list_type('ANONYMOUS', 'CTXSYS', 'DBSNMP', 'EXFSYS', 'LBACSYS', 'MDSYS', 'MGMT_VIEW','OLAPSYS', 'OWBSYS', 'ORDPLUGINS', 'ORDSYS', 'OUTLN', 'SI_INFORMTN_SCHEMA', 'SYS', 'SYSMAN', 'SYSTEM', 'TSMSYS', 'WK_TEST', 'WKSYS', 'WKPROXY', 'WMSYS', 'XDB');
FOR i IN schema_list.FIRST .. schema_list.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('***DEBUG***: '||schema_list(i));
EXECUTE IMMEDIATE('INSERT INTO "DBCONTROL"."DBOMIT_SCHEMAS" VALUES('||schema_list(i)||')');
END LOOP;
END;
當我通過列表嘗試循環和每個值插入表中,我得到ORA-00984:這裏錯誤不允許列。我想,發生這種情況是因爲它理解ANONYMOUS(列名)而不是'ANONYMOUS'(字符串)。誰能解決這個問題嗎?
當我使用純SQL語句時,我得到** ORA-06550:**錯誤。這是因爲我有一個** EXECUTE IMMEDIATE **語句來在插入值之前創建表。我嘗試將它們分開,並且它工作正常。即使當我使用綁定變量,我得到** ORA-00911:無效字符**錯誤。它可以根據需要使用額外的引號。 – Syam
@Syam - 是的,如果你是動態創建表,你是對的,插入也必須是動態的。 (即時創建表非常不尋常)。你不需要綁定變量的引號;但如果我使用Oracle':var'語法而不是JDBC'''語法,它確實會有所幫助。如果你只是把引號括起來,那麼表中插入的所有值都將是''?'',而不是實際的模式名稱。我已經糾正(並測試)了,對不起。 –