• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Oracle中命名块之存储过程的详解及使用方法
    POST TIME:2021-10-18 21:52

    一、匿名块和命名块

    ◆PL/SQL块分为良好总:命名块和匿名块。

    ◆匿名块:以declare或begin开始,每次执行匿名块都要通过客户端工具将其发送给Oracle,经过语法分析、编译然后执行。

    ◆命名块:具有名称的PL/SQL块,这些命名块被存储在Oracle中,编译一次,以后只可调用就可多次执行。如:存储过程、存储函数、包、触发器等、

      存储过程:无返回值;
      存储函数:有返回值;
      包:可容纳多个过程或函数的一个容器(较好管理这些过程和函数,类似于java中的包);
      触发器:在合适的实际被自动执行。(无需调用,在满足要求的情况下,自动执行;触发器也被称为隐式执行的命名块!)

    ◆匿名块和命名块的区别:

      匿名块:能够动态地创建和执行过程代码的PL/SQL结构,每次执行匿名块时就会自动的将该块数据通过文本的形式发送给Oracle,然后执行,反馈给用户,每次执行都需发送和编译!
      命名块:持久化的方式将代码作为数据库属性储存在系统目录中,在Oracle中编译一次,下次若使用可直接调用执行,无需再次编译,非常高效。

    二、存储过程:

    存储过程是具有名称、完整特定功能和无返回值的PL/SQL块,只需发送调用命令即可执行该过程,能够实现代码的重用,不能在SQL语句当中调用!

    ◆创建存储过程:

    格式:create[or replace] procedure proc_name
         [(para1[int|out|in out]type,...)]
         {is|AS}
         prdc_body
     
    

      proc_name表示存储过程名;
      para1表示参数名;type是参数para1的数据类型;
      proc_body表示过程体.过程体是遵循PL/SQL块的结构,但不能使用declare关键字,end后面可带有过程名。 

    注意:参数列表是可选的

    ◆调用存储过程:(存储过程创建的时候会自动的保存在Oracle中,在执行储存过程的时候,PL/SQL块只需调用即可!)

      (1)如果在PL/SQL块中调用,直接使用proc_name(...);
      (2)如果使用sql plus环境中,需要使用 EXEC proc_name(...)的形式;
      (3)如果存储过程无参数,这调用时可带有圆括号也可不带! 

    【示例】创建一个无参数的存储过程(显示所有员工的信息)

    create or replace procedure pr_show_employee 
    is
    --进入块的声明部分(无需编写declare关键字)
       --定义游标
       cursor v_emp_cursor is select * from employees;
       --定义游标类型的记录型行变量
       v_emp_record v_emp_cursor%rowtype;
    begin
       for v_emp_record in v_emp_cursor loop
         dbms_output.put_line(v_emp_record.employee_id||','||v_emp_record.first_name||','||
                   v_emp_record.last_name||','||v_emp_record.salary);
       end loop;
    end pr_show_employee ;
    

    --调用存储过程(在一个匿名块中执行)

    begin
       pr_show_employee();
    end; 
    

    【示例】存储过程的参数接受产品类别编号,输出该类所有产品的信息

    create or replace procedure pr_show_product(
    product_type products.product_type_id%type)
    as
     --定义游标
     cursor v_prd_cursor is select * from products p where product_type = p.product_type_id;
     --定义游标的行类型变量
     v_prd_record v_prd_cursor%rowtype;
    begin
       for v_prd_record in v_prd_cursor loop
      dbms_output.put_line(v_prd_record.product_id||','||v_prd_record||','||product_type_id||','||v_prd_record.description||','
    ||v_prd_record.
    name||','||v_prd_record.price);
       end loop;
    end pr_show_product;
    
    
    --调用存储过程(执行)
    declare
        --定义编号变量的类型
        v_prd_type_id products.product_type_id%type := 1;
    begin
       pr_show_product(v_prd_type_id);
    end; 
    
    

    ◆参数的传递模式:

      参数传递有三种模式:in、out、in out
      in:过程调用时,实参的值会传递给形参。形参被看作是常量,在过程内部不能被修改。
      out:过程调用时,实参的值被忽略,形参为null值,在过程内部形参变量可以读写。过程结束时,形参的值赋值给实参!
      in out:过程调用时,实参的值传递给形参,在过程内部形参变量可读可写,过程结束时,形参的值赋值给实参。 

    注意:如果在定义存储过程时,没有指明参数传递模式,则默认为 in 模式

    【示例】创建一个有参数传递默认的存储过程

    create or replace procedure pr_test(p_1 in out varchar2)
    is 
    
    
    begin
       dbms_output.put_line('p_1='||p_1);
       p_1 := 'abc'; 
       dbms_output.put_line('p_1='||p_1);
    end pr_test;
    
    
    

    --调用存储过程

    declare
      v_1 varchar2(5) := 'wwww';
    begin
      pr_test(v_1); 
      dbms_output.put_line('v_1='||v_1);
    end;
    
    

    注意:(1)在创建存储过程时,形参类型不能指定具体的长度,字符类型就为 varchar2,数字类型就是number;默认和实参类型的长度等同

         (2)使用 in 模式,形参接受实参的值,默认形参为常量,在存储过程当中不能被修改,否则出错!
         (3)使用 out 模式,实参的值被忽略,但必须是变量,用来接收存储过程执行完形参的值;而形参是可读可写的。
         (4)使用 in out 模式,实参的值传递给形参,也必须是变量,形参可读可写,最后执行完存储过程形参的值传递给实参!
         (5)参数传递,实参的值和长度或精度约束会传递给形参,因此,形参不能有长度或精度的约束。在过程中给形参赋值时,要注意它的长度或精度的限制!

    感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!

    您可能感兴趣的文章:
    • ORACLE 10g 安装教程[图文]
    • Oracle数据库下载及安装图文操作步骤
    • Oracle存储过程基本语法介绍
    • oracle常用sql语句
    • oracle 创建表空间详细介绍
    • ORACLE常用数值函数、转换函数、字符串函数
    • oracle数据库tns配置方法详解
    上一篇:Oracle查询表里的重复数据方法
    下一篇:如何将Oracle的一个大数据表快速迁移到 Sqlserver2008数据库(图文教程)
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信