PostgreSQL:一个有效的变量赋值样本?

时间:2015-12-27 22:05:29

标签: mysql sql postgresql

在阅读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这样的存储过程,我只想要#34; raw sql"所以我可以通过CLI界面注入它。

2 个答案:

答案 0 :(得分:2)

Postgres SQL中没有变量(您只能在过程语言中使用变量)。

WITH查询中使用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;

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 $$;

作为替代方案,您可以按照this post中描述的方式使用自定义配置参数。

创建两个函数:

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;

使用这些函数可以模拟变量,例如:

{{1}}

这肯定不是好代码的例子。 特别是铸造的必要性是麻烦的。 但是,转换可以半自动完成。

答案 1 :(得分:1)

您可以使用do construct在函数外部运行PostgreSQL脚本。这是唐老鸭的侄子的一个例子。首先,侄子将被添加到侄子表中,然后我们将使用新插入的侄子id添加棒球帽。

Huey, Dewey and Louie from Wikipedia

首先,为侄子和棒球帽创建两个表:

drop table if exists nephew;
drop table if exists cap;
create table nephew (id serial primary key, name text);
create table cap (id serial, nephewid bigint, color text);

现在添加第一个侄子:

do $$declare
  newid bigint;
begin
  insert into nephew (name) values ('Huey') returning id into newid; 
  insert into cap (nephewid, color) values (newid, 'Red');
end$$;

returning ... into ...在Postgres中做了currval在MySQL中的作用。 Huey的新id被分配给newid变量,然后用于在cap表中插入新行。您可以像运行任何其他SQL语句一样运行此脚本。继续Dewey和Louie:

do $$declare
  newid bigint;
begin
  insert into nephew (name) values ('Dewey') returning id into newid; 
  insert into nephew (name) values ('Louie') returning id into newid; 
  insert into cap (nephewid, color) values (newid, 'Green');
end$$;

你最终得到:

# select * from nephew;
 id | name  
----+-------
  1 | Huey
  2 | Dewey
  3 | Louie
(3 rows)

# select * from cap;
 id | nephewid | color 
----+----------+-------
  1 |        1 | Red
  2 |        3 | Green
(2 rows)

See it working at SQL Fiddle.