【问题标题】:Test if anything was updated in dynamic query测试动态查询中是否有任何更新
【发布时间】:2017-09-10 21:13:21
【问题描述】:

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

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

【问题讨论】:

  • 你应该提供一个complete函数。标题和其他声明几乎总是相关的。并且始终是您的 Postgres 版本。

标签: sql postgresql dynamic plpgsql dynamic-sql


【解决方案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_usr 是NOT NULL(可靠),您可以直接测试结果:

IF v_id_lock_usr IS NOT NULL ...

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

相关:

【讨论】:

  • @VadBoro:对,抱歉,对于 EXECUTE 的动态查询,您需要 GET DIAGNOSTICS(如链接答案中所述)。我相应地更新了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
相关资源
最近更新 更多