plpgsql関数の作成は初めてです。関数内で実行される動的コマンドでのquote_ident()(さらにはquote_literal())の使用に関する説明が必要です。関数内でどのように機能するかについて、誰かが具体的に説明してくれることを願っています。TIA
その例を次に示します。
EXECUTE 'UPDATE tbl SET ' || quote_ident(colname) || ' = ' || quote_literal(newvalue) || ' WHERE key = ' || quote_literal(keyvalue);
quote_ident
識別子の引用に使用されます。文字列の引用にquote_literal
使用されます。
postgres=# select quote_ident('tablename');
┌─────────────┐
│ quote_ident │
╞═════════════╡
│ tablename │
└─────────────┘
(1 row)
postgres=# select quote_ident('special name');
┌────────────────┐
│ quote_ident │
╞════════════════╡
│ "special name" │
└────────────────┘
(1 row)
postgres=# select quote_literal(e'some text with special char"\'"');
┌───────────────────────────────────┐
│ quote_literal │
╞═══════════════════════════════════╡
│ 'some text with special char"''"' │
└───────────────────────────────────┘
(1 row)
識別子とは何ですか?テーブル、列、スキーマ、シーケンスなどの名前...リテラルとは何ですか?-通常はテキスト値です(ただし、任意のタイプの値にすることができます)。関数はいくつかの特別な文字を検索して置換しますが、ルールが異なります。SQLでは識別子と文字列が異なります。
さて、これらの関数は少し時代遅れです。quote_literal
句に置き換える必要がありUSING
(パフォーマンスが向上)、quote_ident
フォーマット関数に置き換える必要がありますformat
(読みやすさが向上するため)。
EXECUTE format('UPDATE tbl SET %I=$1 WHERE key=$2', colname)
USING newvalue, keyvalue;
またはフォーマット機能のみ
EXECUTE format('UPDATE tbls SET %I=%L WHERE key=%L', colname, newvalue, keyvalue);
動的SQLを引用しないと、a)機能しない(構文エラーで失敗する)、b)SQLインジェクションに対して安全ではありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加