在 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 这是另一个关键字, 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 操作。