2013-05-06 29 views
1

我有一個名爲MY_STORED_PROC的存儲過程。它有一個整數輸入參數和一個整數輸出參數。如何在DB2中使用原始SQL調用存儲過程(LINQPad)

我試過的DECLARE S,BEGIN S和END S和call一切都方式,我已經開始考慮改變語句結束(??),我不能爲我的生命得到它在原始SQL(LINQPad在我的情況)工作。

This answer給出

DECLARE outParam NUMBER; 
BEGIN 
    TP.MY_STORED_PROC(26431414, outParam); 
END; 

返回

ERROR [42601] [IBM] [DB2/SUN64] SQL0104N意外的標記 「DECLARE OUTPARAM NUMBER @ BEGIN」 之後發現「 」。預期的令牌可能包括:「<values>」。

我自己也嘗試設置終止/分隔符:

--#SET DELIMITER @ 
DECLARE outParam [email protected] 
BEGIN 
    TP.MY_STORED_PROC(26431414, outParam); 
[email protected] 

--#SET TERMINATOR @ 
DECLARE outParam [email protected] 
BEGIN 
    TP.MY_STORED_PROC(26431414, outParam); 
[email protected] 

都返回

ERROR [42601] [IBM] [DB2/SUN64] SQL0104N異常標記「DECLARE OUTPARAM NUMBER @ BEGIN「在」 「後找到。預期的令牌可能包括:「<values>」。

call給出了同樣的結果。

通過OdbcCommand調用它正常工作與call

var input = 789; 
var sql = "call TP.MY_STORED_PROC (?, ?);"; 

using (var tx = new TransactionScope(TransactionScopeOption.Suppress)) 
using (var connection = new OdbcConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)) 
using (var command = new OdbcCommand(sql, connection)) 
{ 
    command.Parameters.Add("@input_param", OdbcType.Int, 32).Value = input; 
    command.Parameters.Add("@output_param", OdbcType.Int, 32).Direction = System.Data.ParameterDirection.Output; 
    connection.Open(); 
    command.ExecuteNonQuery(); 

    object output = command.Parameters["@output_param"].Value; 
    if (output is DBNull) 
     return null; 

    int output = Convert.ToInt32(output); 
    return output; 
} 

我怎麼能說這件事情,並在輸出參數,然後我的東西,在一個結果集,並回顯到屏幕上得到有意義的結果?

回答

1

如果您只是試圖從DB2命令行處理器調用存儲過程,則不需要做任何事情。只需使用任何輸出參數的參數標記:

$ db2 "call tp.my_stored_proc(26431414, ?)" 

DB2 CLP將只打印每個輸出參數的名稱/值。

例如,內置的GET_DBSIZE_INFO存儲過程有3個輸出參數。你這樣稱呼:

$ db2 "call get_dbsize_info(?, ?, ?, -1)" 

    Value of output parameters 
    -------------------------- 
    Parameter Name : SNAPSHOTTIMESTAMP 
    Parameter Value : 2013-05-06-23.49.14.581776 

    Parameter Name : DATABASESIZE 
    Parameter Value : 253607936 

    Parameter Name : DATABASECAPACITY 
    Parameter Value : 2179940352 

    Return Status = 0 
+0

感謝您的輸入。不完全是我所追求的。我的問題是更多的「我將如何在SQL腳本中運行此存儲過程'get_dbsize_info(?,?,?,-1)',類似於我可以運行'ALTER TABLE TESTUSER.EMPLOYEE ADD NEW_COL VARCHAR(25)' ?」認爲數據庫升級腳本(通過RoundhousE或類似的)。 – sennett 2013-05-07 22:59:41

+0

我不熟悉Roundhouse如何執行SQL語句 - 即它是直接連接到數據庫來執行語句,還是隻是使用每個DBMS的命令行實用程序執行腳本?如果是後者,則將'get_dbsize_info(?,?,?, - 1);'放入一個文件(比如''x.sql'')中,並用DB2 CLP:'db2 -tvf x.sql'執行。 – 2013-05-08 17:11:43

+0

感謝您的持續關注。我想直接對數據庫執行這些腳本。 – sennett 2013-05-10 05:07:56

相關問題