简单的teradata存储过程

时间:2012-07-27 18:03:15

标签: stored-procedures cursor resultset teradata

对于一些应该非常常见的工作示例,网络似乎有点简短。一个简单的简例“给我一些记录”。这是我的第一个存储过程,我想要的只是看一些记录。为什么这么难翻? ;-)我认为如果我能得到一个有效的例子,我可以将它从那里调到我真正可以使用的东西。这取自我在网上找到的另一个例子。不编译因为CURSOR声明是某种语法错误。

CREATE PROCEDURE "SCHEMA"."GETRESULTSET (
    IN "p1" VARCHAR(30))
DYNAMIC RESULT SETS 1
BEGIN       
DECLARE CURSOR cur1 WITH RETURN ONLY TO CLIENT FOR 
 SELECT partitioninfo FROM SCHEMA.SessionInfo where username = p1;    
  OPEN cur1;    
END;

无论如何,肯定可以使用线索。我看到了一个示例,其中CURSOR是与SQL分开声明的,但后来没有一个示例显示如何在将变量声明为VARCHAR时将变量放入SQL中。我正在努力的例子已经很老了,但这是我能找到的最好的。

1 个答案:

答案 0 :(得分:1)

Teradata MACRO将是您所描述的更好的解决方案。

REPLACE MACRO [MyDB].GetResultSet(p1 VARCHAR(30)) AS (
SELECT "Partition"
  FROM DBC.SessionInfo
 WHERE UserName = :p1;
);

EXEC MyDB.GetResultSet

虽然存储过程可用于完成其他流行数据库系统(Oracle,SQL Server等)中使用的基于任务游标的逻辑,但可能导致Teradata中的编程习惯不良。通常,在Teradata中处理大型游标会降低性能。你曾经在很多东西中使用过光标用于其他DBMS'在可能的情况下,最好使用基于SET的逻辑。

可以说,游标可以在Teradata中成功使用,以执行需要条件逻辑或动态SQL处理的某些任务。我希望这会有所帮助,如果你有一个更具体的例子,你需要帮助,我很乐意提供一些建议。

修改 您的程序的DDL适用于Teradata 13.10:

CREATE PROCEDURE "SCHEMA"."GETRESULTSET" (
    IN "p1" VARCHAR(30))
DYNAMIC RESULT SETS 1
BEGIN       
DECLARE cur1 CURSOR WITH RETURN ONLY TO CLIENT FOR 
 SELECT "Partition" FROM "SCHEMA".SessionInfo where username = p1;    
  OPEN cur1;    
END;

游标名称必须继续CURSOR关键字。 PartitionInfo不是DBC.SessionInfo上的有效列。不确定" Schema"被MyBatis取代或不被替换,因此您可能需要调整SELECT语句。