2017-06-30 34 views
0

我正在嘗試向目標表中添加一個臨時列,並使用where子句中的該列通過存儲過程將新數據插入到父表中從父到目標表的一對一關係(見下面的代碼)。我收到了alter table add column語句的錯誤,導致IMPORT_NUMBER成爲無效標識符。任何幫助將非常感激。在oracle中添加用於插入存儲過程的臨時列

EXECUTE IMMEDIATE 
'ALTER TABLE TARGET_TABLE ADD IMPORT_NUMBER NUMBER'; 

INSERT 
INTO 
TARGET_TABLE(
existing_col_1, 
existing_col_2, 
existing_col_3, 
IMPORT_NUMBER 
) 
SELECT 
STAGED_TABLE.value1, 
STAGED_TABLE.value2, 
STAGED_TABLE.value3, 
STAGED_TABLE.IMPORT_NUMBER 
FROM 
STAGED_TABLE 
GROUP BY 
IMPORT_NUMBER; 

UPDATE 
PARENT_TABLE 
SET 
target_table_id =(
SELECT 
TARGET_TABLE.id 
FROM 
TARGET_TABLE 
WHERE 
TARGET_TABLE.IMPORT_NUMBER = PARENT_TABLE.IMPORT_NUMBER 
) 
WHERE 
PARENT_TABLE.IMPORT_NUMBER IS NOT NULL; 

EXECUTE IMMEDIATE 'ALTER TABLE TARGET_TABLE DROP COLUMN IMPORT NUMBER'; 
+0

您確定它是您的添加列失敗,而不是刪除列嗎?下拉列作爲列出的「NUMBER」數據類型,不應該在那裏。 INSERT I的SELECT部分​​預計也會失敗,因爲您選擇了4個值,但僅分組爲1 – Craig

+0

...或者,該位置的NUMBER不是數據類型。下劃線缺失;它應該是DROP COLUMN IMPORT_NUMBER。 – mathguy

回答

2

如果這是一個存儲過程,整個過程被解析並在create or replace procedure時間驗證。當時的過程中創建的列IMPORT_NUMBER不存在,所以INSERT和UPDATE語句無法驗證。

我會嘗試找到一個解決方案,如果可能,不包含DDL。該列可以成爲表格的永久部分嗎?

如果您必須遵循此路徑,則插入和更新語句將需要在字符串中並傳遞到execute immediateDBMS_SQL,以便在創建列後在運行時對它們進行分析和驗證。

+0

這是有道理的。謝謝! – Matt

相關問題