【问题标题】:PLSQL Define A Cursor DynamicallyPLSQL 动态定义游标
【发布时间】:2017-06-22 12:27:57
【问题描述】:

我正在尝试创建一个接受两个表名作为参数的过程,然后一次将一个表中的行复制到另一个表中。我知道批量插入和SELECT INTO 是更好的方法,但是批量插入不起作用,因为当我一次插入多行时,表触发器会引发突变错误。

我已经看到其他建议使用动态 SQL 的答案,但我不知道如何以这种方式定义游标。

CREATE OR REPLACE PROCEDURE TABLE_INSERT(
    donor_t IN VARCHAR2,
    empty_t IN VARCHAR2
    )
AS
    CURSOR C1 IS 
        SELECT * FROM donor_t;
BEGIN
    FOR row IN C1
    LOOP
        INSERT INTO empty_t VALUES row;
    END LOOP;
END;

按上述方式编译时,编译器会抛出ORA-00942: table or view does not exist. 当使用硬编码的表名进行编译时,此函数会按预期插入行,而不会出错。

【问题讨论】:

  • 基本上你想要做的是插入作为选择,为什么不这样做呢?逐行处理数据对性能非常不利。
  • 一种选择是查看您的触发器并考虑是否可以为批量操作禁用它们并在之后重新启用它们。显然,您的批量操作将需要处理触发器执行的业务逻辑。否则,请尝试 Oracle 文档的示例 - docs.oracle.com/cd/B28359_01/appdev.111/b28370/…
  • @BriteSponge 我什至没有想到是否可以禁用触发器并在插入后重新启用它们;这个解决方案就像一个魅力。

标签: oracle stored-procedures plsql


【解决方案1】:

试试这个:

CREATE OR REPLACE PROCEDURE TABLE_INSERT(
donor_t IN VARCHAR2,
empty_t IN VARCHAR2
)
AS 
  V_SQL VARCHAR2(1000);
BEGIN
    V_SQL := 'INSERT INTO ' || empty_t || ' SELECT * FROM ' ||  donor_t;
    EXECUTE IMMEDIATE V_SQL;
END;
/

【讨论】:

  • 这对于动态插入语句来说是一个很好的解决方案,但不幸的是它仍然会导致触发器抛出突变错误,因为它不是一次一个插入。
猜你喜欢
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多