2017-04-21 212 views
0

我試圖創建一個dunamic過程,給定一個特定的dbname和tablename,創建一組select語句使用該表可用的所有列名稱。Teradata存儲過程與動態參數

我用下面的代碼:

REPLACE PROCEDURE sum_col 
( 
IN TABLENAME VARCHAR(50), DBNAME VARCHAR(286) 
) 

BEGIN 

DECLARE SqlTxt VARCHAR(3000); 

FOR cur AS 

     SELECT 

     TRIM(a.DatabaseName) AS DBNAME, 
     TRIM(a.TABLENAME) AS TABLENAME, 
     TRIM(b.ColumnName) AS ColumnName 

     FROM dbc.Tables a 
     INNER JOIN dbc.COLUMNS AS b 
     ON a.DatabaseName=b.DatabaseName AND a.TABLENAME = b.TABLENAME 

     WHERE a.DatabaseName = :DBNAME 
     AND a.TABLENAME = :TABLENAME 
      AND TableKind = 'T' 


DO 
SET SqlTxt = 'SELECT ' || '''' || TRIM(cur.ColumnName) || '''' || ', CASE 
          WHEN SUM(CNT) IS NULL THEN 0 
          ELSE SUM(CNT) 
          END AS CntNull 

FROM (
SELECT 0 AS cnt  
FROM ' || TRIM(cur.DBNAME) || '.' || TRIM(cur.TABLENAME) ||')a ;'; 

CALL dbc.sysexecsql(:SqlTxt); 

    END FOR; 

END; 

但是當我打電話聲明我得到這個錯誤: 調用失敗。 [5568] SUM_COL:存儲過程中不支持SQL語句。

我該如何解決這個問題?

回答

0

說明: 在下列情況之一時發生此錯誤:a。使用存儲過程的動態SQL功能在存儲過程中指定不支持的SQL語句。例如,DATABASE語句,SET SQL語句,多語句請求,不帶FROM子句的CREATE USER/DATABASE語句,SELECT - INTO SQL或CALL SQL。這是運行時錯誤。

看起來像你有其他語法錯誤。聲明你的光標,打開你的光標等。我認爲你可以用更簡單的方式解決你的目標,你到底想要完成什麼?

+0

SQL語句返回一個列名和0作爲默認值,總和是因爲否則我會得到0那麼多,因爲那列中有行,並且這種情況是爲了避免我沒有得到任何東西,當有沒有行。關於如何解決它的任何想法?我認爲問題出在程序代碼而不是語句 – Barbara

+0

你的存儲過程的目標是什麼?你傳遞的是數據庫/表名,輸出應該是/提供給你的是什麼? – weinp

+0

目標是獲得結果集結構爲「columnName」,0。所以過程應該讀取字符串,就好像它是一個查詢。這應該通過重申給定某個數據庫名稱和表名稱的所有列名的字符串來實現。但我認爲我重申了一部分。 – Barbara