【问题标题】:Teradata stored procedure with dynamic parameters具有动态参数的 Teradata 存储过程
【发布时间】:2017-09-18 08:04:46
【问题描述】:

我正在尝试创建一个 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;

但是当我调用该语句时,我得到了这个错误: 呼叫失败。 [5568] SUM_COL:SQL 语句在存储过程中不受支持。

我该如何解决这个问题?

【问题讨论】:

    标签: sql stored-procedures teradata query-parameters


    【解决方案1】:

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

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

    【讨论】:

    • SQL 语句返回一个列名和 0 作为默认值,总和是因为否则我会得到与该列中的行数一样多的 0,而这种情况是为了避免我不这样做没有行时得到任何东西。关于如何解决它的任何想法?我认为问题出在程序代码而不是语句中
    • 您的存储过程的目标是什么?您正在传递一个数据库/表名,输出应该是/提供给您什么?
    • 目标是得到一个结果集结构为 "columnName", 0。所以程序应该读取字符串,就好像它是一个查询一样。这应该通过在给定特定数据库名和表名的情况下为所有可用列名重复该字符串来实现。但我认为我在重申部分做得不好。
    猜你喜欢
    • 2016-08-19
    • 2015-07-16
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2011-06-11
    • 2020-06-04
    • 2018-09-28
    相关资源
    最近更新 更多