2013-03-13 61 views
0

我不知道如何在調用另一個存儲過程的存儲過程中設置變量。我想保存返回的值並在以後的另一個選擇中使用它。pl在程序中設置sql變量

我想要做這樣的事情:

PROCEDURE procName(bcur OUT IssCur) 
IS 
cur2 IssCur; 
extCur IssCur; 
exlineno varchar2(30); 

BEGIN 
exlineno :=getExternlineno(exlineno,'50036648','00060'); 
open cur2 for SELECT concat(SUBSTR(susr2, 0, INSTR(susr2, '-')-1),'') from OrderDetail; 

存儲過程調用

PROCEDURE getExternlineno(
oRetValue OUT varchar2, 
pKey IN varchar2, 
poNum IN varchar2) 
AS 
Begin 
    select externlineno into oRetValue from podetail where pokey = pKey and polinenumber = poNum; 
end getExternlineno; 

一旦我弄清楚如何這樣做,那麼我也可以打破這樣的事情(這不理解PROC名稱:

 SELECT concat(concat(SUBSTR(susr2, 0, INSTR(susr2, '-')-1),''),' - ' || getExternlineno(exlineno,'50036648','00060')) from OrderDetail; 
+2

你應該申報'getExternlineno '作爲功能,而不是程序。 – 2013-03-13 21:03:50

+0

您可以通過引用('oRetValue OUT varchar2')使用該值,那麼在調用過程中不需要'exlineno:=',或者像Egor所說的那樣做。在你的情況下,功能看起來更好... – Trinimon 2013-03-13 21:17:28

+0

去功能。 – 2017-03-28 14:38:23

回答

1

葉戈爾就在他的評論中,您應該申報getExternlineno作爲一個函數,以便在SQL查詢中使用它。

功能getExternlineno隨後將變爲:然後

FUNCTION getExternlineno(
pKey IN varchar2, 
poNum IN varchar2) 
RETURN VARCHAR 
AS 
DECLARE 
oRetValue VARCHAR2(2000); -- Change the precision as per program's requirements. 
Begin 
    select externlineno into oRetValue from podetail where pokey = pKey and polinenumber = poNum; 
end getExternlineno; 
    /

procName程序將變爲:

PROCEDURE procName(bcur OUT IssCur) 
IS 
cur2 IssCur; 
extCur IssCur; 
exlineno varchar2(30); 

BEGIN 
exlineno := getExternlineno('50036648','00060'); -- Notice the change in number of arguments here. 
open cur2 for SELECT concat(SUBSTR(susr2, 0, INSTR(susr2, '-')-1),'') from OrderDetail; 
END procName; 
/

而且你的SQL查詢將變成:

 SELECT concat(concat(SUBSTR(susr2, 0, INSTR(susr2, '-')-1),''),' - ' 
      || getExternlineno('50036648','00060')) 
     FROM OrderDetail;