2014-03-12 57 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循環基本上像遊標一樣運行,併爲查詢返回的每一行執行循環中的代碼,而不管數據類型如何。

相關問題