具有动态参数的 Teradata 存储过程
Teradata stored procedure with dynamic parameters
我正在尝试创建一个动态过程,给定特定的数据库名称和 table 名称,使用该 table 可用的所有列名称创建一组 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 存储过程中不支持语句。
我该如何解决这个问题?
说明:
在以下情况之一时会发生此错误:a。使用存储过程的动态 SQL 功能在存储过程中指定了不受支持的 SQL 语句。例如,DATABASE 语句、SET SQL 语句、多语句请求、不带 FROM 子句的 CREATE USER/DATABASE 语句、SELECT - INTO SQL 或 CALL SQL。这是 运行 次错误。
您似乎还有其他语法错误。声明你的光标,打开你的光标等。我认为你可以用更简单的方式解决你的目标,你到底想完成什么?
我正在尝试创建一个动态过程,给定特定的数据库名称和 table 名称,使用该 table 可用的所有列名称创建一组 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 存储过程中不支持语句。
我该如何解决这个问题?
说明: 在以下情况之一时会发生此错误:a。使用存储过程的动态 SQL 功能在存储过程中指定了不受支持的 SQL 语句。例如,DATABASE 语句、SET SQL 语句、多语句请求、不带 FROM 子句的 CREATE USER/DATABASE 语句、SELECT - INTO SQL 或 CALL SQL。这是 运行 次错误。
您似乎还有其他语法错误。声明你的光标,打开你的光标等。我认为你可以用更简单的方式解决你的目标,你到底想完成什么?