Oracle 在动态sql中使用集合
我试图将dbms_sql.number_表从一个过程传递到另一个过程,然后在动态plsql块中使用它。但是下面的代码抛出错误,如下所示: 错误(6,17):PLS-00306:调用“| |”时参数的数量或类型错误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
您应该进行两项更改: 首先(以及它的错误情况)是在将字符串与集合关联时。 如果要将集合发送到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;