在 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 操作。