带有动态参数的Teradata存储过程

时间:2017-04-21 10:45:26

标签: sql stored-procedures teradata query-parameters

我正在尝试创建一个dunamic过程,在给定特定的dbname和tablename的情况下,使用该表可用的所有列名创建一组select语句。

我正在使用以下代码:

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;

但是当我调用语句时,我收到此错误: CALL失败。 [5568] SUM_COL:存储过程中不支持SQL语句。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

说明: 在下列情况之一时会发生此错误:使用存储过程的动态SQL功能在存储过程中指定不受支持的SQL语句。例如,DATABASE语句,SET SQL语句,多语句请求,没有FROM子句的CREATE USER / DATABASE语句,SELECT - INTO SQL或CALL SQL。这是一个运行时错误。

看起来您还有其他语法错误。声明你的光标,打开你的光标等等。我认为你可以用一种更简单的方式解决你的目标,你到底想要完成什么?