【问题标题】:multi cursor stored procedure in teradatateradata 中的多游标存储过程
【发布时间】:2015-02-14 05:23:12
【问题描述】:

我对 sql 和 teradata(6 周)完全陌生。并被分配了一项任务,几乎没有任何指示。
(创建一个存储过程,允许用户使用存储过程选择球棒的制造商和(可选)序列号。输出应显示使用球棒制造商的所有玩家。如果还提供了序列号,则仅显示使用该球棒制造商和序列号的玩家。确保使用 CREATE PROCEDURE 调用并将此过程插入现有数据库。)这是一个通过 teradata 复制到我自己的数据库中以进行编辑的数据库。这是我到目前为止得到的,它不断返回两个错误。我很想为快速有效地学习 sql 提供解决方案和最佳建议。我提前感谢您的帮助。我确信这是你见过的最丑陋的代码,我很抱歉。 :-D

CREATE PROCEDURE batman(manuf varchar(20), bat_type varchar(4)=null) DYNAMIC RESULT SETS 2 BEGIN DECLARE c CURSOR FOR SELECT playernum FROM affiliation, bats WHERE manuf = :manuf; declare serial cursor for select playernum from affiliation where bat_type=NULL or bat_type=:bat_type if bat_type=NULL then open c else open serial; end if; END;

【问题讨论】:

  • 您收到什么错误?
  • SPL1076:E(L1),缺少参数声明中的右括号。 SPL1048:E(L1),意外的文本 ';'代替 SPL 语句。
  • 对于您的bat_type 声明,要定义默认值,您可以使用bat_type varchar(4) default NULL
  • 非常感谢,它成功了!

标签: sql stored-procedures teradata


【解决方案1】:

参数的默认值始终为NULL,无需声明。

您不能使用 = 比较 NULL,而必须是 is null

还有一些分号不见了……

CREATE PROCEDURE batman(manuf VARCHAR(20), bat_type VARCHAR(4))
    DYNAMIC RESULT SETS 1
    BEGIN
    DECLARE c CURSOR FOR
    SELECT playernum
    FROM affiliation, bats
    WHERE manuf = :manuf;
    DECLARE serial CURSOR FOR
    SELECT playernum
    FROM affiliation
    WHERE bat_type IS NULL OR bat_type=:bat_type;
    IF bat_type IS NULL THEN OPEN c;
    ELSE OPEN serial;
    end if;
    END;

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多