2017-04-21 33 views
0

特定の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

説明: このエラーは、次のいずれかの状況で発生します。ストアド・プロシージャの動的SQL機能を使用して、ストアド・プロシージャでサポートされていないSQL文が指定されています。たとえば、DATABASE文、SET SQL文、複数文の要求、FROM句のないCREATE USER/DATABASE文、SELECT-INTO SQLまたはCALL SQLなどです。これは実行時エラーです。

他の構文エラーがあるようです。あなたのカーソルを宣言し、あなたのカーソルを開くなど。私はあなたがより簡単な方法であなたの目標を解決することができると思う、正確に何を達成しようとしている?

+0

SQL文では、カラム名とデフォルト値として0が返されます。そうでないと、そのカラムに行があるのと同じくらい多くの0が得られるため、その場合は何も得られません行はありません。どのようにそれを修正するためのアイデアですか?私は問題がプロシージャコードではなく、ステートメント – Barbara

+0

ではないと思いますあなたのストアドプロシージャの目標は何ですか?あなたはデータベース/ tablenameを渡しています、そして、あなたに提供されるべき出力は何ですか? – weinp

+0

目標は、結果セット構造体を "columnName"、0として取得することです。したがって、プロシージャは文字列をクエリと同じように読み取る必要があります。これは、特定のdbnameとテーブル名を指定すると、使用可能なすべてのカラム名に対してその文字列を繰り返すことで実現されます。しかし、私は反復の部分を不十分にしたと思う。 – Barbara

関連する問題