Проверьте, обновлено ли что-нибудь в динамическом запросе
Мне нужно построить и выполнить UPDATE
утверждение динамически. Затем мне нужно проверить, обновлялось ли вообще что-либо. Мой код выглядит следующим образом:
DECLARE
v_table_name text;
v_column_name text;
v_debug_flag boolean;
v_upd_stmt text;
BEGIN
select nm_table_name, replace(nm_table_name, 'CDB_', 'ID_')
into strict v_table_name, v_column_name
from m_entity e
where id=12;
v_upd_stmt := format('update %s set id_lock_usr =null, dt_lock=null where %s=$1 returning id_lock_usr',
v_table_name,
v_column_name);
execute v_upd_stmt using p_id;
END
Как узнать, обновлялось ли что-нибудь?
1 ответ
Как узнать, обновлялось ли что-нибудь?
Различные варианты. В функции plpgsql вы можете проверить специальную переменную FOUND
чтобы увидеть, влияла ли последняя команда SQL на какие-либо строки.
IF FOUND THEN ...
Однако для динамических запросов с EXECUTE
использование GET DIAGNOSTICS
вместо. Руководство:
Обратите внимание, в частности, что
EXECUTE
меняет выводGET DIAGNOSTICS
, но не меняетсяFOUND
,
Связанные с:
Кроме того: я вижу затянувшиеся проблемы с правильно экранированными идентификаторами (особенно с именами таблиц в верхнем регистре, как у вас), возможно даже с внедрением SQL. Исправить с помощью:
DECLARE
v_table_name text;
v_column_name text;
v_id_lock_usr integer; -- guessing the data type
i integer;
BEGIN
SELECT nm_table_name, replace(nm_table_name, 'CDB_', 'ID_')
INTO strict v_table_name, v_column_name
FROM m_entity e
WHERE id = 12;
EXECUTE format('UPDATE %I SET id_lock_usr = null, dt_lock = null
WHERE %I = $1 RETURNING id_lock_usr'
, v_table_name,
, v_column_name)
INTO v_id_lock_usr; -- to store the *single* result from RETURNING
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN
-- do something
END IF;
END
Заметка %I
вместо %s
,
В вашем случае, если id_lock_usr
по вашему запросу возвращается NOT NULL
(надежно), вы можете просто проверить результат напрямую:
IF v_id_lock_usr IS NOT NULL ...
И вы можете захотеть квалифицировать имена таблиц, чтобы избежать двусмысленности. Но ты должен сбежать schema_name.table_name
как два отдельных идентификатора..
Связанные с: