在本章中,无涯教程将讨论PL/SQL中的软件包,包是架构对象,将逻辑上相关的PL/SQL类型,变量和子程序分组。
规范中放置的所有对象都称为 public 对象,任何不在包规范中但在包主体中编码的子程序都称为 private 对象。
以下代码片段显示了具有单个过程的软件包规范,一个包中可以定义许多全局变量,并可以有多个过程或函数。
链接:https://www.learnfk.comhttps://www.learnfk.com/plsql/plsql-packages.html
来源:LearnFk无涯教程网
CREATE PACKAGE cust_sal AS PROCEDURE find_sal(c_id customers.id%type); END cust_sal; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Package created.
包主体具有用于程序包规范中声明的各种方法的代码以及其他私有声明,这些代码对于程序包外部的代码是隐藏的。
CREATE PACKAGE BODY 语句用于创建程序包主体。以下代码段显示了上面创建的 cust_sal 程序包的程序包主体声明。无涯教程假设无涯教程已经在数据库中创建了CUSTOMERS表,如 PL/SQL-变量一章所述。
CREATE OR REPLACE PACKAGE BODY cust_sal AS PROCEDURE find_sal(c_id customers.id%TYPE) IS c_sal customers.salary%TYPE; BEGIN SELECT salary INTO c_sal FROM customers WHERE id = c_id; dbms_output.put_line('Salary: '|| c_sal); END find_sal; END cust_sal; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Package body created.
使用以下语法访问包元素(变量,过程或函数)-
package_name.element_name;
考虑一下,无涯教程已经在数据库模式中创建了以上程序包,以下程序使用 cust_sal 的 find_sal 方法b>包-
DECLARE code customers.id%type := &cc_id; BEGIN cust_sal.find_sal(code); END; /
当以上代码在SQL提示符下执行时,它提示输入客户ID,而当您输入ID时,它将显示相应的薪水,如下所示-
Enter value for cc_id: 1 Salary: 3000 PL/SQL procedure successfully completed.
以下程序提供了更完整的程序包。无涯教程将使用存储在数据库中的CUSTOMERS表以及以下记录-
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 3000.00 | | 2 | Khilan | 25 | Delhi | 3000.00 | | 3 | kaushik | 23 | Kota | 3000.00 | | 4 | Chaitali | 25 | Mumbai | 7500.00 | | 5 | Hardik | 27 | Bhopal | 9500.00 | | 6 | Komal | 22 | MP | 5500.00 | +----+----------+-----+-----------+----------+
CREATE OR REPLACE PACKAGE c_package AS -- Adds a customer PROCEDURE addCustomer(c_id customers.id%type, c_name customerS.No.ame%type, c_age customers.age%type, c_addr customers.address%type, c_sal customers.salary%type); -- Removes a customer PROCEDURE delCustomer(c_id customers.id%TYPE); --Lists all customers PROCEDURE listCustomer; END c_package; /
当以上代码在SQL提示符下执行时,它将创建以上包并显示以下输出-
Package created.
CREATE OR REPLACE PACKAGE BODY c_package AS PROCEDURE addCustomer(c_id customers.id%type, c_name customerS.No.ame%type, c_age customers.age%type, c_addr customers.address%type, c_sal customers.salary%type) IS BEGIN INSERT INTO customers (id,name,age,address,salary) VALUES(c_id, c_name, c_age, c_addr, c_sal); END addCustomer; PROCEDURE delCustomer(c_id customers.id%type) IS BEGIN DELETE FROM customers WHERE id = c_id; END delCustomer; PROCEDURE listCustomer IS CURSOR c_customers is SELECT name FROM customers; TYPE c_list is TABLE OF customers.Name%type; name_list c_list := c_list(); counter integer :=0; BEGIN FOR n IN c_customers LOOP counter := counter +1; name_list.extend; name_list(counter) := n.name; dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter)); END LOOP; END listCustomer; END c_package; /
上面的示例使用了嵌套表。无涯教程将在下一章讨论嵌套表的概念。
当以上代码在SQL提示符下执行时,将产生以下输出-
Package body created.
以下程序使用在包 c_package 中声明和定义的方法。
DECLARE code customers.id%type:= 8; BEGIN c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500); c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500); c_package.listcustomer; c_package.delcustomer(code); c_package.listcustomer; END; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Customer(1): Ramesh Customer(2): Khilan Customer(3): kaushik Customer(4): Chaitali Customer(5): Hardik Customer(6): Komal Customer(7): Rajnish Customer(8): Subham Customer(1): Ramesh Customer(2): Khilan Customer(3): kaushik Customer(4): Chaitali Customer(5): Hardik Customer(6): Komal Customer(7): Rajnish PL/SQL procedure successfully completed
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)