zoukankan      html  css  js  c++  java
  • Oracle存储过程

    1.存储过程概念优点

    1.概念

    存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用存储过程。

    简单的说就是专门干一件事一段sql语句。

    可以由数据库自己去调用,也可以由java程序去调用。

    2.优点

    使用存储过程或函数的优点:
    1、可重复调用;
    2、由于其预编译性,所以执行效率高;
    3、由于其封装性,安全性高
    4、可对数据库进行复杂操作,包括调用其他存储过程或函数等。

    2. 存储过程语法格式

    创建存储过程的语法如下所示:

    CREATE [OR REPLACE] PROCEDURE [schema.]procedure_name
    [ ( [{IN | OUT | IN OUT}] datatype [default|:=value],
    ...) ]
    {IS | AS}
    [description part 说明部分]
    BEGIN
     SQL STATEMENT 语句序列
     [EXCEPTION 例外处理]
    END [procedure _Name 过程名];

    过程参数说明:

    • OR REPLACE 是一个可选的关键字,建议用户使用此关键字。如果过程已经存在,该关键字将重新创建过程,这样就不必删除和重新创建过程。
    • 关键字IS 和 AS均可,它们本身没有区别。IS/AS后面是一个完整的PL/SQL块,可以定义局部变量,但不能以DECLARE开始。局部变量在过程内部存放值。
    • 形式参数可以有三种模式:IN、OUT、IN OUT。如果没有为形式参数指定模式,那么默认的模式是IN。

    3.创建/调用无参存储过程

    例1:向产品表中插入一条新信息

    CREATE  PROCEDURE Insertpro  IS
    BEGIN
       INSERT INTO products(productid,productname)
       VALUES( 20,‘aa');
      EXCEPTION
         WHEN DUP_VAL_ON_INDEX THEN
                dbms_output.put_line(‘产品编号已存在');
         WHEN OTHERS THEN
                dbms_output.put_line('发生其他错误');
    END;

    注意:

    • 不论编译是否成功,创建过程/函数命令CREATE PROCEDURE或CREATE FUNCTION都将自动把其源代码存入数据库中,而编译代码只有在编译成功后才能存入数据库中。
    • 只有编译代码被存入到数据库的存储过程和函数才能被调用。

     4.创建/调用带参存储过程

    IN、OUT、IN OUT三种模式的描述

    模  式

    描  述

    IN参数(默认模式)

    (输入参数)

    用来从调用环境中向存储过程传递值,不能给IN参数赋值,给此参数传递的值可以是常量、有值的变量、表达式等。

    OUT参数(输出参数)

    用来从过程中返回值给调用者,不能将此参数的值赋给另一个变量,不能是常量或 表达式。在过程体内,必须给OUT参数赋值。

    IN OUT参数

    (输入输出参数)

    既可以从调用者向过程中传递值,执行过程后还可返回可能改变了的值给调用者。

    例2:创建带输入参数的存储过程,向产品表插入一个新的产品信息,使用异常设置错误信息(供应商编号或类别编号 不存在).

    CREATE OR REPLACE PROCEDURE Para_InsertProd
       (prodid number,prodname nvarchar2,suppid number,cateid number default 1)
      IS
       e_noSuppCate EXCEPTION;
       Pragma EXCEPTION_INIT(e_noSuppCate,-2291);
    BEGIN
       INSERT INTO products(productid,productname, supplierid, categoryid)
       VALUES(prodid, prodname, suppid, cateid);
      commit;
      EXCEPTION
         WHEN DUP_VAL_ON_INDEX THEN
               dbms_output.put_line ('产品编号已存在');
         WHEN e_noSuppCate THEN
     dbms_output.put_line(‘供应商编号或类别编号不存在');
    END;

    带输入参数存储过程的调用格式:

    1) 位置表示法
    EXEC[UTE] procedure_name(参数值1,参数值2 …);
    2) 名称表示法
    EXEC[UTE] procedure_name(参数名1=>参数值1,参数名2=>参数值2 …);
    3) 混合表示法
         当用户使用名称表示法后,后续的参数必须使用名称表示法。
    例3:创建带输出参数的存储过程,用于查询orderdetails表中某产品的总销量和总销售金额,并将其值返回,如记录不存在产生异常即设置错误信息(该产品不存在).

    CREATE OR REPLACE PROCEDURE Paraout_orderDetail
       (prodid in number,
    t_quant out orderdetails.quantity%type,
    t_uprice out orderdetails.unitprice%type)
      IS
    BEGIN
       SELECT sum(quantity),sum(quantity*unitprice)
       INTO  t_quant, t_uprice   FROM orderdetails
       WHERE productid=prodid
      Group by productid;
    EXCEPTION
         WHEN no_data_found THEN
    Dbms_output.put_line(‘该产品信息不存在’);
    END;

    带输出参数存储过程的调用格式:

    SQL PLUS中绑定输出参数值
    variable 输出参数变量1 数据类型,输出参数变量2 数据类型 …;
    调用存储过程
    EXEC[UTE] procedure_name(参数值1,…参数名n,:绑定变量1,  :绑定变量2….);

    1) SQL PLUS命令行中执行带输出参数的存储过程

    SQL>variable qt number;
    SQL>variable tprice  number;
    SQL>EXEC Paraout_orderDetail(1,:qt,:tprice);
    SQL>print qt;
    SQL>print tprice;

    2)SQL PLUS中在程序块中调用存储过程

    DECLARE
       qt number;
       tprice  number;
    BEGIN
       Paraout_orderDetail(1,qt,tprice);
       dbms_output.put_line(qt);
       dbms_output.put_line(tprice);
    END;

    例4:创建带输入/输出参数的存储过程, 用于对两个数进行交换.

    CREATE OR REPLACE PROCEDURE  swap(p_num1 IN OUT number, p_num2 IN OUT number)
    IS
       temp number;
    BEGIN
     temp:=p_num1 ;
     p_num1:=p_num2;
     p_num2:=temp;
    END;
    --过程内的局部变量只能在过程内使用
    --建立PL/SQL程序块调用存储过程:
    DECLARE
    V_max number:=20;
    V_min number:=29;
    BEGIN
     if v_max< V_min then
         swap(v_max, V_min);
    End if;
       dbms_output.put_line(‘v_max:’||v_max);
       dbms_output.put_line(‘v_min:’||v_min);
    END;

    注意:

    • 如果形式参数是IN模式的参数,实际参数可以是一个具体的值或一个有值的变量;
    • 如果形式参数是OUT模式的参数,实际参数必须是一个变量,当调用过程后,此变量就被赋值了。可以输出此变量的值来测试过程执行的结果。
    • 如果形式参数是IN OUT模式的参数,则实际参数必须是一个预先已经赋值的变量。执行完过程后,该变量被重新赋值,可以输出此变量的值来测试过程执行结果
  • 相关阅读:
    文件内容排名算法,输入排名函数,返回排名后的文件名
    线段树做大数据排序
    给字符排序-基类排序二分查找-JavaScript
    后缀数组、名次数组-JavaScript
    二分查找法、二分去重排序法,返回最接近的位置和实际位置
    用四叉树对图像分类,获取tag和key
    Linux显示所在Git分支
    Linux中设置Git显示颜色
    屏蔽网页广告
    tf.add_to_collection,tf.get_collection简介
  • 原文地址:https://www.cnblogs.com/CX66/p/14056820.html
Copyright © 2011-2022 走看看