Oracle存储过程语法学习Procedure+实例.docx

上传人:b****6 文档编号:8621712 上传时间:2023-02-01 格式:DOCX 页数:9 大小:19.65KB
下载 相关 举报
Oracle存储过程语法学习Procedure+实例.docx_第1页
第1页 / 共9页
Oracle存储过程语法学习Procedure+实例.docx_第2页
第2页 / 共9页
Oracle存储过程语法学习Procedure+实例.docx_第3页
第3页 / 共9页
Oracle存储过程语法学习Procedure+实例.docx_第4页
第4页 / 共9页
Oracle存储过程语法学习Procedure+实例.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

Oracle存储过程语法学习Procedure+实例.docx

《Oracle存储过程语法学习Procedure+实例.docx》由会员分享,可在线阅读,更多相关《Oracle存储过程语法学习Procedure+实例.docx(9页珍藏版)》请在冰豆网上搜索。

Oracle存储过程语法学习Procedure+实例.docx

Oracle存储过程语法学习Procedure+实例

存储过程创建语法:

(1)无参

createorreplaceprocedure存储过程名

as

变量1类型(值范围);

变量2类型(值范围);

Begin

      ........................

Exception

      ........................

End;

(2)带参

createorreplaceprocedure存储过程名(param1intype,param2outtype)

as

变量1类型(值范围);

变量2类型(值范围);

Begin

   Selectcount(*)into变量1from表Awhere列名=param1;

   If(判断条件)then

      Select列名into变量2from表Awhere列名=param1;

      Dbms_output.Put_line(‘打印信息’);

   Elseif(判断条件)then

      Dbms_output.Put_line(‘打印信息’);

   Else

      Raise异常名(NO_DATA_FOUND);

   Endif;

Exception

   Whenothersthen

      Rollback;

End;

注意事项:

1, 存储过程参数不带取值范围,in表示传入,out表示输出

2, 变量带取值范围,后面接分号

3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录

4, 用select。

into。

给变量赋值

5, 在代码中抛异常用raise+异常名

以命名的异常

命名的系统异常                         产生原因

ACCESS_INTO_NULL                  未定义对象

CASE_NOT_FOUND                    CASE中若未包含相应的WHEN,并且没有设置

ELSE时

COLLECTION_IS_NULL               集合元素未初始化

CURSER_ALREADY_OPEN         游标已经打开

DUP_VAL_ON_INDEX                  唯一索引对应的列上有重复的值

INVALID_CURSOR                在不合法的游标上进行操作

INVALID_NUMBER                      内嵌的SQL语句不能将字符转换为数字

NO_DATA_FOUND                       使用selectinto未返回行,或应用索引表未初始化的 

TOO_MANY_ROWS                     执行selectinto时,结果集超过一行

ZERO_DIVIDE                             除数为0

SUBSCRIPT_BEYOND_COUNT    元素下标超过嵌套表或VARRAY的最大值

SUBSCRIPT_OUTSIDE_LIMIT      使用嵌套表或VARRAY时,将下标指定为负数

VALUE_ERROR                            赋值时,变量长度不足以容纳实际数据

LOGIN_DENIED                          PL/SQL应用程序连接到oracle数据库时,提供了不正确的用户名或密码

NOT_LOGGED_ON                      PL/SQL应用程序在没有连接oralce数据库的情况下访问数据

PROGRAM_ERROR                      PL/SQL内部问题,可能需要重装数据字典&pl./SQL系统包

ROWTYPE_MISMATCH               宿主游标变量与PL/SQL游标变量的返回类型不兼容

SELF_IS_NULL                            使用对象类型时,在null对象上调用对象方法

STORAGE_ERROR                       运行PL/SQL时,超出内存空间

SYS_INVALID_ID                        无效的ROWID字符串

TIMEOUT_ON_RESOURCE        Oracle在等待资源时超时 

例子:

1 createorreplaceprocedurerunbyparmeters (isalinemp.sal%type,

                           snameoutvarchar,sjobinoutvarchar)

2 asicountnumber;

3 begin

