我需要动态构造和执行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
如何知道是否有任何更新?
答案 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_usr
为NOT NULL
(可靠),您可能只是直接测试结果:
IF v_id_lock_usr IS NOT NULL ...
您可能希望对表名进行模式限定以避免歧义。但您必须将schema_name.table_name
作为两个单独的标识符进行转义..
相关: