2017-04-14 75 views
2

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

你应该提供一个完整的* *的功能。标题和其他声明几乎总是相关的。并且始终是您的Postgres版本。 –

回答

0

如何知道是否有更新?

各种选项。在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作为两个独立的标识..

相关:

+0

FOUND不起作用 –

+0

@VadBoro:对不起,对于使用'EXECUTE'进行动态查询,您需要'GET DIAGNOSTICS'(如链接答案中所述)。我相应地更新了。 –