Powerbuilder - 嵌入式SQL - SELECT INTO

问题描述 投票:0回答:2

在处理生产问题的过程中,我偶然发现了一些我认为在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。非常感谢任何意见或建议。

他自己

powerbuilder
2个回答
0
投票

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

  1. 进一步限制Where子句以获得一个结果。
  2. 在选择列上使用组函数(MAX,MIN)以确保获得一个结果。
  3. 使用数据窗口或数据对象。
  4. 声明游标并执行fetch into循环。

当你得到你所犯的错误时;我不会指望任何特定的行为发生,因为我不认为选择多行到主机变量是支持的,所以当你升级到更高版本的PB时你不知道它将如何工作。

希望这可以帮助。


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;
© www.soinside.com 2019 - 2024. All rights reserved.