2013-08-29 45 views
1

我在甲骨文寫一個存儲過程,我想從一開始就賦值給變量權:Oracle存儲過程 - 我可以賦值給聲明塊中的變量嗎?

CREATE PROCEDURE proc 
(
    param1 
    , param2 
) 
AS 
    variable1 INT AS SELECT MAX(value) FROM table WHERE field = param1; 
BEGIN 
... 

它是允許還是我應該做的可執行塊?

+0

當你嘗試時發生了什麼? –

+0

錯誤,我不知道他們是否因爲我缺乏過程語法知識或者不可能做我想做的事情而發生。 – kyooryu

+1

假設這段代碼反映了你正在嘗試完成的內容,你可能需要查看一下使用序列並使用序列的內置支持返回序列中的下一個值:sequence_name.nextval。任何具有max(value)的解決方案都可能不會在併發環境中產生你想要的結果。 –

回答

4

甲骨文分配查詢值到這樣的變量...

SELECT MAX(value) INTO variable1 FROM table WHERE field = param1; 

......因爲它,你不能將變量初始化爲在聲明塊查詢值。它必須是在執行和/或異常塊:

CREATE PROCEDURE proc 
(
    param1; -- don't forget the data type here! 
, param2; -- or here! 
) 
AS 
    variable1 INT; 
BEGIN 
    SELECT MAX(value) INTO variable1 FROM table WHERE field = param1; 
    ... 
2

你可以使用一個本地函數而不是變量:

create or replace procedure proc(param1 in varchar2) as 
    function max_val return number is 
    l_result number; 
    begin 
    select max(value) 
     into l_result 
     from t1 
    where field = param1; 
    return l_result; 
    end; 
begin 
    dbms_output.put_line('max val for ' || param1 || ': ' || max_val); 
end; 

不幸的是,你不能同時聲明一個局部變量和分配max_val的值,因爲函數的聲明僅在變量的聲明後才被允許。

相關問題