簡體   English   中英

在plpgsql函數中使用quote_ident()

[英]the use of quote_ident() in a plpgsql function

我只是創建plpgsql函數的新手。我需要一些關於在函數內部執行的動態命令中使用quote_ident()(甚至是quote_lite())的說明。 希望任何人都可以給我一個關於它們如何在函數內工作的具體解釋。 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注入不安全

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM