Oracle 循环“select int”结果并将其传递给另一个过程

Oracle 循环“select int”结果并将其传递给另一个过程,oracle,loops,stored-procedures,plsql,Oracle,Loops,Stored Procedures,Plsql,我已经有了一个运行良好的存储过程。我需要将select语句中的行从procedureB逐个输入procedureA,如下所示: create or replace procedure procedureB is begin for x in ( select CAST(n as int) from table1) loop procedureA(x); end loop; end; 我在循环中遇到以下错误: PLS-00306: wrong num

我已经有了一个运行良好的存储过程。我需要将select语句中的行从procedureB逐个输入procedureA,如下所示:

create or replace procedure procedureB is
begin
  for x in (
     select CAST(n as int)
       from table1) 
  loop
    procedureA(x);
  end loop;
end;
我在循环中遇到以下错误:

PLS-00306: wrong number or types of arguments in call to 'procedureA'

即使“n”是整数,我也会使用强制转换,因为我认为错误是因为我必须将select结果强制转换为int。即使在使用强制转换之前,也会使用相同的错误

假设procedureA可以处理传递的整数,那么代码应该可以正常工作。通常,PLSQL不需要将列强制转换为整数来循环它。这种类型的for循环的行为基本上与游标类似,并对查询返回的每一行执行循环中的代码,而不考虑数据类型。

假设procedureA接受int作为参数,请尝试以下操作:

create or replace procedure procedureB is
begin
  for x in (select CAST(n as int) as numb
              from table1) 
  loop
    procedureA(x.numb);
  end loop;
end procedureB;
x是一行,不是int,CASTn as int的结果是未命名的,直到你给它起了一个名字,我把它叫做numb,以区别于n的原始列名


共享和享受。

错误是抱怨您发布的代码段中不存在符号。这让我相信你发布的代码与你正在使用的代码并不匹配。您正在循环中调用procedureB,但您说要在循环中调用procedureA。您引用的是伪记录x,而不是您需要的特定属性。但是这些都不会导致您声称接收到的错误。x将是一个记录变量,而不是int。因此您需要使用x.col_名称访问实际列值-但由于您没有为强制转换表达式提供别名,因此列的名称没有真正定义。@JustinCave是的,我必须修改代码并使其通用。发生此错误的另一个原因是,我试图执行'x:=x+1'来检查我是否得到一个整数,并意外地发布了该错误消息。我将发布最初的错误消息。感谢贾斯汀和@a_horse_和_no_的回复。你是对的,我把伪记录作为属性传递。我给列名指定了一个别名为n2,然后将x.n2作为参数传递,它成功了!