oracle储存过程培训资料Word格式.docx

上传人:b****5 文档编号:20492264 上传时间:2023-01-23 格式:DOCX 页数:26 大小:26.11KB
下载 相关 举报
oracle储存过程培训资料Word格式.docx_第1页
第1页 / 共26页
oracle储存过程培训资料Word格式.docx_第2页
第2页 / 共26页
oracle储存过程培训资料Word格式.docx_第3页
第3页 / 共26页
oracle储存过程培训资料Word格式.docx_第4页
第4页 / 共26页
oracle储存过程培训资料Word格式.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

oracle储存过程培训资料Word格式.docx

《oracle储存过程培训资料Word格式.docx》由会员分享,可在线阅读,更多相关《oracle储存过程培训资料Word格式.docx(26页珍藏版)》请在冰豆网上搜索。

oracle储存过程培训资料Word格式.docx

interger整型

2.2.3存储的基本结构

1.存储过程包含三部分:

声明,执行部分,异常.

2.3创建储存过程简单命令

2.3.1创建储存过程

1.从Window打开SQL*Plus并且从SQL*Plus登录到你的数据库;

打开skeleton.sql文件.

2.在SQL>

命令提示符下输入以下命令:

SQL>

@skeleton

注释:

(SQL*Plus装载skeleton.sql文件的内容到SQL*Plus缓冲区,

并且执行SQL*Plus语句;

SQL*Plus会通知你存储过程已经被成功地创建)

3.写一个存储过程,实例:

CREATEORREPLACEPROCEDUREskeleton

IS

BEGIN

DBMS_OUTPUT.PUT_LINE('

HelloWorld!

'

);

END;

2.3.2运行一个存储过程命令

EXECUTEskeleton;

注释(SQL*Plus输出一下信息确信存储过程成功执

即PL/SQLproceduresuccessfullycompleted).

2.3.3查看储存打印信息

1.在SQL*Plus命令行提示符,键入:

SETSERVEROUTPUTON

2.再次敲入SQL>

EXECUTEskeleton即可.

注释:

查看存储过程中的打印语句信息,必须实行以上命令.

2.3.4删除一个存储过程

命令:

SQL>

DROPPROCEDUREskeleton;

2.4存储过程

2.4.1存储过程基本结构

CREATEORREPLACEPROCEDURE存储过程名字

参数1INNUMBER,

参数2INNUMBER

)IS

变量1INTEGER:

=0;

变量2DATE;

BEGIN

END存储过程名字;

2.4.2存储过程的基本语法

2.4.2.0LOOP循环

Counter:

LOOP

counter:

=counter+1;

EXITWHENcounter=5;

ENDLOOP;

2.4.2.1IF判断

IFstr1>

str2then

result:

=1;

ELSIFstr2>

str1THEN

=-1;

ELSE

=0;

ENDIF

2.4.2.2while循环

Counter:

WHILEcounter<

6LOOP

=counter+1;

2.4.2.3变量定义及赋值

declare

realsalemp.sal%type;

realnamevarchar(40);

realjobvarchar(40);

Pricenumber(5,2);

Product_idinterger;

realjob:

=‘work’;

Product_id:

=100001;

realname:

='

Brunhilda'

;

Price:

=3.1415;

this_day:

=TODAY;

2.4.2.4for使用

1,方式一:

FORcur_resultREVERSE1..5LOOP

DBMS_OUTPUT.PUT_LINE(cur_result);

ENDLOOP;

2.方式二:

IS

CURSORcurISSELECT*FROMxxx;

FORcur_resultincurLOOP

V_SUM:

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

2.4.2.5带参数的cursor

CURSORC_USER(C_IDNUMBER)IS

SELECTNAMEFROMUSERWHERETYPEID=C_IDNUMBER;

OPENC_USER(变量值);

LOOP

FETCHC_USERINTOV_NAME;

EXITFETCHC_USER%NOTFOUND;

…………………….

CLOSEC_USER;

与存储过程和函数相似,可以将参数传递给游标并在查询中使用.

2.4.2.6存储过程操作符

+

-

*

/

||合并如:

sp_str1=“ASD”||”ERT”,则:

sp_str1=“ASDERT”

2.4.2.7存储过程结构块

BEGIN

第一步处理;

第二步处理;

第三步处理;

