2015-06-17 85 views
0

我有以下想執行的PL/SQL語句。來自Oracle的返回值變量

DECLARE 
    V_REFNUM NUMBER := 0; 
BEGIN 
    SELECT NEXT_NUMBER_VALUE INTO V_REFNUM FROM SETTINGS WHERE SETTINGS_ID = 1; 
    V_REFNUM := (V_REFNUM + 1); 

    -- SELECT V_REFNUM FROM DUAL 
END; 

問題是,我似乎無法得到變量返回形式我。這工作正常,在T-SQL在我的發言是這樣

DECLARE @refNum int = 0 
SELECT @refNum = NEXT_NUMBER_VALUE FROM SETTINGS WHERE SETTINGS_ID = 1 
SET @refNum = (@refNum + 1) 
SELECT @refNum 

這似乎是一個很簡單的事Microsoft SQL Server上。爲什麼這很難找出甲骨文?誰能幫忙?

+1

您的選擇是否總是返回一個值?如何確定是你,這是不扔發現異常 – Shankar

+0

因爲這個數據是建立在安裝的時候沒有數據,然後遞增 –

回答

1

在SQLPLUS

REM SQLPLUS INTERNAL COMMAND 
var V_REFNUM number; 

REM ANNONYMOUS PL/SQL block to be evaluated on the DB server side 
BEGIN 
    SELECT NEXT_NUMBER_VALUE INTO :V_REFNUM FROM SETTINGS WHERE SETTINGS_ID = 1; 
    :V_REFNUM := (:V_REFNUM + 1); 
    -- SELECT V_REFNUM FROM DUAL 
END; 

REM SQLPLUS COMMAND 
PRINT V_REFNUM 

甲骨文annonymous塊是 「閉合」。另外Oracle存儲過程不支持「隱式」返回。要麼你必須使用IN/OUT綁定參數來存放PL/SQL塊,否則你必須調用dbms_output.put_line。

背後的原因是SQL和PL/SQL是由不同的虛擬機評估的,在SQL上下文中沒有什麼像變量。變量在PL/SQL中處於在線狀態,它們被放置,然後執行完成。 PL/SQL代碼可能沒有任何標準輸出,因此無法在任何地方打印SQL結果。

+0

我使用DBMS_OUTPUT命令和看到的值能夠輸出,但有沒有辦法拉事實後的價值? –

+0

在Oracle中,「everything」是一個遊標。因此,過程/函數或匿名PL/SQL塊可以返回類型爲SYS_REFCURSOR的變量,並且您可以獲取該遊標的數據。但遊標必須明確聲明爲接口的一部分(請參閱此示例http://stackoverflow.com/a/2153308/836215)。 – ibre5041