如何在 Informix 中正确输入存储过程参数?

Posted

技术标签:

【中文标题】如何在 Informix 中正确输入存储过程参数?【英文标题】:How to enter stored procedure parameters correctly in Informix? 【发布时间】:2015-06-01 17:00:14 【问题描述】:

我在下面有一个使用 dbaccess 的存储过程:

CREATE PROCEDURE proc_1 (p_name VARCHAR(20), 
p_usernum INTEGER)
RETURNING CHAR(7);
DEFINE err INTEGER;

ON EXCEPTION SET err
RETURN 'ERROR';
END EXCEPTION

ON EXCEPTION IN (150) SET err
RETURN 'NOTHING';
END EXCEPTION

INSERT INTO database1 (name, usernum,)
VALUES (p_name, p_usernum,);

IF DBINFO('sqlca.sqlerrd2') = 0
      THEN RAISE EXCEPTION 150;
   END IF;

RETURN 'YES';
END PROCEDURE;

.... 运行存储过程时出现错误 -201。 下一行是否在第一个参数之后导致错误? 是否有适当的方法允许参数移动到存储过程中的下一行? 我试图做的是使用 INSERT 运行存储过程,如果 INSERT 也不成功,则返回错误信息。

【问题讨论】:

您是使用dbaccess 还是isql 运行SQL?使用isql 将不起作用,因为它无法识别必须发送多个语句。但是,从对话来看,您可能正在使用dbaccess,然后答案中描述的语法错误是您的主要问题。 是的,我正在使用 dbaccess,查看我的存储过程我不确定语法哪里有问题... Ricardo Henriques 建议的代码对我有用。您遇到语法错误的一个地方是您的DEFINE err; 行中缺少类型信息。由于您从不使用err 中的值,您可以简单地省略它和SET err 子句。一般ON EXCEPTION 优先于ON EXCEPTION IN (150)(或IN (746))有一些微妙的问题,所以你只会得到ERROR,而不是NOTHING。您也永远不会获得不插入一行的成功 INSERT(当您使用 VALUES 列表时),因此IF DBINFO('sqlca.sqlerrd2') = 0 条件永远不会触发。 尽管错误没有定义类型和自定义异常,我相信我理解,为什么 VALUES 关键字不允许插入? VALUES 允许插入;事实上,它坚持必须有一个 INSERT 否则它将失败并出现异常。除非我的记忆再次让我失望,否则您的插入后检查正在寻找“没有插入行”,而实际上“必须插入一行”。所以插入后检查是多余的;它永远不会被激活。如果您使用INSERT INTO SomeThing SELECT … FROM SomeWhereElse…,它可能是相关的。然后你可以插入零行。 【参考方案1】:

我不知道这是否是错误的copy+paste,但您在定义err 时缺少类型,您在插入子句上有一些额外的逗号,并且您返回的是一个正在截断的CHAR(5)NOTHING。试试这个:

CREATE PROCEDURE proc_1 (p_name VARCHAR(20), p_usernum INTEGER) RETURNING CHAR(7);

DEFINE err INTEGER;

ON EXCEPTION SET  err
    RETURN 'ERROR';
END EXCEPTION

ON EXCEPTION IN (746) SET err
RETURN 'NOTHING';
END EXCEPTION

INSERT INTO database1 (name, usernum)
VALUES (p_name, p_usernum);

IF DBINFO('sqlca.sqlerrd2') = 0
      THEN RAISE EXCEPTION 746;
   END IF;

RETURN 'YES';
END PROCEDURE;

不要使用异常 150,您有一个自定义用于此 (746):

[infx1150@tardis ~]$ finderr 150
-150    The limits of the IBM Informix Demo Version have been exceeded.

You are using a demonstration version of the database server. This
version has severe limits on the number of tables and the size of the
tables that it can manage. The current operation causes it to exceed
one of those limits. Contact your IBM representative about buying
the production version of the software.


[infx1150@tardis ~]$ finderr 746
-746    message-string

You supply message-string for this message. You can apply this message
to error conditions that you specify in an SPL routine. The corrective
action for this error depends on the condition that caused it. You, the user,
define both the condition and the message text.


[infx1150@tardis ~]$

【讨论】:

746 是为您要自定义错误消息的此类解决方案保留的错误代码。 我已经修改了存储过程,这似乎对它的目的有效。

以上是关于如何在 Informix 中正确输入存储过程参数?的主要内容,如果未能解决你的问题,请参考以下文章

Informix:在 Java 中使用存储过程

通过 ADO.Net 命令调用 Informix 存储过程的最佳/正确方法?

将存储过程从 MS SQL Server 转换为 Informix

Informix,在存储过程中初始化变量

在 Informix 中创建 TEMP 存储过程

Informix SQL / 在另一个查询中重用存储过程的结果