测试是否在动态查询中更新了任何内容

时间:2017-04-14 15:18:16

标签: sql postgresql dynamic plpgsql dynamic-sql

我需要动态构造和执行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 个答案:

答案 0 :(得分:1)

  

如何知道是否有任何更新?

各种选择。在plpgsql函数中,您可以检查special variable FOUND以查看最后一个SQL命令是否影响任何行。

IF FOUND THEN ...

但是,对于使用EXECUTE的动态查询,请改用 GET DIAGNOSTICS The manual

  

特别注意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_usrNOT NULL(可靠),您可能只是直接测试结果:

IF v_id_lock_usr IS NOT NULL ...

您可能希望对表名进行模式限定以避免歧义。但您必须将schema_name.table_name作为两个单独的标识符进行转义..

相关: