PL/pgSQL-Package

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;)。

相关链接

  • 32
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值