Stored-Procedures
DB2 - 在“CREATE TABLE as (..)”語句中使用儲存過程變數
從 Netezza 遷移到 DB2,我們面臨以下問題:
CREATE OR REPLACE PROCEDURE DoStuff() BEGIN DECLARE vStarttime TIMESTAMP; SET vStarttime = now(); CREATE TABLE foo AS ( SELECT x, y, vStarttime as t_change FROM bar ); END
基本思想是 t_change 應該保持呼叫過程的時間。但是,這失敗了,因為顯然 vStarttime “在該上下文中無效”。我們選擇先創建表,然後呼叫更新來填寫時間戳。雖然這樣可行,但是感覺非常hacky,出於性能原因,我們希望避免額外的更新語句。有更好的解決方案嗎?
注意: foo 實際上是一個相當複雜的臨時表。我省略了大部分細節以使其盡可能簡單。
這裡不需要使用中間變數。Db2 系統資料庫變數,包括
CURRENT TIMESTAMP
或其符合標準的變體CURRENT_TIMESTAMP
,在引用它們的語句範圍內設置一次。這意味著在像您這樣的聲明中:SELECT x, y, CURRENT_TIMESTAMP as t_change FROM bar
t_change
大約在語句執行開始時,所有行都將具有相同的值。
我想你可以在 SP 之外創建一個全域變數。例如,這會工作
CREATE VARIABLE gStarttime TIMESTAMP; CREATE OR REPLACE PROCEDURE DoStuff() BEGIN SET gStarttime = now(); CREATE TABLE foo AS ( SELECT x, y, vStarttime as t_change FROM bar ) WITH DATA; END
順便說一句,如果您正在遷移現有的 Netezza 儲存過程,我相信您已經查看了數據庫轉換工作台