当前位置: 首页 > 面试题库 >

PostgreSQL:有效的变量分配示例?

戚高洁
2023-03-14
问题内容

我正在尝试将一些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和v8(几乎相同)的文档中没有有用的示例。


问题答案:

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

RETURNINGWITH查询中使用:

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

使用函数可以模拟变量,如示例中所示:

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;

这当然不是良好代码的示例。特别是铸造的麻烦。但是,转换可以半自动完成。



 类似资料:
  • 问题内容: 我的印象是,尽管语法有所不同,但下面的函数a和b在逻辑上是等效的。但是,它们不是,我也不了解它们之间的区别。 在我看来,他们俩都在分配: x对变量z的值, y的值对应于变量x,并且 x + y的值等于变量y。 有人能帮助消除我对多变量分配以及函数a和函数b之间的逻辑差异的误解吗? 问题答案: 分配可以认为是“原子”操作。也就是说,认为在所有操作完成之前,“ 左侧”的所有值都是“冻结”的

  • 问题内容: 如何使用Swift在一行中分配多个变量? 问题答案: 你不知道 这是一种语言功能,可以防止赋值的标准不良副作用返回值,如Swift书中所述: 与C和Objective-C中的赋值运算符不同,Swift中的赋值运算符本身并不返回值。以下语句无效: 此功能可防止在实际需要等于运算符()时偶然使用赋值运算符()。通过使其无效,Swift可帮助您避免代码中的此类错误。 因此,这有助于防止此极其

  • 问题内容: 大多数语言都有NaN常数,您可以使用它来为变量赋值NaN。python可以不使用numpy来做到这一点吗? 问题答案: 是的-使用。 在Python 3.5之前,可以使用(不区分大小写)。 请注意,检查两个NaN是否彼此相等将始终返回false。部分原因是不能(严格地说)说两个不是数字的事物彼此相等-请参阅所有比较为IEEE754 NaN值返回false的基本原理是什么? 了解更多详细

  • 我是helm的新手,我希望能够使用配置映射和共享环境变量将gitlab项目变量写入文件。 我为每个环境(其中

  • 问题内容: Linux bash中确实存在类似于PHP中以下代码的内容: 也就是说,您在一个句子中为3个不同的变量分配了一个对应的值。 假设我有bash函数,该函数将stdout字符串“ qwert asdfg zxcvb”写入标准输出。是否可以做类似的事情: 等号左边的部分当然不是有效的语法。我只是想解释我的要求。 但是,有效的方法如下: 但是索引数组的描述性不如普通变量名。 但是,我可以这样做

  • 我有一个关于java如何处理未使用变量的问题。 假设我有以下代码: 那么我就不会在代码中使用notUsedVariable。该变量是否会被存储,或者java是否足够聪明,可以在编译时忽略该变量? 谢谢