欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    存储过程常用技巧解析.docx

    • 资源ID:14055163       资源大小:28.45KB        全文页数:28页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    存储过程常用技巧解析.docx

    1、存储过程常用技巧解析我们在进行pl/sql编程时打交道最多的就是存储过程了。存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识。如:游标的处理,异常的处理,集合的选择等等 1.存储过程结构 1.1 第一个存储过程 Java代码 1 create or replace procedure proc1( 2 p_para1 varchar2, 3 p_para2 out varchar2, 4 p_para3 in out varchar2 5 )as 6 v_name varchar2(20); 7 begin 8 v_name :=

    2、 张三丰; 9 p_para3 := v_name; 10 dbms_output.put_line(p_para3:|p_para3); 11 end; 上面就是一个最简单的存储过程。一个存储过程大体分为这么几个部分: 创建语句:create or replace procedure 存储过程名 如果没有or replace语句,则仅仅是新建一个存储过程。如果系统存在该存储过程,则会报错。Create or replace procedure 如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。 存储过程名定义:包括存储过程名和参数列表。参数名和参

    3、数类型。参数名不能重复, 参数传递方式:IN, OUT, IN OUT IN 表示输入参数,按值传递方式。 OUT 表示输出参数,可以理解为按引用传递方式。可以作为存储过程的输出结果,供外部调用者使用。 IN OUT 即可作输入参数,也可作输出参数。 参数的数据类型只需要指明类型名即可,不需要指定宽度。 参数的宽度由外部调用者决定。 过程可以有参数,也可以没有参数 变量声明块:紧跟着的as (is )关键字,可以理解为pl/sql的declare关键字,用于声明变量。 变量声明块用于声明该存储过程需要用到的变量,它的作用域为该存储过程。另外这里声明的变量必须指定宽度。遵循PL/SQL的变量声明

    4、规范。 过程语句块:从begin 关键字开始为过程的语句块。存储过程的具体逻辑在这里来实现。 异常处理块:关键字为exception ,为处理语句产生的异常。该部分为可选 结束块:由end关键字结果。 1.2 存储过程的参数传递方式 存储过程的参数传递有三种方式:IN,OUT,IN OUT . IN 按值传递,并且它不允许在存储过程中被重新赋值。如果存储过程的参数没有指定存参数传递类型,默认为IN Java代码 12 create or replace procedure proc1( 13 p_para1 varchar2, 14 p_para2 out varchar2, 15 p_par

    5、a3 in out varchar2 16 )as 17 v_name varchar2(20); 18 begin 19 p_para1 :=aaa; 20 p_para2 :=bbb; 21 v_name := 张三丰; 22 p_para3 := v_name; 23 dbms_output.put_line(p_para3:|p_para3); 24 null; 25 end; 26 27 Warning: Procedure created with compilation errors 28 29 SQL show error; 30 Errors for PROCEDURE LI

    6、FEMAN.PROC1: 31 32 LINE/COL ERROR 33 - - 34 8/3 PLS-00363: expression P_PARA1 cannot be used as an assignment target 35 8/3 PL/SQL: Statement ignored 这一点与其它高级语言都不同。它相当于java在参数前面加上final关键字。 OUT 参数:作为输出参数,需要注意,当一个参数被指定为OUT类型时,就算在调用存储过程之前对该参数进行了赋值,在存储过程中该参数的值仍然是null. Java代码 36 create or replace procedu

    7、re proc1( 37 p_para1 varchar2, 38 p_para2 out varchar2, 39 p_para3 in out varchar2 40 )as 41 v_name varchar2(20); 42 begin 43 v_name := 张三丰; 44 p_para3 := v_name; 45 dbms_output.put_line(p_para1:|p_para1); 46 dbms_output.put_line(p_para2:|p_para2); 47 dbms_output.put_line(p_para3:|p_para3); 48 end;

    8、49 50 SQL var p1 varchar2(10); 51 SQL var p2 varchar2(10); 52 SQL var p3 varchar2(10); 53 SQL exec :p1 :=aaaa; 54 SQL exec :p2 :=bbbb; 55 SQL exec :p3 :=cccc; 56 SQL exec proc1(:p1,:p2,:p3); 57 p_para1:aaaa 58 p_para2: 59 p_para3:张三丰 60 SQL exec dbms_output.put_line(:p2); 61 62 63 PL/SQL procedure s

    9、uccessfully completed 64 p2 65 - INOUT 是真正的按引用传递参数。即可作为传入参数也可以作为传出参数。 Java代码 66 1.3 存储过程参数宽度 67 create or replace procedure proc1( 68 p_para1 varchar2, 69 p_para2 out varchar2, 70 p_para3 in out varchar2 71 )as 72 v_name varchar2(2); 73 begin 74 v_name := p_para1; 75 end; 76 77 SQL var p1 varchar2(1

    10、0); 78 SQL var p2 varchar2(20); 79 SQL var p3 varchar2(30); 80 SQL exec :p1 :=aaaaaa; 81 SQL exec proc1(:p1,:p2,:p3); 82 83 84 ORA-06502: PL/SQL: numeric or value error: character string buffer too small 85 ORA-06512: at LIFEMAN.PROC1, line 8 86 ORA-06512: at line 1 首先,我们要明白,我们无法在存储过程的定义中指定存储参数的宽度,也

    11、就导致了我们无法在存储过程中控制传入变量的宽度。这个宽度是完全由外部传入时决定的。 我们再来看看OUT类型的参数的宽度。 Java代码 87 create or replace procedure proc1( 88 p_para1 varchar2, 89 p_para2 out varchar2, 90 p_para3 in out varchar2 91 )as 92 v_name varchar2(2); 93 begin 94 p_para2 :=aaaaaaaaaaaaaaaaaaaa; 95 end; 96 SQL var p1 varchar2(1); 97 SQL var p

    12、2 varchar2(1); 98 SQL var p3 varchar2(1); 99 SQL exec :p2 :=a; 100 SQL exec proc1(:p1,:p2,:p3); 在该过程中,p_para2被赋予了20个字符a. 而在外部的调用过程中,p2这个参数仅仅被定义为varchar2(1). 而把p2作为参数调用这个过程,却并没有报错。而且它的真实值就是20个a Java代码 101 SQL select dump(:p2) from dual; 102 DUMP(:P2) 103 - 104 Typ=1 Len=20: 97,97,97,97,97,97,97,97,97

    13、,97,97,97,97,97,97,97,97,97,97,97 105 p2 106 - 107 aaaaaaaaaaaaaaaaaaaa 108 109 再来看看IN OUT参数的宽度 110 create or replace procedure proc1( 111 p_para1 varchar2, 112 p_para2 out varchar2, 113 p_para3 in out varchar2 114 )as 115 v_name varchar2(2); 116 begin 117 p_para3 :=aaaaaaaaaaaaaaaaaaaa; 118 end; 11

    14、9 120 SQL var p1 varchar2(1); 121 SQL var p2 varchar2(1); 122 SQL var p3 varchar2(1); 123 SQL exec proc1(:p1,:p2,:p3); 执行这个过程,仍然正确执行。 可见,对于IN参数,其宽度是由外部决定。 对于OUT 和IN OUT 参数,其宽度是由存储过程内部决定。 因此,在写存储过程时,对参数的宽度进行说明是非常有必要的,最明智的方法就是参数的数据类型使用%type。这样双方就达成了一致。 1.3 参数的默认值 存储过程的参数可以设置默认值 Java代码 124 create or re

    15、place procedure procdefault(p1 varchar2, 125 p2 varchar2 default mark) 126 as 127 begin 128 dbms_output.put_line(p2); 129 end; 130 131 SQL set serveroutput on; 132 SQL exec procdefault(a); mark 可以通过default 关键字为存储过程的参数指定默认值。在对存储过程调用时,就可以省略默认值。 需要注意的是:默认值仅仅支持IN传输类型的参数。OUT 和 IN OUT不能指定默认值 对于有默认值的参数不是排在

    16、最后的情况。 Java代码 133 create or replace procedure procdefault2(p1 varchar2 default remark, 134 p2 varchar2 ) 135 as 136 begin 137 dbms_output.put_line(p1); 138 end; 第一个参数有默认值,第二个参数没有。如果我们想使用第一个参数的默认值时 exec procdefault2(aa); 这样是会报错的。 那怎么变呢?可以指定参数的值。 Java代码 139 SQL exec procdefault2(p2 =aa); remark 这样就OK了

    17、,指定aa传给参数p2 2. 存储过程内部块 2.1 内部块 我们知道了存储过程的结构,语句块由begin开始,以end结束。这些块是可以嵌套。在语句块中可以嵌套任何以下的块。 Java代码 140 Declare begin exception end; 141 create or replace procedure innerBlock(p1 varchar2) 142 as 143 o1 varchar2(10) := out1; 144 begin 145 dbms_output.put_line(o1); 146 declare 147 inner1 varchar2(20); 14

    18、8 begin 149 inner1 :=inner1; 150 dbms_output.put_line(inner1); 151 152 declare 153 inner2 varchar2(20); 154 begin 155 inner2 := inner2; 156 dbms_output.put_line(inner2); 157 end; 158 exception 159 when others then 160 null; 161 end; 162 end; 需要注意变量的作用域。 3.存储过程的常用技巧 3.1 哪种集合? 我们在使用存储过程的时候经常需要处理记录集,也就

    19、是多条数据记录。分为单列多行和多列多行,这些类型都可以称为集合类型。我们在这里进行比较这些集合类型,以便于在编程时做出正确的选择。 索引表,也称为pl/sql表,不能存储于数据库中,元素的个数没有限制,下标可以为负值。 Java代码 163 type t_table is table of varchar2(20) index by binary_integer; 164 v_student t_table; varchar2(20)表示存放元素的数据类型,binary_integer表示元素下标的数据类型。 嵌套表,索引表没有 index by子句就是嵌套表,它可以存放于数据中,元素个数无限

    20、,下标从1开始,并且需要初始化 Java代码 165 type t_nestTable is table of varchar2(20); 166 v_class t_nestTable ; 仅是这样声明是不能使用的,必须对嵌套表进行初始化,对嵌套表进行初始化可以使用它的构造函数 Java代码 167 v_class :=t_nestTable(a,b,c); 变长数组,变长数组与高级语言的数组类型非常相似,下标以1开始,元素个数有限。 Java代码 168 type t_array is varray (20) of varchar2(20); varray(20)就定义了变长数组的最大元素

    21、个数是20个 变长数组与嵌套表一样,也可以是数据表列的数据类型。 同时,变长数组的使用也需要事先初始化。 类型 可存储于数据库 元素个数 是否需初始化 初始下标值 索引表 否 无限 不需 嵌套表 可 无限 需 1 可变数组 可 有限(自定义) 需 1 由此可见,如果仅仅是在存储过程中当作集合变量使用,索引表是最好的选择。 3.2 选用何种游标? 显示游标分为:普通游标,参数化游标和游标变量三种。 下面以一个过程来进行说明 Java代码 169 create or replace procedure proccursor(p varchar2) 170 as 171 v_rownum numbe

    22、r(10) := 1; 172 cursor c_postype is select pos_type from pos_type_tbl where rownum =1; 173 cursor c_postype1 is select pos_type from pos_type_tbl where rownum = v_rownum; 174 cursor c_postype2(p_rownum number) is select pos_type from pos_type_tbl where rownum = p_rownum; 175 type t_postype is ref cu

    23、rsor ; 176 c_postype3 t_postype; 177 v_postype varchar2(20); 178 begin 179 open c_postype; 180 fetch c_postype into v_postype; 181 dbms_output.put_line(v_postype); 182 close c_postype; 183 open c_postype1; 184 fetch c_postype1 into v_postype; 185 dbms_output.put_line(v_postype); 186 close c_postype1

    24、; 187 open c_postype2(1); 188 fetch c_postype2 into v_postype; 189 dbms_output.put_line(v_postype); 190 close c_postype2; 191 open c_postype3 for select pos_type from pos_type_tbl where rownum =1; 192 fetch c_postype3 into v_postype; 193 dbms_output.put_line(v_postype); 194 close c_postype3; 195 end

    25、; cursor c_postype is select pos_type from pos_type_tbl where rownum =1 这一句是定义了一个最普通的游标,把整个查询已经写死,调用时不可以作任何改变。 cursor c_postype1 is select pos_type from pos_type_tbl where rownum = v_rownum; 这一句并没有写死,查询参数由变量v_rownum来决定。需要注意的是v_rownum必须在这个游标定义之前声明。 cursor c_postype2(p_rownum number) is select pos_typ

    26、e from pos_type_tbl where rownum = p_rownum; 这一条语句与第二条作用相似,都是可以为游标实现动态的查询。但是它进一步的缩小了参数的作用域范围。但是可读性降低了不少。 type t_postype is ref cursor ; c_postype3 t_postype; 先定义了一个引用游标类型,然后再声明了一个游标变量。 open c_postype3 for select pos_type from pos_type_tbl where rownum =1; 然后再用open for 来打开一个查询。需要注意的是它可以多次使用,用来打开不同的查询

    27、。 从动态性来说,游标变量是最好用的,但是阅读性也是最差的。 注意,游标的定义只能用使关键字IS,它与AS不通用。 3.3 游标循环最佳策略 我们在进行PL/SQL编程时,经常需要循环读取结果集的数据。进行逐行处理,这个过程就需要对游标进行循环。对游标进行循环的方法有多种,我们在此一一分析。 Java代码 196 create or replace procedure proccycle(p varchar2) 197 as 198 cursor c_postype is select pos_type, description from pos_type_tbl where rownum 6

    28、; 199 v_postype varchar2(20); 200 v_description varchar2(50); 201 begin 202 open c_postype; 203 if c_postype%found then 204 dbms_output.put_line(found true); 205 elsif c_postype%found = false then 206 dbms_output.put_line(found false); 207 else 208 dbms_output.put_line(found null); 209 end if; 210 l

    29、oop 211 fetch c_postype into v_postype,v_description ; 212 exit when c_postype%notfound; 213 dbms_output.put_line(postype:|v_postype|,description:|v_description); 214 end loop; 215 close c_postype; 216 dbms_output.put_line(-loop end-); 217 open c_postype; 218 fetch c_postype into v_postype,v_description; 219 while c_postype%found loop 220 dbms_output.put_line(postype:|v_postype|,description:|v_description); 221 fetch c_postype into v_postype,v_description ; 222 end loop; 223 22


    注意事项

    本文(存储过程常用技巧解析.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开