我是创建 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
是用来string引用。
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 注入不安全.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)