迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > PostgreSQL >

在 PostgreSQL 中使用变量

作者:迹忆客 最近更新:2023/03/20 浏览次数:

本文将演示我们如何在 PostgreSQL 中为变量声明和赋值。

在 PostgreSQL 中使用 DECLARE 声明变量

通常,你需要 PL/SQL 脚本中的变量。在名为 DECLARE 的部分中,你需要告诉脚本你的变量是什么以及它的类型是什么。

在 PL/SQL 中,有两个部分。一个是声明,另一个是脚本部分,其中编写了标准 SQL。格式如下。

DO $$
DECLARE variable_name <TYPE>

BEGIN
    SQL Commands/Scripts
END $$

现在,我们有一张学生表和他们的任务表。我们的工作是找到符合某些条件的学生并为该学生发出通知。

Students 表如下所示:

CREATE TABLE Students(
    ID SERIAL,
    Student_Name VARCHAR NOT NULL,
    Task VARCHAR,
    Marks INT
);

假设你要存储学生姓名和任务信息,其中 id 等于 3。现在,这里要提一下,我们不知道 id、name 和 task 的数据类型。

如果类型不匹配,则可能会发生错误。为了解决这个问题,我们需要使用 <column_name>%type

例子:

do $$
DECLARE
    _name students.student_name%type;
    _task students.task%type;
BEGIN
    SELECT student_name, task
    FROM students
    INTO _name,_task
    WHERE id=3;

    RAISE NOTICE '% got task %', _name,_task;

end; $$;

输出:

postgres=# select * from students;
 id | student_name | task | marks
----+--------------+------+-------
  1 | Alice        | HW1  |    10
  2 | Alice        | HW2  |     9
  3 | Alice        | HW3  |     0
  4 | Alice        | HW4  |     6
  5 | Bob          | HW1  |     6
  6 | Bob          | HW2  |    10
  7 | Bob          | HW3  |     8
  8 | Bob          | HW4  |     7
(8 rows)

如果你是第一次运行这种 PL/SQL,RAISE 将不起作用,这意味着在执行 SQL 脚本后不会显示任何内容。要启用这个功能,你需要在 psql shell 中执行以下命令。

SET client_min_messages TO NOTICE;

设置后,你可以看到这样的输出(执行 PL/SQL 命令后):

postgres=# do $$
postgres$# DECLARE
postgres$#     _name students.student_name%type;
postgres$#     _task students.task%type;
postgres$# BEGIN
postgres$#     SELECT student_name, task
postgres$#     FROM students
postgres$#     INTO _name,_task
postgres$#     WHERE id=3;
postgres$#
postgres$#     RAISE NOTICE '% got task %', _name,_task;
postgres$#
postgres$# end; $$;
NOTICE:  Alice got task HW3
DO

这是另一个关键字,INTO。它将所选列的数据放置到相应的变量中。

使用 RETURNING 为 PostgreSQL 中的变量赋值

你已经看到,ID 是上表中的 SERIAL 类型数据。因此,每次插入后它都会增加一。

但是在插入过程中,我们永远不知道哪个 id 被分配给当前行。

因此,假设你想在向学生表插入命令后查看 ID。命令如下:

do $$
DECLARE
    _id students.id%type;
BEGIN
    INSERT INTO Students(Student_Name, Task, Marks) 
    VALUES ('Trude','HW1',6)
    RETURNING id INTO _id;

    RAISE NOTICE 'Last insert has id: %', _id;

end; $$;

输出:

NOTICE:  Last insert has id: 9
postgres=# SELECT * FROM STUDENTS WHERE ID=9;
 id | student_name | task | marks
----+--------------+------+-------
  9 | Trude        | HW1  |     6
(1 row)

此外,你可以在 PL/SQL begin to part 中使用多个查询。然后,你可以使用该变量检查一些条件并进行一些 CRUD 操作。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 PSQL 中运行 SQL 文件

发布时间:2023/03/20 浏览次数:178 分类:数据库

本文解释了如何直接从终端/命令行或 psql shell 运行 SQL 文件。为此,你需要指定主机名、端口、用户名和数据库名称。

在 PostgreSQL 中使用循环

发布时间:2023/03/20 浏览次数:124 分类:PostgreSQL

在 PL/SQL 中,你可能需要在 Postgres 中使用循环。我们可以使用 FOR 和 WHILE 语句来创建循环。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便