【问题标题】:Add temporary column for insert stored procedure in oracle在 oracle 中为插入存储过程添加临时列
【发布时间】:2017-12-04 18:53:36
【问题描述】:

我正在尝试向目标表添加一个临时列,并在 where 子句中使用该列通过存储过程将新数据插入到父表中,该存储过程用于从父级到目标的一对一关系表(见下面的代码)。我在使用 alter table add column 语句时遇到错误,从而导致 IMPORT_NUMBER 成为无效标识符。任何帮助将不胜感激。

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';

【问题讨论】:

  • 您确定失败的是您的添加列而不是删除列吗?作为“NUMBER”数据类型列出的删除列,不应该存在。我预计 INSERT 的 SELECT 部分也会失败,因为您选择了 4 个值,但仅按 1 分组。
  • ...或者,更确切地说,该位置的 NUMBER 不是数据类型。缺少下划线;它应该是 DROP COLUMN IMPORT_NUMBER。

标签: database oracle stored-procedures sql-insert alter-table


【解决方案1】:

如果这是一个存储过程,则在create or replace procedure 时解析和验证整个过程。在创建过程时,IMPORT_NUMBER 列不存在,因此无法验证插入和更新语句。

如果可能,我会尝试找到不包含 DDL 的解决方案。列可以成为表格的永久部分吗?

如果您必须遵循此路径,则插入和更新语句需要在字符串中并传递给 execute immediateDBMS_SQL,以便在创建列后在运行时对其进行解析和验证。

【讨论】:

  • 这是有道理的。谢谢!
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多