2.4.2.8存储过程异常错误控制

exception

whentoo_many_rowsthen

返回值多于1行'

whenothersthen

在RUNBYPARMETERS过程中出错!

2.4.2.9存储过程游标

FORrecINcur_testLOOP

DBMS_OUTPUT.put_line(rec.p_number);

DBMS_OUTPUT.put_line(rec.p_name);

DBMS_OUTPUT.put_line(rec.p_manager);

DBMS_OUTPUT.put_line(rec.p_client);

2.4.2.10存储过程条件表达式

存储过程if条件表达式

比较符<

\>

\<

=\>

=\=\<

>

\!

=

ANDORNOT

(NOT)BETWEENAND

(NOT)IN(,,,,)

IS(NOT)NULL

(NOT)LIKE

2.4.2.11存储过程控制语句的跳出

exit 

when 

eixt

注释:

exit语句可立即结束循环

exitwhen语句是在指定条件下结束循环,并且可以出现在循环代码中

的任何位置.

2.4.2.12存储过程返回值out

Oracle存储过程的返回值,必须在创建一个存储过程时定义.

2.4.2.13存储过程的执行

Executespdata;

Executespdata(var1);

Executespdata(var1=值1,var2=值,2);

2.4.2.14隐形游标

1.dml语句是指:

insert、update、delete和locktable的操作.

2.对dml操作会产生隐式游标.

3.隐式游标只使用sql%found,sql%notfound,sql%rowcount三个属性.

4.sql%found,sql%notfound是布尔值,sql%rowcount是整数值。

5.sql%found为true,sql%notfound为false,

6.在执行任何dml语句之前,sql%rowcount的值都是null

7.%ROWCOUNT返回当前位置为止游标读取的记录行数.

2.4.2.15%type属性

1.在pl/sql中可以将变量和常量声明为内建或用户定义的数据类型,

以引用一个列名,同时继承他的数据类型和大小.

delcare

v_anumber(5):

=10;

v_bv_a%type:

=15;

v_cv_a%type;

2.5开发一个储存过程

2.5.1不带参数的储存过程

1.如果没有orreplace语句,则仅仅是新建一个存储过程,如果系统存在该存储过程,则会报错。

Createorreplaceprocedure如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程.

2.存储过程名定义:

包括存储过程名和参数列表,参数名和参数类型,参数名不能重复.

3.as(is)为关键字,可以理解为pl/sql的declare关键字,用于声明变量.

createorreplaceprocedurerunbyparmeters

begin

selectcount(*)intoicountfromempwheresal>

isalandjob=sjob;

ificount=1then

....

else

endif;

exception//存储过程异常

whentoo_many_rowsthen

