Oracle DBMS_SQL.Execute和BULK update-需要帮助吗

Oracle DBMS_SQL.Execute和BULK update-需要帮助吗,oracle,plsql,sqlbulkcopy,Oracle,Plsql,Sqlbulkcopy,我有这个疑问 从以下表格中选择col1、col2 critera=:criteria\u var DBMS_SQL中使用了特定的查询来打开游标并绑定变量。然后,DBMS_SQL函数将获取这些值,然后这些函数将更新另一个表。但这种情况一次只发生一行 我想用大容量进货。我已经阅读了教程,但是我找不到任何可以使用DBMS_SQL进行批量获取的地方 可能吗?如果是的话,怎么办 您可以使用DBMS_SQL包中的BIND_ARRAY过程执行大容量获取。在DBMS_SQL文档中有 但是,除非特别需要使用DBM

我有这个疑问

从以下表格中选择col1、col2 critera=:criteria\u var

DBMS_SQL中使用了特定的查询来打开游标并绑定变量。然后,DBMS_SQL函数将获取这些值,然后这些函数将更新另一个表。但这种情况一次只发生一行

我想用大容量进货。我已经阅读了教程,但是我找不到任何可以使用DBMS_SQL进行批量获取的地方


可能吗?如果是的话,怎么办

您可以使用DBMS_SQL包中的BIND_ARRAY过程执行大容量获取。在DBMS_SQL文档中有

但是,除非特别需要使用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)

您可以使用DBMS_SQL包中的BIND_ARRAY过程执行批量获取。在DBMS_SQL文档中有

但是,除非特别需要使用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)

@亚历-好的。那么让我退一步。为什么需要使用动态SQL(以及DBMS_SQL包)?例如,您不知道编译时的表名吗?我知道从何处获取数据的表。给定的列值将通过dblink在另一个表中更新。您编写的最后一个代码(单个update语句)不会很慢吧?与批量更新或其他什么相比,一次更新(除非优化器做了非常愚蠢的事情)应该是更新数据的最有效方式。PL/SQL批量处理比PL/SQL逐行处理快,但这只是因为它最小化了SQL和PL/SQL之间的上下文转换。在SQL中执行任何操作都可以消除上下文转换,这是最有效的可用路径。@alee-OK。那么让我退一步。为什么需要使用动态SQL(以及DBMS_SQL包)?例如,您不知道编译时的表名吗?我知道从何处获取数据的表。给定的列值将通过dblink在另一个表中更新。您编写的最后一个代码(单个update语句)不会很慢吧?与批量更新或其他什么相比,一次更新(除非优化器做了非常愚蠢的事情)应该是更新数据的最有效方式。PL/SQL批量处理比PL/SQL逐行处理快,但这只是因为它最小化了SQL和PL/SQL之间的上下文转换。在SQL中执行任何操作都可以消除上下文转换,是最有效的可用路径。