Informix 函数 returns 没有原因
Informix function returns without reason
所以我有以下 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...
问题是我的函数 returns 在到达 while 循环之前,它从未达到 log2、log 3 或 log 4。
你能帮帮我吗?我没有看到我错过了什么。
感谢您的帮助。
我设法解决了这个问题,但在我开始讨论我是如何做到的之前,我想尝试澄清上面 posted 代码的实际含义。
澄清
好的,所以 SOLLMANDAT_ROW
是我定义的 ROW_TYPE
(可以把它想象成一个 struct
,类似于存储过程的数据对象)。上面提到的函数是一个很大很大的 UDR 的一部分,我们使用数据行来简化数据操作。该函数应该 select 我的 sollmadant
table 中的某行并将该行存储在我自定义的 SOLLMANDAT_ROW
.
中
为了能够将 selected 行存储在 ROW_TYPES 中,该行必须明确转换为特定的行类型,因此语法 SELECT s::SOLLMANDAT_ROW FROM...
.
实际解决方案
原来是游标相关的问题,你看,在我是运行函数的上下文中,查询的table是一个同义词,我的代码在 OPEN cursor
语句处中断。 为了解决这个问题,我所做的是像这样引用我的行数据:
SELECT ROW([row colums gere ])::SOLLMANDAT_ROW [rest of select statement]
进行此更改后,该函数将正常运行。
我真的不知道为什么 informix 在尝试将来自同义词 table 的行存储到特定自定义行类型时不“喜欢”我的第一个 select 的语法。如果有人能提供解释,我将不胜感激。
希望本文post对其他人有所帮助,感谢您的宝贵时间。
所以我有以下 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...
问题是我的函数 returns 在到达 while 循环之前,它从未达到 log2、log 3 或 log 4。
你能帮帮我吗?我没有看到我错过了什么。
感谢您的帮助。
我设法解决了这个问题,但在我开始讨论我是如何做到的之前,我想尝试澄清上面 posted 代码的实际含义。
澄清
好的,所以 SOLLMANDAT_ROW
是我定义的 ROW_TYPE
(可以把它想象成一个 struct
,类似于存储过程的数据对象)。上面提到的函数是一个很大很大的 UDR 的一部分,我们使用数据行来简化数据操作。该函数应该 select 我的 sollmadant
table 中的某行并将该行存储在我自定义的 SOLLMANDAT_ROW
.
为了能够将 selected 行存储在 ROW_TYPES 中,该行必须明确转换为特定的行类型,因此语法 SELECT s::SOLLMANDAT_ROW FROM...
.
实际解决方案
原来是游标相关的问题,你看,在我是运行函数的上下文中,查询的table是一个同义词,我的代码在 OPEN cursor
语句处中断。 为了解决这个问题,我所做的是像这样引用我的行数据:
SELECT ROW([row colums gere ])::SOLLMANDAT_ROW [rest of select statement]
进行此更改后,该函数将正常运行。
我真的不知道为什么 informix 在尝试将来自同义词 table 的行存储到特定自定义行类型时不“喜欢”我的第一个 select 的语法。如果有人能提供解释,我将不胜感激。
希望本文post对其他人有所帮助,感谢您的宝贵时间。