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語句。
我該如何解決這個問題?
SQL語句返回一個列名和0作爲默認值,總和是因爲否則我會得到0那麼多,因爲那列中有行,並且這種情況是爲了避免我沒有得到任何東西,當有沒有行。關於如何解決它的任何想法?我認爲問題出在程序代碼而不是語句 – Barbara
你的存儲過程的目標是什麼?你傳遞的是數據庫/表名,輸出應該是/提供給你的是什麼? – weinp
目標是獲得結果集結構爲「columnName」,0。所以過程應該讀取字符串,就好像它是一個查詢。這應該通過重申給定某個數據庫名稱和表名稱的所有列名的字符串來實現。但我認爲我重申了一部分。 – Barbara