4      selectcount(*)intoicountfromempwheresal>isalandjob=sjob;

5      ificount=1then

6        ....

9      else

10        ....

12      endif;

13 exception

14      whentoo_many_rowsthen

15      DBMS_OUTPUT.PUT_LINE('返回值多于1行');

16      whenothersthen

17      DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!

');

18 end;

过程调用

 方式一

1 declare

2       realsalemp.sal%type;

3       realnamevarchar(40);

4       realjobvarchar(40);

5 begin

6       realsal:

=1100;

7       realname:

='';

8       realjob:

='CLERK';

9       runbyparmeters(realsal,realname,realjob);    --必须按顺序

10       DBMS_OUTPUT.PUT_LINE(REALNAME||'  '||REALJOB);

11 END;

12

 方式二

1declare

2      realsalemp.sal%type;

3      realnamevarchar(40);

4      realjobvarchar(40);

5begin

6      realsal:

=1100;

7      realname:

='';

8      realjob:

='CLERK';

9      runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob); --指定值对应变量顺序可变

10      DBMS_OUTPUT.PUT_LINE(REALNAME||'  '||REALJOB);

11END;

说明:

(1)使用%TYPE

在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据。

在这种情况下,变量应该拥有与表列相同的类型。

例如,students表的first_name列的类型为VARCHAR2(20),我们可以按照下述方式声明一个变量

DECLARE

v_FirstNameVARCHAR2(20);

但是如果first_name列的定义改变了会发生什么(比如说表改变了,first_name现在的类型变为VARCHAR2(25))?

那就会导致所有使用这个列的PL/SQL代码都必须进行修改。

如果你有很多的PL/SQL代码,这种处理可能是十分耗时和容易出错的。

这时,你可以使用”%TYPE”属性而不是将变量类型硬性编码。

(2)使用%ROWTYPE (相当于定义一个struct来进行存放,以对象来看对数据)

在PL/SQL中将一个记录声明为具有相同类型的数据库行的作法是很常见的。

PL/SQL提供了%ROWTYPE运算符,使得这样的操作更为方便。

例如:

DECLARE

v_StudentRecordstudents%ROWTYPE;

将定义一个记录,该记录中的字段将与students表中的列相对应。

例如:

declare

   v_jobshr.jobs%rowtype;

begin

   select

     *

   into

     v_jobs

   from

     hr.jobs

wherejob_id='&aa';

   dbms_output.put_line('序号'||v_jobs.job_id);

   dbms_output.put_line('名称'||v_jobs.job_title);

end;

执行,我们输入aa变量的值:

AD_VP

输出结果为:

序号AD_VP

名称AdministrationVicePresident

 

存储过程实例

 

存储过程包含三部分:

声明,执行部分,异常。

    

可以有无参数程序和带参数存储过程。

    

无参程序语法    

1createorreplaceprocedureNoParPro   

2as  ;   

3begin   

4 ;   

5exception   

6     ;   

7end;   

8    

  

  带参存储过程实例    

1createorreplaceprocedurequeryempname(sfindnoemp.empno%type)as   

2       sNameemp.ename%type;   

3       sjobemp.job%type;   

4begin   

5       ....   

7exception   

         ....   

14end;   

15    

  

  带参数存储过程含赋值方式    

1createorreplaceprocedurerunbyparmeters (isalinemp.sal%type,    

                           snameoutvarchar,sjobinoutvarchar)   

2 asicountnumber;   

3 begin   

4      selectcount(*)intoicountfromempwheresal>isalandjob=sjob;   

5      ificount=1then   

6        ....   

9      else  

10        ....   

12      endif;   

13 exception   

14      whentoo_many_rowsthen   

15      DBMS_OUTPUT.PUT_LINE('返回值多于1行');   

16      whenothersthen   

17      DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!

');   

18 end;   

19    

  

 过程调用   

 方式一   

1declare   

2       realsalemp.sal%type;   

3       realnamevarchar(40);   

4       realjobvarchar(40);   

5 begin   

6       realsal:

=1100;   

7       realname:

='';   

8       realjob:

='CLERK';   

