Проверьте, обновлено ли что-нибудь в динамическом запросе

Мне нужно построить и выполнить 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 как два отдельных идентификатора..

Связанные с:

Другие вопросы по тегам