120.Oracle数据库SQL开发之 PLSQL编程——包

120.Oracle数据库SQL开发之 PLSQL编程——包

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50086975

把过程和函数一起组织到包中。包可以将彼此相关的功能划分到一个自包含的单元。通过这种方式将PL/SQL代码模块化。

         包通常由两个部分组成:规范和包体。

         规范列出可用的过程、函数、类型和对象。所有的数据库用户都可以访问这些条目,因此这些条目称为公有项目。

         包体中任务在规范中未列出的项目对于这个包体都是私有对象。私有项目只能用在包体内。

         通过将公有项目和私有项目结合起来,可以构建出非常复杂的包结构,这种复杂性外部是看不到的。

1.  创建包规范

CREATE PACKAGE语句用于创建包规范。

如下:

CREATE PACKAGE product_package AS

  TYPEt_ref_cursor IS REF CURSOR;

  FUNCTIONget_products_ref_cursor RETURN t_ref_cursor;

  PROCEDUREupdate_product_price (

   p_product_id IN products.product_id%TYPE,

   p_factor     IN NUMBER

  );

END product_package;

/

2.  创建包体

CREATE PACKAGE BODY语句用于创建包体。

CREATE PACKAGE BODY product_package AS

  FUNCTIONget_products_ref_cursor

  RETURNt_ref_cursor IS

   v_products_ref_cursor t_ref_cursor;

  BEGIN

    -- get theREF CURSOR

    OPEN v_products_ref_cursorFOR

      SELECTproduct_id, name, price

      FROMproducts;

 

    -- returnthe REF CURSOR

    RETURNv_products_ref_cursor;

  ENDget_products_ref_cursor;

 

  PROCEDUREupdate_product_price (

   p_product_id IN products.product_id%TYPE,

   p_factor     IN NUMBER

  ) AS

   v_product_count INTEGER;

  BEGIN

    -- countthe number of products with the

    -- suppliedproduct_id (will be 1 if the product exists)

    SELECTCOUNT(*)

    INTOv_product_count

    FROMproducts

    WHERE product_id= p_product_id;

 

    -- if theproduct exists (v_product_count = 1) then

    -- updatethat product's price

    IFv_product_count = 1 THEN

      UPDATEproducts

      SET price= price * p_factor

      WHEREproduct_id = p_product_id;

      COMMIT;

    END IF;

  EXCEPTION

    WHEN OTHERSTHEN

      ROLLBACK;

  ENDupdate_product_price;

END product_package;

/

3.  调用包中的函数和过程

调用包中的函数和过程时,应该在调用中使用包名。

如下:

store@PDB1> selectproduct_package.get_products_ref_cursor from dual;

 

GET_PRODUCTS_REF_CUR

--------------------

CURSOR STATEMENT : 1

 

CURSOR STATEMENT : 1

 

PRODUCT_ID NAME                                PRICE

---------- ----------------------------------------

         13Lunar Landing                      15.99

         14Submarine                            15.99

         15Airplane                                15.99

          1 Modern Science                      60

          2 New Chemistry                       35

          3 Supernova                            25.99

          4 Tank War                              13.95

          5 Z Files                           49.99

          6 2412: The Return                         14.95

          7 Space Force 9                      13.49

          8 From Another Planet                  12.99

          9 Classical Music                   10.99

         10Pop 3                            15.99

         11Creative Yell                         14.99

         12My Front Line                      13.49

 

15 rows selected.

调用如下:

 

store@PDB1> CALLproduct_package.update_product_price(3,1.25);

 

Call completed.

 

store@PDB1> select price from products whereproduct_id = 3;

 

    PRICE

----------

    32.49

4.  获取有关包中函数和过程的信息

从user_procedures视图中可以获得某个包中的函数和过程的信息。

如下:

store@PDB1> select object_name,procedure_name fromuser_procedures where object_name='PRODUCT_PACKAGE';

 

OBJECT_NAME

----------------------------------------------------------------------------------------------------

PROCEDURE_NAME

----------------------------------------------------------------------------------------------------

PRODUCT_PACKAGE

GET_PRODUCTS_REF_CURSOR

 

PRODUCT_PACKAGE

UPDATE_PRODUCT_PRICE

 

PRODUCT_PACKAGE

5.  删除包

使用DROP PACKAGE语句用于删除包。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PL/SQL编程 pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展。pl/sql不仅允许嵌入式sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误。这样使得他的功能变的更强大。缺点是移植性不好。 编写一个存储过程,向表中添加数据。 1. create table mytest (name varchar2(30),passwd varchar2(30)); 2. create or replace procedure xxc_pro1 is begin insert into mytest values ('小红','m123'); end; 3. 调用过程 exec 过程名(参数1,参数2…)或call 过程名参数1,参数2…) ① exec xxc_pro1; 或者是 ② call xxc_pro1; pl/sql可以做什么? 块:括过程、函数、触发器、。 编写规范: 1. 注释 --:单行注释 eg:select * from emp where empno=7788;--取得员工信息 /*……*/多行注释 2. 表示符号(变量)的命名规范: ① 当定义变量时,建议用v_作为前缀:v_ename ② 当定义常量时,建议用c_作为前缀:c_rate ③ 当定义游标时,建议用_cursor作为后缀:emp_cursor ④ 当定义例外时,建议用e_作为前缀:e_error 块(block)是pl/sql的今本程序单元,编写pl/sql程序实际上就是在编写pl/sql块;pl/sql块由三部分组成:定义部分,执行部分,例外处理部分。 declare --可选部分 /*定义部分:定义常量,变量,游标,例外,复杂数据类型*/ begin --必选部分 /*执行部分:要执行的pl/sql语句和sql语句*/ exception --可选部分 /*例外处理部分:处理运行的各种错误*/ 实例1:只含执行部分的pl/sqlSQL> set serveroutput on --打开输出 SQL> begin 2 dbms_output.put_line('hello'); 3 end; 4 / 说明:dbms_output是oracle提供的,该含一些过程,put_line就是其中之一。 实例2:含定义部分和执行部分 SQL> declare 2 v_ename varchar2(5); 3 begin 4 select ename into v_ename from emp where empno = &no; 5 dbms_output.put_line('雇员名'||v_ename); 6 end; 7 / 说明:&:从控制台输入变量,会弹出一个对话框。 实例3.同时输出雇员名和工资 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno=&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 end; 8 / 含定义,执行,和例外处理的pl/sql块。 实例4.当输入的员工号不存在时 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno =&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 exception --异常处理部分 8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,。 过程 过程用于执行特定的操作,当执行过程的时候,可以指定输入参数(in),也可以指定输出参数(out)。通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来改变员工工资。 --案例 create or replace procedure xxc_pro3(newname in varchar2,newsal in number) is begin update emp set sal=newsal where ename=newname; end;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值