在处理生产问题时,我偶然发现了一些我觉得奇怪的事情,在PB的SELECT语句中。
基本上,我有一个简单的SQL选择变量。我想,原始开发人员(我只维护这段代码)在这种情况下只需要一行。
....
//
Date ld_CutOff
....
SELECT TO_DATE(PARM_VALUE, 'DD-MON')
INTO :ld_CutOff
FROM SYSPARM
WHERE PARM_NAME = 'CUTOFF_DATE' ;
....
现在该表的符号超过1。因此,SQL错误(选择返回超过1行)按预期方式。 (基于PB和PL / SQL的先前经验)我期望主变量为null(在这种情况下为01/01/1900)。令我惊讶的是,SQL实际上将变量设置为SQL返回的第一个Date值(或者是最后一个值?)。
(仅供参考,我打开了SQL Trace:它似乎一直在抓取所有行,所以我猜它将是放在局部变量中的最后一行值?)
我正在修复SQL,但我很想知道PB处理这个问题的方式。这是PB / SQL的正常行为还是我期待PB中的PL / SQL行为?我正在使用的版本:PB 10.2.1(Build 9671)和Oracle 10g。非常感谢任何意见或建议。
萨姆
答案 0 :(得分:0)
这是正常行为。使用嵌入式SQL (选择加入)时,您只能检索一行,而且无法解决这个问题。但是你有很多其他的选择:
当你收到你所犯的错误时;我不会指望任何特定的行为发生,因为我不认为选择多行进入主机变量是不受支持的,所以当你升级到更高版本的PB时,你不知道它将如何工作。
希望这有帮助。
答案 1 :(得分:0)
您可以使用动态游标并仅获取第一行。
DECLARE dbinfo DYNAMIC CURSOR FOR SQLSA;
ls_sql = "SELECT {fn curdate() }"
PREPARE SQLSA FROM :ls_sql USING SQLCA;
OPEN DYNAMIC dbinfo;
IF SQLCA.SQLCode > 0 THEN
// erro handling
END IF
FETCH dbinfo INTO :ls_date;
CLOSE dbinfo;