Oracle 在动态sql中使用集合

Oracle 在动态sql中使用集合,oracle,plsql,numbers,dynamic-sql,Oracle,Plsql,Numbers,Dynamic Sql,我试图将dbms_sql.number_表从一个过程传递到另一个过程,然后在动态plsql块中使用它。但是下面的代码抛出错误,如下所示: 错误(6,17):PLS-00306:调用“| |”时参数的数量或类型错误 您应该进行两项更改: 首先(以及它的错误情况)是在将字符串与集合关联时。 如果要将集合发送到pl/sql块,则应使用参数。 其次,您应该添加在动态pl\sql的末尾: create or replace procedure proc1(v_in dbms_sql.number_tabl

我试图将dbms_sql.number_表从一个过程传递到另一个过程,然后在动态plsql块中使用它。但是下面的代码抛出错误,如下所示:

错误(6,17):PLS-00306:调用“| |”时参数的数量或类型错误


您应该进行两项更改: 首先(以及它的错误情况)是在将字符串与集合关联时。 如果要将集合发送到pl/sql块,则应使用参数。 其次,您应该添加
在动态pl\sql的末尾:

create or replace
procedure proc1(v_in dbms_sql.number_table)
as
plsql_block varchar2(4000);
begin
   plsql_block:='declare
                   l_collect dbms_sql.number_table := :number_table ;
                 begin
                      FORALL INDX IN 1 ..'||v_in.count||'  SAVE EXCEPTIONS 
                       UPDATE table_name
                         Set col1=123 WHERE col2=l_collect(INDX);
                 end;';
    execute immediate plsql_block using v_in;
end proc1;

但是在所有更改之后,我想问:您真的需要使用动态pl\sql吗?

没有必要使用动态块。我也不认为它可以工作得很好。你可以用这种方式

create or replace
procedure proc1(v_in dbms_sql.number_table)
as
plsql_block varchar2(4000);

l_collect dbms_sql.number_table;

begin

l_collect := v_in;

 FORALL INDX IN 1 ..l_collect.count  SAVE EXCEPTIONS 
      UPDATE table_name
    Set col1=123 
    WHERE col2=l_collect(INDX);

 commit; 
end proc1;
执行:

 SQL> DECLARE
       var   DBMS_SQL.number_table;
       BEGIN
         var (1) := 1;
         var (2) := 2;
         var (3) := 3;
        proc1 (var);
       END;    
     /

PL/SQL procedure successfully completed.
编辑:根据您的编辑,代码如下所示:

 create or replace procedure proc1 (v_in_table_name     varchar2,
                                   v_in_column_name    varchar2,
                                   v_in                dbms_sql.number_table)
as
   plsql_block   varchar2 (4000);
begin
   plsql_block := q'[ FORALL INDX IN 1 ..v_in.count  SAVE EXCEPTIONS 
                          UPDATE :table_name
                          Set :col1=123 
                          WHERE col2=v_in(INDX)]';

   execute immediate plsql_block using v_in_table_name, v_in_column_name;

   commit;
end proc1;

我正在动态plsql块内进行一些其他处理,所以我需要对动态块内的所有数据进行处理。我也在做同样的事情。我只是将数据处理为一个变量并运行它。这里对动态块的需求是无用的,我的需求是这样的,我需要使用动态块,你想用动态sql实现什么。因为无论您想要实现什么,都可以使用上面的。update语句中的表名是动态的,因此动态块不确定您在哪里尝试过,因为我有oracle 11gR2,它给了我这个错误
PLS-00457:表达式必须是SQL类型
。我会说,请重试并发布工作版本在编译错误时设置此错误(13,41):PLS-00457:表达式必须是SQL类型
 create or replace procedure proc1 (v_in_table_name     varchar2,
                                   v_in_column_name    varchar2,
                                   v_in                dbms_sql.number_table)
as
   plsql_block   varchar2 (4000);
begin
   plsql_block := q'[ FORALL INDX IN 1 ..v_in.count  SAVE EXCEPTIONS 
                          UPDATE :table_name
                          Set :col1=123 
                          WHERE col2=v_in(INDX)]';

   execute immediate plsql_block using v_in_table_name, v_in_column_name;

   commit;
end proc1;