Как получить доступ к FOUND во время выполнения динамического запроса c в plpgsql - PullRequest
0 голосов
/ 22 февраля 2020

Я сохранил pro c в Redshift в plpg sql. Когда я запускаю call test3(), я получаю исключение Amazon Недопустимая операция: Количество строк: 1; Не удалось выполнить 1 оператор.

CREATE OR REPLACE  PROCEDURE test3()
LANGUAGE plpgsql
AS $$
DECLARE
     found_record RECORD;
     integer_var integer;
BEGIN
    SELECT * INTO  found_record FROM tbl WHERE id='ABC';
IF FOUND THEN 
    GET DIAGNOSTICS integer_var = ROW_COUNT;
    RAISE EXCEPTION 'Row Count: %', integer_var;
END IF;
END;
$$ 

Но когда я запускаю call test4(), я получаю

0 строк, затронутых CALL, успешно выполненных

CREATE OR REPLACE  PROCEDURE test4()
LANGUAGE plpgsql
AS $$
DECLARE
     found_record RECORD;
     integer_var integer;
BEGIN

    EXECUTE  'SELECT *  FROM tbl WHERE id=\'ABC\'' into found_record ;
IF FOUND THEN 
    GET DIAGNOSTICS integer_var = ROW_COUNT;
    RAISE EXCEPTION 'Row Count: %', integer_var;
END IF;
END;
$$

Как получить доступ к FOUND при выполнении динамического c запроса

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Dynami c SQL не влияет на переменную FOUND. Но вы можете использовать оператор GET DIAGNOSTICS. Вы делаете это в своем примере:

CREATE OR REPLACE  PROCEDURE test4()
LANGUAGE plpgsql
AS $$
DECLARE
   found_record RECORD;
   integer_var integer;
BEGIN
  EXECUTE  'SELECT *  FROM tbl WHERE id=\'ABC\'' into found_record ;
  GET DIAGNOSTICS integer_var = ROW_COUNT;
  RAISE EXCEPTION 'Row Count: %', integer_var;
END;
$$

Вы можете использовать оператор GET DIAGNOSTICS везде - не только когда FOUND имеет значение true.

1 голос
/ 22 февраля 2020

Вы не можете. но вы можете проверить, что found_record не является нулевым.

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