2017-06-30 92 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

相关问题