2010-03-22 146 views
2

這似乎應該很容易...無論如何,它是在MS SQL服務器如何從DB2中的存儲過程中獲取變量值?

在DB2存儲過程中,我怎麼才能得到一個變量的值?假設我有以下存儲過程:

CREATE PROCEDURE etl.TestABC( 
) 
LANGUAGE SQL 
    BEGIN 
    declare  Stmt    varchar(2048); 
    set Stmt = 'this is a test'; 
-- print Stmt; 
-- select Stmt; 


    return 0; 
END @ 

我想在設置它後打印出Stmt的值。打印不起作用,選擇不起作用。有人說我必須先將它插入到表中,然後在運行存儲過程之後再獲取它。這真的有必要嗎?

感謝, 西爾維亞

編輯:我應該更加明確,我希望看到語句的值以後每次我設置它,我可能需要在同一個存儲過程中多次設置。

回答

6

如果你想看到的值當你正在開發/測試你的存儲過程,那麼你應該使用IBM Data Studio和調試您的存儲過程。這提供了正常的調試器功能,因此您可以在您的過程執行時看到變量的值。

但是,如果你只是想執行存儲過程,並看到值的歷史,我建議創建一個全局臨時表,並插入一行到它在你的代碼:

declare global temporary table StmtHistory (
    when timestamp not null with default current timestamp, 
    stmt varchar(2048) not null 
) on commit preserve rows; 

然後,在存儲過程中的點,添加:

insert into session.StmtHistory (stmt) values (stmt); 

你執行存儲過程後,就可以查詢該表session.StmtHistory,看到你正在尋找的價值。

此外,DB2 9.7增加了Oracle兼容性,所以如果您使用的是此版本,您可能實際上可以使用DBMS_OUTPUT.PUT_LINE和DBMS_OUTPUT.GET_LINES來完成此操作,如果您願意的話。

+0

謝謝伊恩。我們一直在寫臨時表來獲取值,但會嘗試DBMS_OUTPUT.PUT_LINE方法。 這裏似乎有完整的說明:http://www.ibm.com/developerworks/data/library/techarticle/0302izuha/0302izuha.html#download – Sylvia 2010-03-24 15:46:30

3

您必須聲明的變量在程序的構造函數:

CREATE PROCEDURE etl.TestABC(
    OUT Stmt varchar(2048) 
) 
LANGUAGE SQL 
BEGIN 
    -- declare  Stmt    varchar(2048); 
    set Stmt = 'this is a test'; 
    -- print Stmt; 
    -- select Stmt; 

    return 0; 
END @ 

這將讓你即從控制檯訪問:

call etl.TestABC(?) 

用,因爲這類似的輸出:

Value of output parameters 

Parameter Name : STMT 
Parameter Value : this is a test 

Return Status = 0 

注意:我目前無法訪問我們的DB2服務器,但我相信上述內容應該有所裨益。基於實例: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.sql.doc/doc/t0007055.htm

+0

感謝您的反饋意見。如果我要在存儲過程的多個點修改變量,並且想要在每個點輸出值,該怎麼辦?看起來上面只是輸出變量的最後一個值,如果我正確地讀取它的話...... – Sylvia 2010-03-22 19:31:00

+0

正確,這會在程序結束運行後爲變量的最終狀態留下一個變量。恐怕我不知道如何使用多個OUT變量獲得(1)以外的臨時值; (2)將你的單個程序分成多個程序(每個程序會給你自己的最終值);或(3)將臨時結果存儲在某個表中。我個人認爲,除了將它們設置爲OUT變量外,您不能以PL/SQL本機方式公開過程的內部變量。更有經驗的人:請告知是否有更好的方法,我也會對此感興趣。謝謝! – MicE 2010-03-22 20:11:47

1

嘗試以下行:

values Stmt; 
+0

我收到以下「 SQL0104N意外標記」值(Stmt); 值Stmt「被發現在」 – Sylvia 2010-03-22 19:27:49

+0

「之後,看起來像別的東西在那裏很時髦。 'values(Stmt)'從哪裏來?你也可以嘗試類似'select * from(values'34')foo' – 2010-03-23 12:54:22

1

您可以使用允許您在表或文件中寫入消息的「log4db2」之類的日誌記錄系統。這些消息由可以處於活動狀態或不活動狀態的記錄器控制。

使用log4db2,您不需要刪除將來可能使用的調試消息。你只要停用關聯記錄,或降低日誌記錄級別,完全按照你「的log4j」

檢查工具在做:https://github.com/angoca/log4db2

相關問題