Powerbuilder - встроенный SQL - SELECT INTO - PullRequest
0 голосов
/ 06 декабря 2011

Работая над производственной проблемой, я наткнулся на что-то, что, на мой взгляд, было странным в операторе SELECT в PB.

По сути, у меня есть простой 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), я ожидал, что переменная хоста будет нулевой (01.01.1900 в этом случае). К моему удивлению, SQL фактически установил для переменной 1-е значение даты (или это последнее значение?), Возвращаемое SQL.

(К вашему сведению, я включил трассировку SQL: кажется, что он продолжает извлекать все строки, поэтому я предполагаю, что это будет последнее значение строки, помещенное в локальную переменную?)

Я исправляю SQL, но мне просто интересно узнать, как PB справляется с этим. Это нормальное поведение для PB / SQL или я ожидаю поведение PL / SQL в PB ?? Версии, которые я использую: PB 10.2.1 (Build 9671) и Oracle 10g. Большое спасибо за любые комментарии или предложения.

Sam

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вы можете использовать динамический курсор и извлекать только первую строку.

  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;
0 голосов
/ 27 октября 2012

Это нормальное поведение. При использовании встроенного SQL (выберите в) вы можете извлечь только одну строку , и это никак не обойти. Но у вас есть много других вариантов:

  1. Далее ограничьте предложение Where, чтобы получить один результат.
  2. Используйте групповые функции (MAX, MIN) в выбранных столбцах, чтобы убедиться, что вы получите один результат.
  3. Использовать окно данных или объект данных.
  4. Объявить курсор и выполнить выборку в цикл.

Когда вы получите ошибку, которую сделали; Я бы не стал рассчитывать на какое-то конкретное поведение, потому что не думаю, что поддерживается выбор нескольких строк в переменные хоста, поэтому вы не знаете, как это будет работать при обновлении до более поздней версии PB.

Надеюсь, это поможет.

...