我使用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”
2条答案
按热度按时间olhwl3o21#
在处理单个known字符串常量时,只需在字符串中不重复的美元引号中添加一个标记:
字符串
另外,您不需要使用带有变量的中间步骤,我将只使用SQL而不使用 Package
DO
命令,这在示例中没有添加任何有用的内容。当处理未知字符串输入时,需要一个带引号的字符串字面量(与动态SQL类似,与给定的示例不同!)使用函数
quote_literal()
或等效的format('%s', $input)
来构建一个带有嵌套字符串字面量的字符串。每个函数都会自动生成一个有效的字符串字面量,根据需要转义所有特殊字符。(在这种情况下,必须有一个输入 * 变量 * 或 * 参数 * 作为初始输入。参见:
ilmyapht2#
$$
是一种特殊类型的字符串,称为美元引号。$$
表示字符串的开始和结束,就像'
一样。字符串
您可以在
$$
之间放置更多的字符,以创建一个独特的标签,如$body$
。这被称为“标签”。型