2014-03-12 34 views
-1

我已经有一个可以正常工作的存储过程procedureA(int)。我需要从select语句的行被送入一个接一个进入procedureA从procedureB,它看起来像以下:将'select int'结果循环并将其传递给另一个过程

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'是一个整数,我也使用了CAST,因为我认为这个错误是因为我必须将选择结果CAST作为一个int。 (甚至在使用CAST之前也会得到相同的错误)。

+2

错误是抱怨您发布的代码段中不存在的符号。这让我相信你发布的代码与你使用的代码并不匹配。你正在循环中调用'procedureB',但是你说你想在你的循环中调用'procedureA'。而你正在引用伪字符'x',而不是你需要的特定属性。但是这些都不会导致你声称会收到的错误。 –

+0

'x'将是一个记录变量,而不是一个int。所以你需要使用'x.col_name'来访问* actual *列值 - 但是因为你没有赋予'cast'表达式的别名,所以列的名字没有真正定义。 –

+0

@JustinCave是的,我确实需要修改代码并使其通用。此外,错误发生的原因是我试图做'x:= x + 1'来检查我是否得到一个整数并意外发布了该错误消息。我将发布原始错误消息。 – dexterityrules

回答

0

假设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,而CAST(n as INT)的结果是无名,直到你给它一个名称(这里我称其为numb以区分它与原始列名称n)。

分享和享受。

0

该代码应该正常工作(假设procedureA可以处理被传递的整数)。一般来说,您不需要将您的列转换为PLSQL的整数来遍历它。这种类型的for循环基本上像游标一样运行,并为查询返回的每一行执行循环中的代码,而不管数据类型如何。

相关问题