В этой ссылке сравниваются процедуры 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 () всегда будет возвращать хотя бы одну строку, если ваш запрос действителен. Но это включает в себя больше поездок в базу данных. Я думаю, что вам лучше придерживаться идиомы попыток получить строку и поймать ошибку.