【发布时间】:2021-03-20 00:13:12
【问题描述】:
在一个过程中,我声明了一个游标。在游标声明中,我使用了datum_naar_dagdeel 函数。该函数本身确定星期几加上一天中的部分时间,并将其转换为整数。见代码摘要:
...
CURSOR c_teamvoorkeuren
IS
SELECT DISTINCT
a.seq_afpraak
, a.datum_start
, t.code
, ks.code
, ks.naam
FROM afspraak a
, team t
, kamer_selectie ks
WHERE a.seq_aga_afspraak = p_seq_aga_afspraak
AND t.seq_team = a.seq_team
AND ks.seq_team = a.seq_team
AND ks.dagdeel = instancename.datum_naar_dagdeel(a.datum_start)
...
到目前为止我发现了什么:
-
功能上的
GRANT EXECUTE已经给public了。 - 过程中其他地方使用的其他自定义函数运行良好。
- 内部带有函数的 select 语句可以完美地独立运行。运行选择部分时,我得到了预期的结果。
- 当我用
1替换instancename.datum_naar_dagdeel(a.date_start)时,稍后执行的for 循环运行良好。1是给定约会的函数的结果,我正在测试该过程。 - 但是,当我使用函数而不是
1时,for 循环不会执行单次迭代。因此我得出结论,导致问题的原因是游标内的函数组合。
在游标声明中使用自定义函数时,我是否正在尝试做不可能的事情?是自定义函数还是系统函数有区别吗?
另外,我怀疑我可以构建一个使用 for 循环本身内部函数的检查。并且当检查失败时,使用continue 语句进入下一个迭代步骤。但是,这种解决方案感觉并不干净。
【问题讨论】:
-
没有异常处理程序……至少现在还没有。我一定会尝试你的建议。所以我猜你怀疑它应该能够工作。正如我通常在 C#.Net 或 SQL Server 上编程一样,我可能需要尝试几次才能使其正常工作。考虑到欧洲的时间,可能要等到周日或周一。
-
一般来说光标应该可以工作。可以提供函数
datum_naar_dagdeel的代码 -
这似乎很容易通过调试器逐步清除。大概该函数没有返回预期值。