2017-04-14 5 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

あなたは*完全*機能を提供する必要があります。しかし、あなたはschema_name.table_name 2のように別々の識別子。..関連

をエスケープする必要があります。ヘッダーと他の宣言は、ほとんど常に関連しています。そしていつもあなたのPostgresのバージョンも。 –

答えて

0

何かが更新されたかどうかを知る方法?

さまざまなオプションがあります。 plpgsql関数では、special variable FOUNDを調べて、最後のSQLコマンドがどの行にも影響を与えるかどうかを確認できます。 GET DIAGNOSTICS代わりEXECUTE用いてダイナミッククエリしかしながら

IF FOUND THEN ... 

、。 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:で固定してください。

IF v_id_lock_usr IS NOT NULL ... 

をそして、あなたはあいまいさを避けるために、スキーマ修飾するテーブル名にしたいかもしれません:あなたのケースでは

、クエリによって返さid_lock_usr場合、あなただけの代わりに、直接結果をテストする可能性があるNOT NULL(確実)です。

+0

見つからない –

+0

@VadBoro:そうです、申し訳ありませんが、 'EXECUTE'の動的クエリの場合は、' GET DIAGNOSTICS'が必要です(リンクされた答えで説明されています)。それに応じて更新しました。 –

関連する問題