加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在plpgsql函数中使用quote_ident()

发布时间:2020-12-13 18:05:56 所属栏目:百科 来源:网络整理
导读:我只是创建plpgsql函数的新手.我需要一些关于在函数内部执行的动态命令中使用quote_ident()(甚至quote_literal())的说明.希望任何人都可以给我一个关于它们如何在函数内工作的具体解释. TIA 这是一个例子: EXECUTE 'UPDATE tbl SET ' || quote_ident(colnam
我只是创建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应该用格式化函数格式替换(由于更好的可读性):

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注入不安全.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读