DBMS_OUTPUT.PUT_LINE('

whenothersthen

end;

2.5.2带参数存储过程含赋值

1.sal%type目的是为了保持与传参过来的数据宽度一致.

2.IN/OUT即可作输入参数,也可作输出参数。

3.变量声明块:

紧跟着的as(is)关键字,用于声明变量。

4.IN按值传递,并且它不允许在存储过程中被重新赋值。

如果存储过程的参数没有指定存参数传递类型,默认为IN.

5.OUT参数:

作为输出参数,需要注意,当一个参数被指定为OUT类型时,就算在调用存储过程之前对该参数进行了赋值,在存储过程中该参数的值仍然是null.

createorreplaceprocedurerunbyparmeters(isalinemp.sal%type,

snameoutvarchar,sjobinoutvarchar)

asicountnumber;

begin

在RUNBYPARMETERS过程中出错'

2.5.3参数的存储过程默认值

1.可以通过default关键字为存储过程的参数指定默认值。

在对存储过程调用时,就可以省略默认值。

2.默认值仅仅支持IN传输类型的参数。

OUT和INOUT不能指定默认值

createorreplaceprocedureprocdefault(p1varchar2,

p2varchar2default'

mark'

as

begin

dbms_output.put_line(p2);

end;

execprocdefault('

a'

或者SQL>

execprocdefault2(p2=>

aa'

例如二:

createorreplaceprocedureprocdefault2(p1varchar2default'

remark'

p2varchar2)

dbms_output.put_line(p1);

execprocdefault2('

//注释:

这种赋值方式是错误的.

execprocdefault2(sjob=>

p2);

2.5.4.存储过程调用方式

2.5.4.1方式一:

realsalemp.sal%type;

realnamevarchar(40);

realjobvarchar(40);

realsal:

=1100;

realname:

='

realjob:

CLERK'

runbyparmeters(realsal,realname,realjob);

--必须按顺序

DBMS_OUTPUT.PUT_LINE(REALNAME||'

'

||REALJOB);

(输出模式)

END;

2.5.4.2方式二:

runbyparmeters(sname=>

realname,isal=>

realsal,sjob=>

realjob);

---指定值对应变量顺序可变

(输出模式)

2.5.5游标的使用

2.5.5.1实例一:

1.游标的定义只能用使关键字IS,它与AS不通用.

2loop循环.

createorreplaceproceduredept_procedure(ainvarchar2,v_aoutdept%rowtype)

is

--声明游标

cursorc_de(ainvarchar2)

isselect*fromdeptwheredname=a;

begin

--打开游标,对其中找到的记录进行遍历

openc_de(a);

loop

fetchc_deintov_a;

exitwhenc_de%notfound;

//(exitwhen语句一定要紧跟在fetch之后。

必避免多余的数据处理。

dbms_output.put_line('

deptno:

||v_a.deptno);

dname:

||v_a.dname);

loc:

||v_a.loc);

endloop;

close 

c_de;

2.5.5.2实例二:

1.for循环

2.注意for循环rec这个变量无需要在循环外进行声明,无需要为其指定数据类型,它应该是一个记录类型,具体的结构是由游标决定的。

CREATEORREPLACEPROCEDUREtest(v_numberproject.p_number%TYPE,

v_nameproject.p_name%TYPE,

v_managerproject.p_manager%TYPE,

v_clientproject.p_client%TYPE

CURSORcur_testIS

SELECTp_number,p_name,p_manager,p_clientFROMprojectWHEREp_nameLIKE'

S%'

;

INSERTINTOprojectVALUES(v_number,v_name,v_manager,v_client);

COMMIT;

EXCEPTION

WHENOTHERSTHEN

ROLLBACK;

DBMS_OUTPUT.put_line(SQLERRM);

2.5.5.3实例三:

1.while循环

createorreplaceprocedureproccycle(pvarchar2)

cursorc_postypeisselectpos_type,descriptionfrompos_type_tblwhererownum<

6;

v_postypevarchar2(20);

v_descriptionvarchar2(50);

openc_postype;

ifc_postype%foundthen

dbms_output.put_line('

foundtrue'

elsifc_postype%found=falsethen

foundfalse'

foundnull'

endif;

fetchc_postypeintov_postype,v_description;

whilec_postype%foundloop

fetchc_postypeintov_postype,v_description;

closec_postype;

先取数据后循环,防止直接退出.while来循环处理游标是最复杂的方法

2.5.6储存过程嵌套

2.5.6.1实例一:

createorreplaceprocedureinnerBlock(p1varchar2)

o1varchar2(10):

out1'

inner1varchar2(20);

dbms_output.put_line(o1);

inner1:

inner1'

dbms_output.put_line(inner1);

exception

whenothersthennull;

end;

2.5.7储存过程建表

2.5.7.1实例一:

createorreplaceprocedureskeleton

executeimmediate'

createtabletable1(idnumber,namevarchar2(20))'

end;

2.5.8储存过程调试

2.5.8.1实例一:

declare

param_outvarchar2(28);

param_inoutvarchar2(28);

param_inout:

ff'

proce_test('

dd'

param_out,param_inout);

dbms_output.put_line(param_out);

Oracle调试主要根据用户开发的逻辑来决定,这里就不详解.

2.5.9系统异常错误信息

2.5.9.1系统报错关键字

ACCESS_INTO_NULL试图给为初始化对象的属性赋值

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

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_DENIEDPL/SQL应用程序连接到oracle数据库时,提供了不正确的用户名或密码

NOT_LOGGED_ONPL/SQL应用程序在试图连接数据库之前访问数据库中的数据

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

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

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

STORAGE_ERROR运行PL/SQL时,内存用尽或者内存出现问题

SYS_INVALID_ID无效的ROWID字符串

TIMEOUT_ON_RESOURCE当数

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

当前位置:首页 > 医药卫生 > 预防医学

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

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