1

PostgreSQLでPl/pgSQL経由で行を更新したいのですが、エラーが発生します。これは私のコードです:

CREATE OR REPLACE FUNCTION "Surrogate_Del"(tablename text, surro uuid)
  RETURNS void AS
$BODY$DECLARE
tblname text;
surrogate uuid;
BEGIN
tblname:=tablename;
surrogate:=surro;
execute 'UPDATE'||tblname||'SET ID=NULL WHERE surrogate='||surrogate|| ;
END$BODY$
LANGUAGE plpgsql

これは、それに基づいてレコードを更新する UUID です

*syntax Error »ab7«
cd32cdf0-5ab7-11e2-abda-1c4bd605a98d
                  ^*

どうすればこの問題を解決できますか?

4

2 に答える 2

4

一般的に優れたアプローチは句を使用してを挿入するUSINGことです。これにより、キャストの実行時のオーバーヘッドとtext、特殊文字を引用することによる潜在的な危険を回避できます。

名前付きパラメーターを直接使用することもできます。ローカル変数の別のレイヤーを宣言して割り当てる意味はありません。

CREATE OR REPLACE FUNCTION surrogate_del (_tblname text, _surro uuid)
   RETURNS void AS
$BODY$
BEGIN
   EXECUTE format('UPDATE %I SET ID = NULL WHERE surrogate = $1', _tblname)
   USING _surro;
END
$BODY$ LANGUAGE plpgsql

また、関数名を小文字に変換し、二重引用符を削除しました。私の個人的なアドバイスは、PostgreSQLでCamelCase識別子を使用しないことです。それは常に痛みの原因です。

_tblname関連する注意事項:大文字と小文字を区別する方法でテーブル名を指定することを忘れないでください。format()またはquote_ident()、スペルをそのまま保持します。

于 2013-01-10T16:38:04.737 に答える
4

パラメータの前後にエスケープされた引用符が必要です。

execute 'UPDATE ' || tblname || ' SET ID = NULL WHERE surrogate = ''' || surrogate || '''';

mu の提案は、よりクリーンで堅牢です。

execute 'UPDATE ' || tblname || ' SET ID = NULL WHERE surrogate = ' || quote_literal(surrogate);

それがpostgresqlの新しいバージョン(9.0+だと思います)の場合は、format関数を使用できます:

execute format('UPDATE %I SET ID = NULL WHERE surrogate = %L', tblname, surrogate);

%LSQL リテラルとしてエスケープします。

于 2013-01-09T17:32:24.593 に答える