orientdb数据库-PL/SQL包

跨零代码为大家提供高品质的解决方案,请大家多多来访,跨零不胜感激,在此谢过。

在本章中,我们将讨论PL/SQL中的包。 包是模式对象,将逻辑上相关的PL/SQL类型,变量和子程序分组。

一个包将有两个强制性的部分 –

  • 包规范/格式
  • 包体或定义

包规范

规范是包的接口。它只是声明可以从包外部引用的类型,变量,常量,异常,游标和子程序。 换句话说,它包含有关包的内容的所有信息,但不包括子程序的代码。

所有放置在规范中的对象被称为公共对象。任何不在包规范中但在包体中编码的子程序称为私有对象。

以下代码片段显示了包含单个过程的包规范。可以在一个包中定义许多全局变量和多个过程或函数。

SET SERVEROUTPUT ON SIZE 99999; CREATE PACKAGE cust_sal AS     PROCEDURE find_sal(c_id customers.id%type);  END cust_sal;  / 

当上面的代码在SQL提示符下执行时,它会产生以下结果 –

PL/SQL包

包体

包体具有包规范中声明的各种方法代码和其他私有声明,这些声明对包之外的代码是隐藏的。

CREATE PACKAGE BODY语句用于创建包体。以下代码片段显示了上面创建cust_sal包的包体声明。假定已经在数据库中创建了CUSTOMERS表,有关customers表的结构和数据,可参考以下SQL语句 –

CREATE TABLE CUSTOMERS(     ID   INT NOT NULL,     NAME VARCHAR (20) NOT NULL,     AGE INT NOT NULL,     ADDRESS CHAR (25),     SALARY   DECIMAL (18, 2),            PRIMARY KEY (ID)  );    -- 数据 INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)  VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)  VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)  VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );  INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)  VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );   INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)  VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)  VALUES (6, 'Komal', 22, 'MP', 4500.00 ); 

基于上述customers表,创建一个简单的包体 –

SET SERVEROUTPUT ON SIZE 99999; 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提示符下执行时,它会产生以下结果 –

PL/SQL包

使用包元素

包元素(变量,过程或函数)是用下面的语法来访问的 –

package_name.element_name; 

考虑一下,假设已经在数据库模式中创建了上面的包,下面的程序中需要调用cust_sal包趾的find_sal方法 –

SET SERVEROUTPUT ON SIZE 9999; DECLARE     code customers.id%type := &cc_id;  BEGIN     cust_sal.find_sal(code);  END;  / 

当上述代码在SQL提示符下执行时,它会提示输入客户ID,当输入一个ID时,显示相应的工资如下 –

PL/SQL包

示例

以下程序提供了一个更完整的包体。使用存储在数据库中的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 |  +----+----------+-----+-----------+----------+ 

包规范

SET SERVEROUTPUT ON SIZE 99999; CREATE OR REPLACE PACKAGE c_package AS     -- Adds a customer     PROCEDURE addCustomer(c_id customers.id%TYPE,     c_name  customers.name%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提示符下执行时,它会创建上面的包并显示以下结果 –

PL/SQL包

创建程序包体

CREATE OR REPLACE PACKAGE BODY c_package AS     PROCEDURE addCustomer(c_id  customers.id%type,        c_name customers.name%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提示符下执行时,它会产生以下结果 –

程序包体已创建。 

使用程序包

以下程序使用程序包:c_package 中声明和定义的方法。

SET SERVEROUTPUT ON SIZE 99999; DECLARE     code customers.id%type:= 8;  BEGIN     c_package.addcustomer(7, 'Andy Liu', 25, 'Chennai', 3500);     c_package.addcustomer(8, 'Kobe Bryant', 32, 'Delhi', 7500);     c_package.listcustomer;     c_package.delcustomer(code);     c_package.listcustomer;  END;  / 

当上面的代码在SQL提示符下执行时,它会产生以下结果 –

Old salary: New salary: 3500 Salary difference: Old salary: New salary: 7500 Salary difference: Customer(1)Ramesh Customer(2)Khilan Customer(3)kaushik Customer(4)Chaitali Customer(5)Hardik Customer(6)Komal Customer(7)Andy Liu Customer(8)Kobe Bryant Customer(1)Ramesh Customer(2)Khilan Customer(3)kaushik Customer(4)Chaitali Customer(5)Hardik Customer(6)Komal Customer(7)Andy Liu  PL/SQL 过程已成功完成。 

  

从零到一,创造未来!跨零综合IT问题解决服务站,欢迎你的到来。Oracle数据库教程 plsql数据库/a> 只为你绽放。

本文固定链接: http://kua0.com/2019/05/15/orientdb数据库-pl-sql包/

为您推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注