在oracle中添加用于插入存储过程的临时列
问题描述:
我正在尝试向目标表中添加一个临时列,并使用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';
答
如果这是一个存储过程,整个过程被解析并在create or replace procedure
时间验证。当时的过程中创建的列IMPORT_NUMBER
不存在,所以INSERT和UPDATE语句无法验证。
我会尝试找到一个解决方案,如果可能,不包含DDL。该列可以成为表格的永久部分吗?
如果您必须遵循此路径,则插入和更新语句将需要在字符串中并传递到execute immediate
或DBMS_SQL
,以便在创建列后在运行时对它们进行分析和验证。
+0
这是有道理的。谢谢! – Matt
您确定它是您的添加列失败,而不是删除列吗?下拉列作为列出的“NUMBER”数据类型,不应该在那里。 INSERT I的SELECT部分预计也会失败,因为您选择了4个值,但仅分组为1 – Craig
...或者,该位置的NUMBER不是数据类型。下划线缺失;它应该是DROP COLUMN IMPORT_NUMBER。 – mathguy