9       runbyparmeters(realsal,realname,realjob);    --必须按顺序   

10       DBMS_OUTPUT.PUT_LINE(REALNAME||'  '||REALJOB);   

11 END;   

12    

  

 方式二   

1declare   

2      realsalemp.sal%type;   

3      realnamevarchar(40);   

4      realjobvarchar(40);   

5begin   

6      realsal:

=1100;   

7      realname:

='';   

8      realjob:

='CLERK';   

9      runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob); --指定值对应变量顺序可变   

10      DBMS_OUTPUT.PUT_LINE(REALNAME||'  '||REALJOB);   

11END;   

12   

oracle存储过程的基本语法

1.基本结构

CREATEORREPLACEPROCEDURE存储过程名字

   参数1INNUMBER,

   参数2INNUMBER

)IS

变量1INTEGER:

=0;

变量2DATE;

BEGIN

END存储过程名字

2.SELECTINTOSTATEMENT

 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条

 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)

 例子:

 BEGIN

 SELECTcol1,col2into变量1,变量2FROMtypestructwherexxx;

 EXCEPTION

 WHENNO_DATA_FOUNDTHEN

     xxxx;

 END;

 ...

3.IF判断

 IFV_TEST=1THEN

   BEGIN

      dosomething

   END;

 ENDIF;

4.while循环

 WHILEV_TEST=1LOOP

 BEGIN

XXXX

 END;

 ENDLOOP;

5.变量赋值

 V_TEST:

=123;

6.用forin使用cursor

 ...

 IS

 CURSORcurISSELECT*FROMxxx;

 BEGIN

FORcur_resultincurLOOP

 BEGIN

  V_SUM:

=cur_result.列名1+cur_result.列名2

 END;

ENDLOOP;

 END;

7.带参数的cursor

 CURSORC_USER(C_IDNUMBER)ISSELECTNAMEFROMUSERWHERETYPEID=C_ID;

 OPENC_USER(变量值);

 LOOP

FETCHC_USERINTOV_NAME;

EXITFETCHC_USER%NOTFOUND;

   dosomething

 ENDLOOP;

 CLOSEC_USER;

8.用pl/sqldeveloperdebug

 连接数据库后建立一个TestWINDOW

 在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

关于oracle存储过程的若干问题备忘

1.在oracle中,数据表别名不能加as,如:

selecta.appnamefromappinfoa;--正确

selecta.appnamefromappinfoasa;--错误

也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧

2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。

 selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=fid;--有into,正确编译

 selectaf.keynodefromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=fid;--没有into,编译报错,提示:

Compilation

 Error:

PLS-00428:

anINTOclauseisexpectedinthisSELECTstatement

3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"nodatafound"异常。

  可以在该语法之前,先利用selectcount(*)from查看数据库中是否存在该记录,如果存在,再利用select...into...

4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错

selectkeynodeintoknfromAPPFOUNDATIONwhereappid=aidandfoundationid=fid;--正确运行

selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=appidandaf.foundationid=foundationid;--运行阶段报错,提示

ORA-01422:

exactfetchreturnsmorethanrequestednumberofrows

5.在存储过程中,关于出现null的问题

假设有一个表A,定义如下:

createtableA(

idvarchar2(50)primarykeynotnull,

vcountnumber(8)notnull,

bidvarchar2(50)notnull--外键

);如果在存储过程中,使用如下语句:

selectsum(vcount)intofcountfromAwherebid='xxxxxx';如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:

fcountnumber(8):

=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:

iffcountisnullthen

   fcount:

=0;

endif;这样就一切ok了。

6.Hibernate调用oracle存储过程

       this.pnumberManager.getHibernateTemplate().execute(

               newHibernateCallback()...{

                   publicObjectdoInHibernate(Sessionsession)

                           throwsHibernateException,SQLException...{

                       CallableStatementcs=session

                               .connection()

                               .prepareCall("{callmodifyapppnumber_remain(?

)}");

                       cs.setString(1,foundationid);

                       cs.execute();

                       returnnull;

                   }

               });

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 军事政治

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1