阅读this question后,我试图将一些sql从MysqL转换为Postgresql.因此,我需要变量赋值:
INSERT INTO main_categorie (description) VALUES ('Verbe normal');
SET @PRONOMINAL := SELECT LAST_INSERT_ID();
INSERT INTO main_mot (txt,im,date_c,date_v_d,date_l)
VALUES ('je m''abaisse',1,Now(),Now(),Now());
SET @verbe_149 = SELECT LAST_INSERT_ID();
INSERT INTO main_motcategorie (mot_id,categorie_id) VALUES (@verbe_149,@PRONOMINAL);
您将如何使用Postgresql做到这一点? v9 and v8文档中没有有用的示例(几乎相同).
注意:我不想使用诸如here之类的存储过程,我只想使用“ raw sql”,因此可以通过CLI界面将其注入.
解决方法:
Postgres sql中没有变量(只能在过程语言中使用变量).
在WITH查询中使用RETURNING:
WITH insert_cat AS (
INSERT INTO main_categorie (description)
VALUES ('Verbe normal')
RETURNING id
),
insert_mot AS (
INSERT INTO main_mot (txt,im,date_c,date_v_d,date_l)
VALUES ('je m''abaisse',1,Now(),Now(),Now())
RETURNING id
)
INSERT INTO main_motcategorie (mot_id,categorie_id)
SELECT m.id, c.id
FROM insert_mot m, insert_cat c;
或者,您可以按照this post中所述的方式使用自定义配置参数.
创建两个函数:
create or replace function set_var (name text, value text)
returns void language plpgsql as $$
begin
execute format('set MysqL.%s to %s', name, value);
end $$;
create or replace function get_var (name text)
returns text language plpgsql as $$
declare
rslt text;
begin
execute format('select current_setting(''MysqL.%s'')', name) into rslt;
return rslt;
end $$;
使用函数可以模拟变量,如示例中所示:
INSERT INTO main_categorie (description)
VALUES ('Verbe normal');
SELECT set_var('PRONOMINAL', (SELECT currval('main_categorie_id_seq')::text));
INSERT INTO main_mot (txt,im,date_c,date_v_d,date_l)
VALUES ('je m''abaisse',1,Now(),Now(),Now());
SELECT set_var('verbe_149', (SELECT currval('main_mot_id_seq')::text));
INSERT INTO main_motcategorie (mot_id,categorie_id)
SELECT get_var('verbe_149')::int, get_var('PRONOMINAL')::int;
这当然不是好的代码示例.
特别是铸造的麻烦.
但是,可以半自动完成转换.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。