Powerbuilder - 嵌入式SQL - SELECT INTO

时间:2011-12-05 21:48:44

标签: powerbuilder

在处理生产问题时,我偶然发现了一些我觉得奇怪的事情,在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。非常感谢任何意见或建议。

萨姆

2 个答案:

答案 0 :(得分:0)

这是正常行为。使用嵌入式SQL (选择加入)时,您只能检索一行,而且无法解决这个问题。但是你有很多其他的选择:

  1. 进一步限制Where子句以获得一个结果。
  2. 在选择列上使用组功能(MAX,MIN)以确保获得一个结果。
  3. 使用数据窗口或数据对象。
  4. 声明游标并执行fetch into循环。
  5. 当你收到你所犯的错误时;我不会指望任何特定的行为发生,因为我不认为选择多行进入主机变量是不受支持的,所以当你升级到更高版本的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;