PL/pgSQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/ Postgres SQL)。属
于第三代语言,它与C、C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。
PL/pgSQL是Postgresql 数据库对SQL语句的扩展。它允许SQL的数据操纵语言(DML)和查询语句(SELECT)包含在块结构(block_structured)和代码过程语言中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。
PL/pgSQL的基本单位叫做块,由三个部分组成:一个声明部分,一个执行部分和异常处理部分。
Package简介
在Oracle中package是一种数据库对象,它是由存储过程,函数,变量,游标,常量等PL/SQL程序设计元素组成的,作为一个完成的单元存储在数据库中。
包的主要目的:提高代码的可重用性,模块化,和封装性,提高性能(减少数据库与客户端之间的通信次数,从而提高程序的执行效率)。
包类似于JAVA或C#语言中的类,包中的变量相当于类中的成员变量,过程和函数相当于类方法。
包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同。公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL程序访问,而私有元素只能被包内的函数和过程序所访问。
包的组成部分
包头(Package Header)和包体(Package Body)
- 包头(Package Header):包头包含了包中所有元素的声明,包括存储过程、函数、变量和类型的名称、参数和返回值等信息,包头可以被其他程序单元引用,但不能包含实际的执行代码。
- 包体(Package Body):包体包含了包中所有元素的具体实现代码,包体不能被其他程序单元引用,但可以调用其他程序单元。
包的使用
创建包头
语法格式:
CREATE [ OR REPLACE ] PACKAGE [ schema. ] package_name
[ invoker_rights_clause ]
{ IS | AS } item_list_1 END [ package_name ] ;
代码说明:
package_name:包名。
invoker_rights_clause:使用谁的权限运行,格式如下:
AUTHID { CURRENT_USER | DEFINER }
item_list_1:声明包的公用组件列表
{ type_definition -- 数据类型
| cursor_declaration -- 游标
| item_declaration -- 变量、常量等
| function_declaration -- 函数
| procedure_declaration -- 过程
}
[ { type_definition
| cursor_declaration
| item_declaration
| function_declaration
| procedure_declaration
| pragma
}
]...
完整语法结构见:CREATE PACKAGE Statement
例如下述代码创建了一个名为package_demo包头,其中包含一个存储过程add_numbers,该过程接受两个a和b,以及一个输出参数C。
CREATE OR REPLACE PACKAGE package_demo IS
PROCEDURE add_numbers(a IN NUMBER, b IN NUMBER, c OUT NUMBER);
END package_demo;
/
创建包体
CREATE [ OR REPLACE ] PACKAGE BODY [ schema. ] package_name
{ IS | AS } declare_section [ initialize_section ]
END [ package_name ] ;
例如下列代码创建了名为package_demo包体,实现了包头中定义的存储过程:
CREATE OR REPLACE PACKAGE BODY package_demo IS
PROCEDURE add_numbers(a IN NUMBER, b IN NUMBER, c OUT NUMBER) IS
BEGIN
c := a + b;
END add_numbers;
END package_demo;
/
示例
创建一个包含函数的包
--创建包头,定义一个名为dd_numbers的函数
CREATE PACKAGE my_package IS
FUNCTION add_number(p_num1 NUMBER,p_num2 NUMBER) RETURN NUMBER;
END my_package;
/
--创建包体实现函数add_number的功能
CREATE PACKAGE BODY my_package IS
FUNCTION add_number(p_num1 NUMBER,p_num2 NUMBER) RETURN NUMBER IS v_result NUMBER;
BEGIN
v_result := p_num1 + p_num2;
RETURN v_result;
END add_number;
END my_package;
/
那么我们应该如何去调用和使用包呢?
一旦包被创建并编译,你就可以在 SQL 语句或者 PL/SQL 块中调用它了。
方法1:使用select或者call直接调用(通过调用my_package.add_number(1, 2)
来使用这个函数)。
call my_package.add_number(1, 2);
select my_package.add_number(1, 2);
返回结果为:
add_number
------------
3
(1 row)
方法2:通过匿名块调用。
BEGIN
my_package.add_number(1, 2);
END;
/
返回结果为:
ANONYMOUS BLOCK EXECUTE
DECLARE
result NUMBER;
BEGIN
my_package.add_number(1, 2);
END;
/
返回结果为:
ANONYMOUS BLOCK EXECUTE
在 Oracle PL/SQL 中,匿名块是执行 SQL 和 PL/SQL 语句的一种方式,通常用于临时执行一段代码而不必创建存储过程。匿名块可以包含声明部分 (DECLARE
) 和执行部分 (BEGIN ... END;
)。