Stored-Procedures

DB2 - 在“CREATE TABLE as (..)”語句中使用儲存過程變數

  • July 22, 2020

從 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 儲存過程,我相信您已經查看了數據庫轉換工作台

引用自:https://dba.stackexchange.com/questions/257880