IBM SolidDB, получение результата не выполнено из-за отсутствия результата в операторе выполнения - PullRequest
1 голос
/ 05 мая 2011

В своих хранимых процедурах я делаю много:

EXEC SQL EXECUTE ...

EXEC SQL FETCH ...

Однако я получаю некоторые ошибки (Ошибка 23506: конец таблицы в курсоре), когда инструкция execute ничего не возвращает и я пытаюсь получить результат. Есть ли способ проверить, содержит ли результат что-либо, прежде чем пытаться его получить?

Я пробовал SQLSUCCESS и SQLROWCOUNT, но SQLSUCCESS только сообщает мне, если оператор не дает сбоя, если не возвращает ничего, а SQLROWCOUNT, очевидно, работает только для вставок, обновлений и удалений. Не выбирать заявления.

1 Ответ

1 голос
/ 05 мая 2011

В этой ссылке сравниваются процедуры DB2 и SolidDB.

В разделе «Листинг 15. SQLSUCCESS, показывающий конец набора результатов», в справочнике IBM приведен этот фрагмент.

EXEC SQL FETCH sel_tab;
WHILE SQLSUCCESS LOOP
    EXEC SQL FETCH sel_tab;
END LOOP

Там также написано

Когда инструкция FETCH не работает и не находит другой строки получить значение SQLSUCCESS установите в 0 и WHILE LOOP завершится.

Это в значительной степени говорит me , что цикл WHILE даже не следует вводить, если этот первый EXEC SQL FETCH не находит строку. Но вы, похоже, предполагаете, что этого не происходит в вашем коде.

Позже, в «Табл. 7. solidDB SQLERROR оператора cursorname», он показывает этот код. (Мои аннотации.)

"CREATE PROCEDURE tabs_in_schema (schema_nm 
     VARCHAR) RETURNS (nr_of_rows INTEGER)
BEGIN
   DECLARE tab_nm VARCHAR;
   EXEC SQL PREPARE sel_tab                     -- A SELECT statement
    SELECT table_name FROM sys_tables
                   WHERE table_schema = ?;
  EXEC SQL PREPARE ins_tab
        INSERT INTO my_table (table_name, 
           schema) VALUES (?,?);
  nr_of_rows := 0;
  EXEC SQL EXECUTE sel_tab USING                -- Executes the SELECT
         (schema_nm)INTO (tab_nm);
  EXEC SQL FETCH sel_tab;                       -- EXEC SQL FETCH first row
  WHILE SQLSUCCESS LOOP                         -- Like listing 15
      nr_of_rows := nr_of_rows + 1;
     EXEC SQL EXECUTE ins_tab USING
           (tab_nm, schema_nm);
     IF SQLROWCOUNT <> 1 THEN
         RETURN SQLERROR OF ins_tab;
    END IF;
    EXEC SQL FETCH sel_tab;                     -- FETCH subsequent rows
  END LOOP
END";

Полагаю, вы могли бы выполнить что-то вроде

SELECT COUNT(your_column_name) 
FROM your_table
WHERE ...;

COUNT () всегда будет возвращать хотя бы одну строку, если ваш запрос действителен. Но это включает в себя больше поездок в базу данных. Я думаю, что вам лучше придерживаться идиомы попыток получить строку и поймать ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...