postgresql 如何在pl/pgsql中使用$$作为字符串值

tgabmvqs  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(210)

我使用pgp构建参数化的sql,并将生成的sql Package 在DO $$ END $$中。问题是当我尝试保存密码(varchar)时,一些密码哈希包含$$,这会导致问题,因为psql在DO $$ END $$中。我的问题是,是否有可能以某种方式转义$$或保存密码哈希,其中包含$$,但没有plpgsql出错。
示例生成的plpgsql

DO $$ DECLARE parent_user int; 
BEGIN  CREATE TEMP TABLE IF NOT EXISTS tmp_f6a8e872_b346_4184_889d_52ffeded463f (id int); 
INSERT INTO form_user(firstname,lastname,displayname,job_title,username,authentication_type,password,password2,password_reset,role,comm_portal,issue_ticket,email,rec_sms,created_by,created_on,auto_name) 
VALUES ('delete','delete','delete','admin','delete','password','$p5k2$$9kenbgnr$XuoSekYV4qQlDE0NkNEs2UGJEEIWtjG/','$p5k2$$7cxgxz4n$JSkgV8oGg72S1O6i2xYZSLEU2Yd6bdCO','0','admin','No','No','[email protected]','No',22,'11/5/2023 19:59:45','delete delete (admin)') RETURNING id INTO parent_user; 
INSERT INTO tmp_f6a8e872_b346_4184_889d_52ffeded463f (id) VALUES (parent_user);
END; $$;

字符串
错误错误:语法错误在或接近“9”

olhwl3o2

olhwl3o21#

在处理单个known字符串常量时,只需在字符串中不重复的美元引号中添加一个标记:

DO
$do$  -- $do$ instead of just $$
BEGIN
   CREATE TEMP TABLE tmp_tbl AS 
   WITH ins1 AS (
      INSERT INTO form_user(firstname,lastname,displayname,job_title,username,authentication_type,password,password2,password_reset,role,comm_portal,issue_ticket,email,rec_sms,created_by,created_on,auto_name) 
      VALUES ('delete','delete','delete','admin','delete','password','$p5k2$$9kenbgnr$XuoSekYV4qQlDE0NkNEs2UGJEEIWtjG/','$p5k2$$7cxgxz4n$JSkgV8oGg72S1O6i2xYZSLEU2Yd6bdCO','0','admin','No','No','[email protected]','No',22,'11/5/2023 19:59:45','delete delete (admin)')
      RETURNING id
      )
   TABLE ins;
END
$do$;

字符串
另外,您不需要使用带有变量的中间步骤,我将只使用SQL而不使用 Package DO命令,这在示例中没有添加任何有用的内容。
当处理未知字符串输入时,需要一个带引号的字符串字面量(与动态SQL类似,与给定的示例不同!)使用函数quote_literal()或等效的format('%s', $input)来构建一个带有嵌套字符串字面量的字符串。每个函数都会自动生成一个有效的字符串字面量,根据需要转义所有特殊字符。(在这种情况下,必须有一个输入 * 变量 * 或 * 参数 * 作为初始输入。
参见:

  • 在PostgreSQL中插入带单引号的文本
ilmyapht

ilmyapht2#

$$是一种特殊类型的字符串,称为美元引号。$$表示字符串的开始和结束,就像'一样。

select 'this is a string' || $$ and so is this$$

字符串
您可以在$$之间放置更多的字符,以创建一个独特的标签,如$body$。这被称为“标签”。

select $body$this is a string$body$

相关问题