【问题标题】:DBMS_SQL.Execute and BULK update - Need HelpDBMS_SQL.Execute 和 BULK 更新 - 需要帮助
【发布时间】:2011-02-23 20:39:21
【问题描述】:

我有这个问题

从表中选择 col1, col2 where 标准 = :criteria_var

在 DBMS_SQL 中使用特定查询来打开游标和 BIND 变量。然后这些值由 DBMS_SQL 函数获取,然后更新另一个表。但这是一次发生一行。

我想使用 BULK FETCH INTO。我已阅读教程,但找不到任何可以将 BULK FETCH INTO 与 DBMS_SQL 一起使用的地方。

有可能吗?如果是,那么如何?

【问题讨论】:

    标签: oracle plsql sqlbulkcopy


    【解决方案1】:

    您可以使用 DBMS_SQL 包中的 BIND_ARRAY 过程进行批量提取。 DBMS_SQL 文档中有an example of this

    但是,除非特别需要使用 DBMS_SQL(并且首先假设实际上需要动态 SQL),否则使用本机动态 SQL 似乎会更容易,即

    EXECUTE IMMEDIATE 'SELECT col1, col2 FROM tableName WHERE criteria = :1'
       BULK COLLECT INTO l_col1_collection, l_col2_collection
      USING l_criteria_variable;
    

    但是,如果您只是从该查询中获取数据以更新不同的表,那么让 Oracle 通过构造一个使用该查询获取多行的单个 UPDATE 语句来完成这项工作会更有效。类似的东西

    UPDATE destination_table dest
       SET (col1, col2) = (SELECT col1, col2
                             FROM source_table_name src
                            WHERE criteria = l_criteria_variable 
                              AND src.key_column = dest.key_column)
     WHERE EXISTS( SELECT 1
                     FROM source_table_name src
                    WHERE criteria = l_criteria_variable 
                      AND src.key_column = dest.key_column)
    

    【讨论】:

    • @alee - 好的。然后让我退后一步。为什么需要使用动态 SQL(和 DBMS_SQL 包)?比如编译时不知道表名吗?
    • 我知道从哪里获取数据的表。给定的列值将通过 dblink 在另一个表中更新。您编写的最后一个代码(单个更新语句)会不会很慢?与批量更新相比?
    • 一次更新(除非优化器做一些非常愚蠢的事情)应该是更新数据的最有效方式。 PL/SQL 批量处理比 PL/SQL 逐行处理更快,但这仅仅是因为它最大限度地减少了 SQL 和 PL/SQL 之间的上下文转换。在 SQL 中执行所有操作可以消除上下文转换,是最有效的可用路径。
    猜你喜欢
    • 2015-11-14
    • 2016-10-03
    • 2013-12-06
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2016-11-30
    相关资源
    最近更新 更多