所以我有以下informix程序
CREATE FUNCTION selectSollmandant(INOUT sollmandat SOLLMANDAT_ROW, inkassodatum INT8) RETURNING SMALLINT
DEFINE ret SMALLINT;
LET ret = 0;
trace "Entering select sollmandat " || sollmandat.vers_schein_nr;
PREPARE sollStmt FROM "SELECT s::SOLLMANDAT_ROW FROM sollmandat s WHERE vers_schein_nr = ? ORDER BY lfdnr desc";
DECLARE _sollmCsr CURSOR FOR sollStmt;
IF SQLCODE != 0 THEN
CALL print_to_proto("DECLARE letztZahlCsr " || SQLCODE);
RETURN 0;
END IF;
TRACE "log =========== 1";
OPEN _sollmCsr USING sollmandat.vers_schein_nr;
TRACE "log =========== 2" || SQLCODE;
IF SQLCODE != 0 THEN
TRACE "log =========== 3" || SQLCODE;
CALL print_to_proto("OPEN sollmandat " || SQLCODE);
RETURN 0;
END IF;
TRACE "sollmandant iban is =========== 4" || SQLCODE;
WHILE (1=1) LOOP .... end loop and return...
问题是我的函数在到达while循环之前返回,它从不会遇到log2,log 3或log 4。
你能帮帮我吗?我不知道自己错过了什么。感谢您的帮助。
答案 0 :(得分:0)
我设法解决了这个问题,但在我开始讨论这个问题之前,我想尝试澄清上面发布的代码实际意味着什么。
好的,SOLLMANDAT_ROW
是我定义的ROW_TYPE
(将其视为存储过程的struct
数据对象)。上面提到的函数是一个大的UDR的一部分,我们使用数据行来更容易地进行数据操作。该函数应从我的sollmadant
表中选择一行,并将该行存储在我的自定义SOLLMANDAT_ROW
中。
为了能够将所选行存储在ROW_TYPES中,该行必须明确地转换为特定的行类型,因此语法为SELECT s::SOLLMANDAT_ROW FROM...
。
事实证明问题是游标相关,你看,在我运行该函数的上下文中,查询表是同义词,我的代码在{{ 1}}陈述。 我为了解决问题而做的是引用我的行数据:
OPEN cursor
进行此更改后,该功能将按预期运行。
我真的不知道为什么在尝试将同义词表中的行存储到特定的自定义行类型时,informix不会“喜欢”我的第一个选择的语法。如果有人能提供解释,我将非常感激。
我希望这篇文章对其他人有所帮助,我感谢你的时间。