首页  > 趣味发现  > 

plsql调试存储过程,oracle存储过程基本使用

  • 浏览4858次
  • www.lenqiu.com
  • 评论0条
  • 导读plsql调试存储过程~存储过程在数据库开发的过程中使用比较频繁,它也有着普通sql语句不可替代的作用,可以有效的提程序的执行效率。存储过程可以简单的理解为在数据库中执行的某种带特定功能的程序,其中包含一条或多条sql语句,它的语法大体与PLSQL相同,也有其自身...

    存储过程在数据库开发的过程中使用比较频繁,它也有着普通sql语句不可替代的作用,可以有效的提程序的执行效率。存储过程可以简单的理解为在数据库中执行的某种带特定功能的程序,其中包含一条或多条sql语句,它的语法大体与PLSQL相同,也有其自身的不同。

    首先我们创建一张表

    create table class(id int not null,--班级idclass_name varchar2(20)--班级名字);

    创建一个存储过程

    create or replace procedure findclass --创建或修改存储过程,存储过程名为findclassas totalClass number(1); --创建一个数字类型的变量,totalClassbegin --存储过程开始select count(*) into totalClass from class; --把count计数出来的数量 通过into赋值给totalClass变量DBMS_OUTPUT.put_line('总班级数'||totalClass); --数据库输出数量end findclass; --存储过程结束

    执行存储过程,这里我用的是plsqldev这个工具,所以有三种执行方法,其中有两种是代码执行,一种是工具执行

    --执行存储过程方法1::callcall findclass();--执行存储过程方法2:begin endbeginfindclass();end;

    执行结果显示在output窗口

    oracle存储过程基本使用

    执行存储过程的第三种方法,也是开发过程中最常用的方法,就是plsqldev工具自带的test方法执行存储过程,该方法可以对存储过程进行断点调试
    在plsqldev中所有的存储过程都可以在Procedures文件夹中找到

    oracle存储过程基本使用

    找到需要执行的存储过程右键出现选择菜单

    oracle存储过程基本使用

    点击test出现如下界面

    oracle存储过程基本使用

    点击单步运行,进入断点模式,点击单步当执行到findclass时,会进入到代码断点界面,在Variable输入变量名后可跟在Value跟踪变量值的变化

    oracle存储过程基本使用

    特别说明,如果单步断点模式无法进行,可在右键test之前先右键选择Add debug information即可。

    以上就是我们执行的一个最简单的存储过程,但是在实际开发过程中,我们是会带有参数条件的存储过程。

    存储过程的参数有三种

      in 输入参数,作为存储过程中的sql的查询条件使用

      out输出参数,作为存储过程查询结果输出

      inout输入输出参数,当一个变量既要作为条件输入,也要作为结果输出的时候,可以用此类型参数
      使用语法

    --param 表示参数名,in表示参数类型为输入,type表示参数类型param in type

    下面就把findclass这个存储过程做一定的修改

    --创建或修改存储过程,存储过程名为findclass,输入参数为classId,输出classNamecreate or replace procedure findclass(classId in int,className out varchar2)as --存储过程开始begin --把查询出来的class_name 赋值给输出变量className,查询条件为classIdselect class_name into className from class where id = classId;--数据库输出数量,这句输出只是方便测试,真正输出的值是out的值DBMS_OUTPUT.put_line('班级名:'||className);--存储过程结束end findclass;

    右键选择存储过程test,因为存储过程带有参数,需要输入参数

    oracle存储过程基本使用

    单步过程同样可以监控参数变化

    oracle存储过程基本使用

    当执行到代码第8行的时候,可以监控到输出参数classname为J130,这里特别说明下,在存储过程中需要监控的参数需要自己输入到监控界面Variable处。

    oracle存储过程基本使用

    执行完成,输出结果J130

    oracle存储过程基本使用

    在实际项目中,我们也会遇到需要同时输入,输出几个参数的情况
    首先,在建立一张学生表

    create table student(id int not null,--学生idstudent_name varchar2(20),--学生姓名fk_class int --班级外键);

    创建一个多参数的存储过程,通过班级ID查询出班级名字及该班级所有的学生,本来最简单的方法就是一个连表查询就OK了,在这里我们模拟一下稍微复杂点的情况,使用游标来进行操作。

    --创建或修改存储过程,存储过程名为findclass,输入参数为classId,输出classNamecreate or replace procedure findclass(classId in int,classStudents out sys_refcursor,className out varchar2)as--定义一个游标的方式有多种,可以显示定义CURSOR cursor_name is select * from table,也可以定义动态游标,游标关键词CURSORTYPE ref_cursor_type IS REF CURSOR; --定义一个动态游标students ref_cursor_type; --定义班级集合为一个游标类型student_row student%rowtype; --定义班级类型,类型为student表行类型--存储过程开始begin --把查询出来的class_name 赋值给输出变量className,查询条件为classIdselect class_name into className from class where id = classId;--打开游标并赋值open students for select * from student where fk_class =classId;--把查询结果赋值给输出变量,实际上可以直接open classStudents for select * from student where fk_class =classId;classStudents := students;--循环输出游标,循环有三种方式,for in循环,fetch循环,while循环--fetch循环loop  fetch classStudents into student_row;  --当循环到空跳出循环  EXIT WHEN classStudents%NOTFOUND;  DBMS_OUTPUT.put_line('学生名:'||student_row.student_name);end loop;  DBMS_OUTPUT.put_line('班级名:'||className);--存储过程结束end findclass; 

    输出结果

    oracle存储过程基本使用

    这里特别说明,如果查询中有多个变需要into赋值,只需要写一个into就可以了

    --这样赋值是错误的select student_name into studentName,class_name into className from class;--正确写法,into前面写table列名,后面写需要赋值的变量名,顺序要对select student_name,class_name into studentName,className from class;

    Oracle存储过程编写

    Oracle存储过程在实际数据库开发过程当中会经常使用到,作为一个数据库开发者必备的技能,它有着SQL语句不可替代的作用。所谓存储过程,就是一段存储在数据库中执行某块业务功能的程序模块。它是由一段或者多段的PL/SQL代码块或者SQL语句组成的一系列代码块。

    创建Oracle存储过程语法:

    create [or replace] procedure 过程名( p1 in|out datatype, p2 in|out datatype, ... pn in|out datatype ) is   ....--声明部分 begin  ....--过程体 end;

    语法解析:

    1、procedure 关键字是创建存储过程的命令。

    2、create [or replace] :如果存储过程已经存在则覆盖替代原有的过程。

    3、in|out :存储过程具有入参和出参两种参数选择,in表示的是入参,out表示的是出参,在使用过程的时候,入参必须得有对应的变量传入,出参得有对应的变量接收。

    4、datatype表示出入参变量对应的数据类型。

    5、is后面跟着的是过程当中使用到的声明变量。

    6、begin...end 中间编写的就是存储过程的具体操作。


    例子1、创建一个存储过程计算学生某一个课程中成绩在班中的排名,使用存储过程进行计算,返回对应的排名,代码如下:

    create or replace procedure sp_score_pm(p_in_stuid in varchar2,--学号p_in_courseid in varchar2, --课程IDp_out_pm out number--排名)isls_score number:=0;ls_pm number:=0;begin --获取该学生的成绩 select t.score into ls_score from score t where t.stuid = p_in_stuid and t.courseid = p_in_courseid; --获取成绩比该学生高的人数 select count(1) into ls_pm from score t where t.courseid = p_in_courseid and t.score>ls_score; --得到该学生的成绩排名 p_out_pm:=ls_pm+1;exception when no_data_found then dbms_output.put_line('该学生的课程:'||p_in_courseid|| '的成绩在成绩表中找不到');end;

    通过上面的代码,我们可以直接在SQL窗口执行编译,编译成功后,我们就可以调用存储过程来获取学生对应的课程成绩排名了,存储过程需要出入参赋值,因此我们可以通过PL/SQL语句块进行测试,代码如下:

    declarels_pm number;--排名begin --SC201801001 sp_score_pm('SC201801001','R20180101',ls_pm); dbms_output.put_line('学号:SC201801001,课程号:R20180101 的成绩排名是:'||ls_pm); sp_score_pm('SC201801001','R20180102',ls_pm); dbms_output.put_line('学号:SC201801001,课程号:R20180102 的成绩排名是:'||ls_pm); --SC201801002 sp_score_pm('SC201801002','R20180101',ls_pm); dbms_output.put_line('学号:SC201801002,课程号:R20180101 的成绩排名是:'||ls_pm); sp_score_pm('SC201801002','R20180102',ls_pm); dbms_output.put_line('学号:SC201801002,课程号:R20180102 的成绩排名是:'||ls_pm); end;

    结果如下:

    Oracle存储过程编写

    存储过程的作用

    存储过程的编写相对比较复杂,但是在实际系统开发过程中,还是利用过程来处理一些特定的业务功能,把业务逻辑编写在过程当中。它有哪些优势呢?

    1、降低总体开发成本。存储过程把实际执行的业务逻辑PL/SQL块和多条SQL语句封装到存储过程当中,其它开发者只需要调用写好的过程,获取想要的结果,不需要重新理解业务。把业务抽取出来由专门的人来编写。

    2、增加数据的独立性。它的作用和视的作用类似,假如表的基础数据发生变化,我们只需要修改过程当中的代码,而不需要修改调用程序。使得用户程序不需要直接面对基础数据进行编写代码。使得代码内聚程度更高,耦合度更低。

    3、提高性能。实际开发过程中,一个业务模块功能的开发可能需要用到多个SQL语句,多个PL/SQL程序块才能解决问题。把它编写进过程,Oracle只需要一次编译,以后随时可以调用。如果不使用过程,直接把许多SQL语句写进程序当中,需要多次编译,而且需要多次连接数据库,大大的降低了性能。

    分享一个分析Oracle存储过程性能小技巧

    概述

    最近接触了物流数据库这一块,OLAP类型的系统,有好多存储过程后面需要去做优化,因为写存储过程中会遇到存储过程执行时间太长问题,如果能知道存储过程里面具体的执行情况是如何的就可以帮助我们进一步分析。所以今天就顺便分享下怎么用PLSQLDeveloper工具去了解存储过程里面具体的执行情况。


    1、添加调试信息

    打开存储过程所在的文件夹,右击存储过程,添加调试信息:Add debug Information,然后点击Test

    分享一个分析Oracle存储过程性能小技巧分享一个分析Oracle存储过程性能小技巧

    2、点击Create Profiler report

    如下所示:

    分享一个分析Oracle存储过程性能小技巧

    3、执行存储过程

    按F8或者如下所示的按钮执行存储过程,如下

    分享一个分析Oracle存储过程性能小技巧分享一个分析Oracle存储过程性能小技巧

    4、执行完存储过程点击Profiler选项卡查看分析报表

    如下所示:

    分享一个分析Oracle存储过程性能小技巧

    说明:

    unit --单元的名称,即执行的存储过程line --代码的行号total time --此行执行时间occurrences --此行共执行了多少次text --对应代码行

    通过这个报表,就可以知道对应行的执行时间,这就可以对SQL进行分析优化。


    分析存储过程后大家就可以针对存储过程耗时比较多的地方来进行优化了,后面小编会分享更多DBA方面内容,感兴趣的朋友走一波哩~

    分享一个分析Oracle存储过程性能小技巧
    云云是个小公举