版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据库操作与管理语言Oracle SQL Oracle PL/SQL语言基础/过程/触发器本章目标标PL/SQL语语言基本本结构PL/SQL变变量和常常量的声声明PL/SQL程程序的执执行部分分了解PL/SQL常用用函数存储过程程触发器自定义函函数游标PL/SQL简简介PL/SQL(ProceduralLanguage/SQL,过程语语言/SQL)它是结合合Oracle过程语语言和结结构化查查询语言言的一种种扩展语语言PL/SQL支支持多种种数据类类型,可可以使用用条件语语句和循循环语句句等控制制结构PL/SQL可可用于创创建存储储过程、触发器器和程序序包,也也可以用用来处理理业务规规则、数数
2、据库事事件或给给SQL命令的的执行添添加程序序逻辑PL/SQL的的优点支持SQL支持面向向对象编编程(OOP)更好的性性能可移植性性与SQL集成安全性PL/SQL的的基本结结构-1PL/SQL语语言是程程序化程程序设计计语言。块(Block)是PL/SQL程程序中最最基本的的结构,所有PL/SQL程程序都是是由块组组成。PL/SQL的的块由变变量声明明、程序序代码和和异常处处理代码码3部分分组成:DECLARE标记声明明部分变量的声声明,必必须要在在begin前前面声明一些些变量、常量、用户定定义的数数据类型型及游标标name varchar(30);-声明明时不设设置值name varcha
3、r(30):=Jack;-声声明带有有默认值值name %type; -直接引引用一个个表的数数据类型型BEGIN标记主程程序体部部分开始始主程序体体,在这这里可以以加入各各种合法法语句EXCEPTION标记异常常处理部部分开始始异常处理理程序,当程序序中出现现错误时时执行这这一部分分END标记主程程序体结结束部分分PL/SQL基基本结构构-2declare说明部分分(变变量说明明,光标标申明,例外说明明 begin语句序列列(DML语句exception例外处理理语句End;/PL/SQL字字符集PL/SQL语语言有效效字符包包括以下下三类所有大写写和小写写英文字字母0
4、9的的阿拉伯伯数字操作符,包括(、)、+、-、*、/、!、=、%等PL/SQL标标识符标识符的的最大长长度为30个字字符,不不区分大大小写,但建议议在标识识符中适适当使用用大小写写,以增增加程序序的可读读性。PL/SQL的的运算符符PL/SQL语语言的运运算符算术运算算符加(+)、减(-)、乘(*)、除(/)、乘方方(*)和连连接(|)关系运算算符=、(或!=)、=、=、BETWEEN.AND.、IN、LIKE、ISNULL逻辑运算算符逻辑与(AND)、逻辑或或(OR)、逻辑非非(NOT)PL/SQL常常量和变变量在PL/SQL程序运运行时,需要定定义一些些变量来来存放一一些数据据。常量量和变
5、量在在使用前前必须声声明,可可以使用用DECLARE对变变量进行行声明,语法如如下:DECLARE:=默认认值;.在DECLARE块中中可以同同时声明明多个常常量和变变量。声声明普通通常量或或变量是是需要说说明以下下信息:常量或变变量的名名称常量或变变量的数数据类型型变量说明明说明变量(char,varchar2,date,number,boolean, long)记录变量量分量的的引用:emp_rec.ename:=ADAMS;说明变量量名、数数据类型型和长度度后用分分号结束束说明语语句。引用型变变量,即即my_name的类类型与emp表表中ename列的类类型一样样记录型变变量集声明常量量
6、声明常量量的基本本格式如如下:constant:=;:=为为赋值语语句关键字constant表示示声明的的是常量量。常量量一旦定定义,在在以后的的使用中中其值不不再改变变。一些固定定的大小小为了防防止有人人改变,最好定定义成常常量。例如Pass_Score constant INTEGER:=60;声明变量量声明变量量的基本本格式如如下:(宽度度):=;变量声明明是没有有关键字字,但要要指定数数据类型型,宽度度和初始始值可以以定义也也可以不不定义。例如Address VARCHAR2(30):=地址未未知;PL/SQL对对一个未未初始化化的变量量,将被被默认赋赋值为NULL例如Address
7、VARCHAR2(30);PLSQL案例例-1:-打开开输出setseveroutputon-声明一一个变量量并输出出declarename varchar(10):=HelloWorld;begindbms_output.put_line(name);end;案例-2:例如SETSERVEROUTPUT ON;DECLAREPass_Score constant INTEGER:=60;Address VARCHAR2(30):=北京京海淀区区;BEGINDBMS_OUTPUT.PUT_LINE(Pass_Score);DBMS_OUTPUT.PUT_LINE(Address);END;使用
8、SETSERVEROUTPUT ON命令设置置环境变变量SERVEROUTPUT为打打开状态态,从而而使PL/SQL程序序能够在在SQL*Plus中中输出结结果使用函数数DBMS_OUTPUT.PUT_LINE()可以以输出参参数的值值PL/SQL程程序的执执行部分分PL/SQL程程序的执执行部分分包括赋值语句句流程控制制语句SQL语语句游标语句句使用赋值值语句可以在声声明变量量时或处处理变量量时设置置初始值值。也可可以在程程序的执执行部分分对变量量进行赋赋值。SETServerOutPut ON;DECLARETrainNameVARCHAR2(30);BEGINTrainName:=Ora
9、cle Administration;-赋赋值一个个新值Dbms_output.put_line(TrainName);END;运行结果果如下图图所示接收用户户的输入入赋值:在declare之前前,可以以通过acceptsomeVarprompt提示示信息;要求求用户输输入在后面的的代码中中,可以以通过地地址引用用&someVal接接收这值值-接收收用户的的输入setserveroutput on-要求求用户输输入一个个串,如如果不输输入后面面也可以以直接引引用,只只是一个个提示而而已acceptage promptplz enter anumber:;declarennnumber;begi
10、nnn:=&age;dbms_output.put_line(你输入入的信息息是|nn);end;从查询中中结果中中赋值:用into关键键字可以以将查询询结果的的值,设设置给变变量:setserveroutput ondeclareidvarchar(30);nmvarchar(30);beginselectid,nameintoid,nmfrom personwhereid=P001;dbms_output.put_line(编号|id|名称称|nm);-以下下是异常常处理-可可选exceptionwhen NO_DATA_FOUNDthendbms_output.put_line(没有你你
11、要查询询的数据据);when othersthendbms_output.put_line(其他错错误);end;流程控制制语句流程控制制语句是是所有过过程性程程序语言言的关键键PL/SQL的的主要控控制语句句如下:if.thenelsif thenendif;判断if正确则则执行then,否则则执行else(elsif为嵌套套判断)注意elsif,里面面少一下下e.Casevarwhenthenwhenthenend有逻辑的的从数值值中做出出选择Loopexitendloop循环控制制,用判判断语句句执行exitLoopexitwhenendloop同上,当当when为真真时执行行exitw
12、hile.loopendloop当while为为真时循循环for.in.loopendloop已知循环环次数的的循环条件语句句IF-1IF语句句是根据据条件表表达式的的值决定定执行相相应的程程序段。语法结结构如下下:IFTHEN.ELSIFTHEN.ELSEENDIF;其中ELSIF子句是是可选项项。注意是ELSIF而不不是ELSEIF条件语句句IF-2程序中说说明一个个整型变变量Number,使使用IF语句判判断Number变量量是正数数、负数数或0。SETServerOutPut ON;DECLARENumberINTEGER:=-10;BeginIFNumber0THENdbms_out
13、put.put_line(正数);ELSEdbms_output.put_line(0);ENDIF;End;执行效果果如右图图所示:分支语句句CASE-1分支语句句是对指指定的变变量进行行判断,从指定定的列表表中选择择满足条条件的行行,并把把该行的的值作为为CASE语句句的结果果返回。CASE语句的的语法结结构如下下:CASE WHEN THEN 值1WHEN THEN 值2.WHEN THEN 值nELSE 值n+1END;分支语句句CASE-2声明一个个整型变变量varDAY和一一个字符符型变量量Result。使用用CASE语句句判断varDAY是是星期几几。如果果变量varDAY在在1
14、7之间,则能够够显示相相应的星星期信息息,否则则返回提提示信息息“数据据越界”;SETServerOutPut ON;DECLAREvarDAYINTEGER:=3;ResultVARCHAR2(20);BEGINResult:=CasevarDAYWHEN 1THEN星期一一WHEN 2THEN星期二二WHEN 3THEN星期三三WHEN 4THEN星期四四WHEN 5THEN星期五五WHEN 6THEN星期六六WHEN 7THEN星期日日ELSE 数数据越界界END;dbms_output.put_line(Result);END;案例-1:使用简单单的casewhenelse end语句
15、句:declarei int:=0;begini:=(casewhen 1=1then 111else 222end);dbms_output.put_line(i);end;在查询时时使用简简单的Case:在查询中中使用case语句:SQL select(caseidwhen 2then222else 33end)from t6;SQL -上面的的示例等等于SQL select(casewhen id=2then2222else333end) fromt6;循环语句句LOOP.EXIT.END-1此语句的的功能是是重复执执行循环环体中的的程序块块,直到到执行EXIT语句,则退出出循环。LOO
16、P.EXIT.END语句句的语法法结构如如下LOOPIF THENEXITENDIFENDLOOP;LOOP.EXIT.ENDLOOP-2计算14累加加SETServerOutPut ON;DECLAREvarNumINTEGER:=1;varSumINTEGER:=0;BEGINLOOPvarSum:=varSum +varNum;dbms_output.put_line(varNum);IFvarNum=4 THENEXIT;ENDIF;dbms_output.put_line(+);varNum:=varNum +1;ENDLOOP;dbms_output.put_line(=);dbm
17、s_output.put_line(varSum);END;LOOP.EXITWHEN.END LOOP-1此循环语语句的功功能是重重复执行行循环体体中的程程序块,直到满满足EXITWHEN后面面的判断断语句,则退出出循环。LOOP.EXITWHEN.END语句的的语法结结构如下下:LOOPEXIT WHENENDLOOP;LOOP.EXITWHEN.END LOOP-2重新实现现14累加SETServerOutPut ON;DECLAREvarNumINTEGER:=1;varSumINTEGER:=0;BEGINLOOPvarSum:=varSum +varNum;dbms_output.
18、put_line(varNum);EXIT WHENvarNum =4;dbms_output.put_line(+);varNum:=varNum +1;ENDLOOP;dbms_output.put_line(=);dbms_output.put_line(varSum);END;WHILE.LOOP.END LOOP-1此语句的的功能是是当WHILE后面的的语句条条件成立立时,重重复执行行循环体体中的程程序块。WHILE.LOOP.ENDLOOP语句句语法结结构如下下:WHILELOOPENDLOOP;WHILE.LOOP.END LOOP-2再次实现现14累加SETServerOutP
19、ut ON;DECLAREvarNumINTEGER:=1;varSumINTEGER:=0;BEGINWHILEvarNum=4LOOPvarSum:=varSum +varNum;dbms_output.put_line(varNum);IFvarNum4 THENdbms_output.put_line(+);ENDIF;varNum:=varNum +1;ENDLOOP;dbms_output.put_line(=);dbms_output.put_line(varSum);END;FOR.IN.LOOP.ENDLOOP-1此语句定定义一个个循环变变量,并并指定循循环变量量的初始始值和
20、终终止值。每循环环一次循循环变量量自动加加1.FOR.IN.LOOP.ENDLOOP语句句的语法法如下FOR IN .LOOPENDLOOP;FOR.IN.LOOP.ENDLOOP-2再次实现现14累加SETServerOutPut ON;DECLAREvarNumINTEGER:=1;varSumINTEGER:=0;BEGINFORvarNum IN 1.4LOOPvarSum:=varSum +varNum;dbms_output.put_line(varNum);IFvarNum4 THENdbms_output.put_line(+);ENDIF;ENDLOOP;dbms_outpu
21、t.put_line(=);dbms_output.put_line(varSum);END;FOR.IN.LOOP 3:-forinloop使用变变量setserveroutput ondeclarei integer:=1;j integer:=10;x integer:=0;beginforxini.jloop /i和j都是变变量dbms_output.put_line(x);endloop;end;异常处理理PL/SQL程程序在运运行过程程中,可可能会出出现错误误或异常常现象例如:无无法建立立到Oracle的连连接或用用0做除除数。好好的程序序应该对对可能发发生的异异常情况况进行处处理
22、,异异常处理理代码在在EXCEPTION块中实实现可以使用用WHEN语句句来定义义异常。WHEN语句句的使用用方法如如下:EXCEPTIONWHEN THENWHEN THEN.WHEN OTHERSTHEN预定义异异常种类类异常说明ACCESS_INTO_NULL在未初始化对象时出现CASE_NOT_FOUNF在CASE语句中的选项与用户输入的数据不匹配时出现COLLECTION_IS_NULL在给尚未初始化的表或数组赋值时出现CURSOR_ALREADY_OPEN用户试图重新打开已经打开的游标时出现。在重新打开游标前必须先将其关闭DUP_VAL_ON_INDEX用户试图将重复的值存储在使用
23、唯一索引的数据库列中时出现INVALID_CURSOR在执行非法游标运算(如fetch一个尚未打开的游标)时出现INVALID_NUMBER将字符串转换为数字时出现LOGIN_DENIED输入的用户名或密码无效时出现NO_DATA_FOUND在表中不存在请求的行时出现SOTRAGE_ERROR在内存损坏或PL/SQL耗尽内存时出现TOO_MANY_ROWS在执行SELECT INTO语句后返回多行时出现VALUE_ERROR在产生大小限制错误时出现。如,变量中的列值超出变量的大小ZERO_DIVIDE以零做除数时出现示例1:向一个NUMBER类类型的变变量赋值值字符串串时,导导致异常常的发生生
24、SETServerOutPut ON;DECLAREvarNumNUMBER;BEGINvarNum:=abc;EXCEPTIONWHEN VALUE_ERROR THENdbms_output.put_line(VALUE_ERROR);END;示例2:使用SQLCODE ,SQLERRM输出错误误信息:setserveroutput on;declarej integer:=0;beginj:=Jack;-如果果出错,直接去去异常处处执行,以下行行不会输输出dbms_output.put_line(Valueissetted);exceptionwhen othersthen-在异异常中默
25、默认使用用sqlerrm输出出信息dbms_output.put_line(SQLCODE|Othererrors|sqlerrm);end;用户自定定义异常常:当与一个个异常错错误相关关的错误误出现时时,就会会隐含触触发该异异常错误误。用户户定义的的异常错错误是通通过显式式使用RAISE语语句来来触发。当引发发一个异异常错误误时,控控制就转转向到EXCEPTION块异常常错误部部分,执执行错误误处理代代码。对于这类类异常情情况的处处理,步步骤如下下:在PL/SQL 块的的定义部部分定义义异常情情况:exception;RAISE;在PL/SQL 块的的异常情情况处理理部分对对异常情情况做出出
26、相应的的处理。自定义异异常示例例:setserveroutput on;declaremyExceptionEXCEPTION;-定定义异常常beginupdateperson setid=900whereid=901;ifSQL%NOTFOUNDthenRAISEmyException;endif;EXCEPTIONwhen myException thendbms_output.put_line(SQLCODE|Error|SQLERRM);end;RAISE_APPLICATION_ERROR过程程 :RAISE_APPLICATION_ERROR过程程可以重重新定义义异常错错误消息息,
27、它为为应用程程序提供供了一种种与ORACLE交互互的方法法。语法如下下:RAISE_APPLICATION_ERROR(error_number,error_message,keep_errors );这里的error_number是是从20,000到到 20,999之之间的的参数。error_message 是相相应的提提示信息息(2048字字节).keep_errors为为可选,如果keep_errors=TRUE,则新错错误将被被添加到到已经引引发的错错误列表表中。如如果keep_errors=FALSE(缺省省),则则新错误误将替换换当前的的错误列列表。RAISE_APPLICATIO
28、N_ERRROR示示例:RAISE_APPLICATION_ERRROR示示例:setserveroutput on;declaremyExceptionEXCEPTION;beginupdateperson setid=900whereid=901;ifSQL%NOTFOUNDthen-调用用系统的的异常处处理,抛抛出异常常RAISE_APPLICATION_ERROR(-20001,cannotfoundany row!);endif;EXCEPTIONwhen myException thendbms_output.put_line(usererrors);when othersthen
29、dbms_output.put_line(Others|SQLCODE|SQLERRM);end;用异常在在PLSQL块块中管理理事务setserveroutput on;begininsertintopersonvalues(P007,Tom1);insertintopersonvalues(P006,Tom4);commit;-提提交exceptionwhen othersthenrollback;-回滚滚dbms_output.put_line(SQLCODE|SQLERRM);end;小结PL/SQL语语言基本本结构变量和常常量的声声明流程控制制语句存储过程程函数触发器游标存储过程程存
30、储过程程指存储在在数据库库中供所所有用户户程序调调用的子子程序叫叫存储过过程。创建存储储过程用CREATE PROCEDURE命令令建立存存储过程程和存储储函数语法:createor replace PROCEDURE过过程名(参数列列表)ASPLSQL子程程序体存储过程程中可以以接收的的参数类类型:in类型型为输入入类型的的参数out类类型为输输出类型型的参数数。存储过程程调用setserveroutputonbeginraisesalary(7369);end;/setserveroutputonexec raisesalary(7369);方法一:方法二:不接收参参数的过过程create
31、orreplaceprocedureP1isbegindbms_output.put_line(Currentdate is:|to_char(sysdate,yyyy-mm-dd);end;-调用用方法1setserveroutput on;exec P1();-调用用方法2setserveroutput on;beginp1();end;接收输入入类型的的参数:-声明明接收参参数的只只声明类类型,不不声明大大小createorreplaceprocedurepro2(p_id in varchar2,p_nameinvarchar2)asbegininsertintopersonvalue
32、s(p_id,p_name);end;-调用用setserveroutput on;exec pro2(P100,Marray);接收输出出类型的的参数:-select* fromall_objectswhereowner=HR;createorreplaceprocedurepro4(pidinvarchar,pnminvarchar,rcountout number)asrcnumber:=0;begin-先写写入数据据insertintopersonvalues(pid,pnm);commit;selectcount(1)intorcfrom person;rcount:=rc;end;
33、-测试试调用setserveroutput on;declarercnumber:=0;begin-第三三个参数数为返回回值的参参数pro4(P210,Jack,rc);dbms_output.put_line(rc);end;在过程中中使用游游标createorreplaceprocedurepro5ascursorc1isselect *fromperson;v_pperson%rowType;beginopen c1;loopfetchc1into v_p;exit whenc1%notfound;dbms_output.put_line(v_p.id|v_);endloop
34、;ifc1%isopenthenclosec1;endif;end;-调用用setserveroutput on;exec pro5;函数存储函数数函数(Function)为为一命名名的存储储程序,可带参参数,并并返回一一计算值值。函数数和过程程的结构构类似,但必须须有一个个RETURN子句,用于返返回函数数值。函函数说明明要指定定函数名名、结果果值的类类型,以以及参数数类型等等。建立存储储函数的的语法:CREATEOR REPLACE FUNCTION 函数数名(参参数列表表)RETURN函函数数值类型型ASPLSQL子程程序体;函数示例例:createorreplacefunctionf1
35、returnvarchar2asbeginreturnhello;end;-调用用selectf1()from dual;函数的调调用declarev_salnumber;beginv_sal:=queryEmpSalary(7934);dbms_output.put_line(salaryis: |v_sal);end;或是直接接使用select调用begindbms_output.put_line(salaryis: | queryEmpSalary(7934);end;过程和函函数中的的in和和out一般来讲讲,过程程和函数数的区别别在于函函数可以以有一个个返回值值;而过过程没有有返回值
36、值。In类型型的参数数,只可可以接收收值,不不能再给给in类类型的参参数设置置新的值值。但过程和和函数都都可以通通过out指定定一个或或多个输输出参数数。我们们可以利利用out参数数,在过过程和函函数中实实现返回回多个。什么时候候用存储储过程/存储函函数?原则:如果只有有一个返返回值,用存储储函数;否则,就用存存储过程程。函数示例例2:用函数去去掉字段段中多个个重复的的空格:createorreplacefunctionmtrim(strvarchar2)returnvarchar2asv_strvarchar2(500):=;beginselectregexp_replace(str,(s)
37、1,)into v_str fromdual;returnv_str;end;-测试试selectmtrim(HA) fromdual;触发器/Trigger触发器数据库触触发器是是一个与与表相关关联的、存储的的PL/SQL程序。每当一一个特定定的数据据操作语语句(Insert,update,delete)在在指定的的表上发发出时,Oracle自动地地执行触触发器中中定义的的语句序序列。触发器的的类型语句级触触发器在指定的的操作语语句操作作之前或或之后执执行一次次,不管管这条语语句影响响了多少少行。行级触发发器(FOREACHROW)触发语句句作用的的每一条条记录都都被触发发。在行行级触发发器
38、中使使用old和new伪伪记录变变量,识识别值值的状态态。创建触发发器CREATEorREPLACETRIGGER触发器名名BEFORE |AFTERDELETE |INSERT |UPDATE OF列名ON表名FOR EACHROW WHEN(条件) PLSQL块触发语句句与伪记记录变量量的值触发语句:old:newInsert将要插入的数据Update更新以前该行的值更新后的值delete删除以前该行的值示例:限限制写入入以J开开始的串串:-书写写一个最最基本的的before triggercreateorreplacetrigger t1beforeinsert on personfor
39、eachrowbegindbms_output.put_line(Hello|:NEW.id|:NEW.name);if:NEW.namelikeJ% thenRAISE_APPLICATION_ERROR(-20000,限制制写入以以J开始始的串);-在触触发器中中,不能能写commit或是是rollbackendif;end;setserveroutput on;insertintopersonvalues(X790,Mack);Foreachrow的的含义:添加foreach row后,触发器器,将变变为行级级触发器器:如:createorreplacetrigger trigger1b
40、eforeupdateonpersonfor eachrowdeclarebegindbms_output.put_line(Hello);end;如果person表中中有四行行,则会会显示4个hello.如果没有有for eachrow 则只只会显示示一个hello.只有在行行级的触触发器中中,才可可以使用用:new,:old。示例2:限制修改改的年龄龄大于以以前的年年龄createorreplacetrigger t2beforeupdate on t6 foreach rowbeginif:NEW.age:OLD.agethenRAISE_APPLICATION_ERROR(-20000
41、,年龄龄不能越越来越小小);endif;end;-写入入小值就就是出错错updatet6set age=143;select*from t6;示例:同时使用用insert,update,delete类类型的触触发器:-在同同一个表表上,使使用insert,update,delete触发器器createorreplacetrigger trigger1beforeinsert or updateordeleteonpersondeclarebegindbms_output.put_line(hello);end;-以下下都会引引发上面面的触发发器setserveroutput on;insert
42、intopersonvalues(1,Jack);setserveroutput on;updateperson setname=Tom;setserveroutput on;deletefromperson;示例:判断是何何种类型型的操作作:-同时时声明insert,update,delete判断断是何种种操作createorreplacetrigger trigger1beforeinsert or updateordeleteonpersonfor eachrowdeclarebeginifINSERTINGthendbms_output.put_line(这是插插入数据据);elsif
43、DELETINGthendbms_output.put_line(这是删删除数据据);elsedbms_output.put_line(这是修修改数据据);endif;end;示例:触发器_根据条条件决定定是否执执行plsql块createorreplacetrigger trigger1beforeinsertonpersonfor eachrowwhen (NEW.id=8)-这儿儿是这样样引用newdeclarebegin-这儿儿前面必必须要添添加:new才才可以引引用dbms_output.put_line(这真是是的是等等于|:new.id|:);end;示例:作用在
44、某某个列上上的createorreplacetrigger trigger1-声明明将这个个触发器器作用到到某个列列上beforeupdate of nameonpersonforeachrowDeclareBegindbms_output.put_line(之前的的值|:|现在在的值:|:);end;示例:在触发器器调用过过程:createorreplacetrigger tg1beforeinsert on personforeachrowdeclarev_agenumber:=0;begindbms_output.put_line(Trigger.);P1
45、(v_age);-直直接调用用过程即即可dbms_output.put_line(age is:|v_age);end;触发器小小总结触发器可可用于数据确认认实施复杂杂的安全全性检查查做审计,跟踪表表上所做做的数据据操作等等数据的备备份和同同步查询触发发器、过过程及函函数Select*fromuser_triggers;Select*fromuser_source;游标游标:游标是SQL的的一个内内存工作作区,由由系统或或用户以以变量的的形式定定义。游游标的作作用就是是用于临临时存储储从数据据库中提提取的数数据块。游标分为为三种类类型:隐式Cursor显式CursorRefCursor(动态态
46、Cursor)。隐式游标标:对于SelectINTO语语句,一一次只能能从数据据库中获获取到一一条数据据,对于于这种类类型的DMLSql语句,就是隐隐式Cursor。例例如:Select/Update/ Insert/Delete操操作。作用:可可以通过过隐式Cusor的属属性来了了解操作作的状态态和结果果,从而而达到流流程的控控制。隐式Cursor是系系统自动动打开和和关闭Cursor。Cursor的的属性包包含:SQL%ROWCOUNT整整型代代表DML语语句成功功执行的的数据行行数。SQL%FOUND布布尔型型 值为为TRUE代表表插入、删除、更新或或单行查查询操作作成功。SQL%NOT
47、FOUND布布尔型型 与SQL%FOUND属属性返回回值相反反。SQL%ISOPEN 布尔尔型DML执执行过程程中为真真,结束束后为假假。隐式游标标示例1:用隐式的的游标判判断是否否修改数数据成功功:setserveroutput on;beginupdateperson setid=P003whereid=P010;ifSQL%FOUNDthendbms_output.put_line(update successfull);commit;elsedbms_output.put_line(update faulied);endif;end;隐式游标标示例2:判断影响响的行数数:setserv
48、eroutput on;declarerowCountinteger;beginupdateperson setname=Jack;rowCount:=SQL%ROWCOUNT;-输出出本次共共影响几几行dbms_output.put_line(Effectedrowsis:|rowCount);end;显式Cursor:对于从数数据库中中提取多多行数据据,就需需要使用用显式Cursor。显式Cursor的属属性包含含:%ROWCOUNT整整型获获得FETCH语句返回回的数据据行数。%FOUND布布尔型型 最近近的FETCH语句返返回一行行数据则则为真,否则为为假。%NOTFOUND布布尔型型
49、 与%FOUND属属性返回回值相反反 。%ISOPEN 布尔尔型游游标已经经打开时时值为真真,否则则为假。对于显式式游标的的运用分分为四个个步骤:定义游标标-Cursor CursorNameIS; 必须须要使用用is.打开游标标-OpenCursor Name;操作数据据-FetchCursornameintosomeVar;判断游标标是否获获取到行行值exit whenc1%notfound;关闭游标标-CloseCursorName,这这个Step绝绝对不可可以遗漏漏。显式Cursor用法法 -1:遍历数据据:setserveroutput on;declarersperson%rowType;cursorc1isselect *fromperson;beginopen c1;loopfetchc1into rs;-每一次次将值写写到rs记录集集中exit whenc1%notfound; -判断是是否获取取到了数数据dbms_output.put_line(行号:|c1%rowcount|编编号|rs.id|姓姓名|);endloop;ifc1%is
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物流服务合同书范本特点
- 经典企业保证书案例
- 应聘者责任承诺
- 电动液压车采购协议
- 个人信誉承诺书
- 预售房屋买卖合同范本
- 沙石料销售购销协议
- 小产权房房屋交易合同模板
- 廉洁招标保证书
- 高性能笔记本采购合同
- 2024智能变电站新一代集控站设备监控系统技术规范部分
- 二年级数学上册口算天天练
- 2024国家开放大学电大本科《液压气动技术》期末试题及答案
- 商务服务机器人技术现状与未来发展趋势研究
- 工业物联网(IIoT)行业发展全景调研与投资趋势预测研究报告
- 金融数据分析-以Python为工具 课件 一、金融数据分析概览
- 佛山市、三水区2022-2023学年七年级上学期期末地理试题【带答案】
- 小学美术教学课题研究报告
- 2024届湖北高三元月调考数学试卷含答案
- DL∕T 1476-2023电力安全工器具预防性试验规程
- 小麦品种冬春性及鉴定技术课件讲解
评论
0/150
提交评论