收藏 分享(赏)

oracle-database-11g-plsql-编程实战笔记.doc

上传人:weiwoduzun 文档编号:5739718 上传时间:2019-03-15 格式:DOC 页数:111 大小:524.05KB
下载 相关 举报
oracle-database-11g-plsql-编程实战笔记.doc_第1页
第1页 / 共111页
oracle-database-11g-plsql-编程实战笔记.doc_第2页
第2页 / 共111页
oracle-database-11g-plsql-编程实战笔记.doc_第3页
第3页 / 共111页
oracle-database-11g-plsql-编程实战笔记.doc_第4页
第4页 / 共111页
oracle-database-11g-plsql-编程实战笔记.doc_第5页
第5页 / 共111页
点击查看更多>>
资源描述

1、Chap1DML 语句是 select 、insert、update 、delete 和 mergeDDL 语句是 create、alter、drop、rename 、truncate 、commentDCL 语句是 grant、revokeTCL 语句是 commit、rollback 和 savepointsql16 个基本命令参考书 OCA 认证考试指南(IZ0-051) 清华大学出版社oracle database sql language reference 11g有非遵循格式字符串依赖于格式掩码chap22.1.3 关于语句中有多个单引号时处理:1、select Its a bir

2、d,no plan cant be as pharsefrom dual; 此处两个单引号即为一个单引号2、只能用q 再加(语句)select q(Its a bird,no plan cant be) as pharsefrom dual;均输出PHARSE-Its a bird,no plan cant be2.1.4定义变量与申明变量的区别:定义变量即为变量分配名称并指定数据类型;申明变量首先需要定义变量,然后为其赋值。(赋值也称为初始化)替代变量前面要加/*lv-whom为申明变量,a为替代变量,a没有变量类型*/beginlv_whom := end;或者declare lv_who

3、m varchar2(20);beginlv_whom := end;但是要在输入框中字符加两个单引号替代变量用 define 申明,且定义时不可以指定类型,默认为 char 型Define x=emp;Select * from /*调用要用select /*此处解析后变为 select adasd z from dual ,此处必须要有单引号,使 adasd 作为直接变量,否则出错*/所以替代变量是否加单引号要根据解析的值来确定注意:避免在声明块中将任何实参赋给局部变量 (constant 变量除外) ,且替代变量与绑定变量都不应该在声明块中赋值定义为 constant 的变量,必须在申明

4、块中申明,这意味着常量必须先定义,再给他赋一个不变的值绑定变量(bind )用 var 或 variable 申明使用冒号(:)作为前缀var a numberbegin:a := 22;end;上面也可以输出结果,下面也可以输出结果,但二者不能同时放一块print a; /*此处 a 前面不能加冒号,print 可用来输出所有类型的变量*/另外也可通过 exec 直接给绑定变量赋值:SQL var x number /*必须要先定义再赋值,而替代变量定义时不需指定类型,直接赋值即可*/SQL var y numberSQL exec :x :=1;:y :=2;/*exec 等价于begin

5、 end*/PL/SQL procedure successfully completedx-1y-2也可以先定义好绑定变量,再将其赋给其他变量:var a numberbegin:a := 22;end;现将其运行再declarelv_a number;beginlv_a:= :a;dbms_output.put_line(hello,|lv_a|.);end;结果:hello,22.将上面的代码放入到 d:q.sql 中用d:q.sql; 调用即可,但是里面的代码要正确2.1.5 命名块1、过程块create or replace procedure abc (aa varchar2) i

6、sbegindbms_output.put_line(sdhl|aa);end;exec abc(dkjdhhdj);可能出现错误一:【ORA-00955: 名称已由现有对象使用】这个错误说的不仅仅是有可能你有存储过程使用了【abc】,还有可能是你有表名叫【abc】或者其他 oracle 对象叫【abc】。说明:其实由于你已经使用了【create or repalace procedure】即使有存储过程叫【abc】也会被覆盖掉,你用下面的命令查询一下,有什么对象叫【abc 】,删掉它或者换一个存储过程名字。【SELECT OBJECT_NAME,OBJECT_TYPE FROM USER_O

7、BJECTS WHERE OBJECT_NAME=STUDENT2;】错误二:过程中的参数不能指定具体长度2、函数块错误一:函数里面要有 return,不是 dbms_output.put_line(但实验之后二者均可以成功创建函数,但是调用时只有 return 的能没有错误的执行)create or replace function abc (aa varchar2)return varchar2 isbegindbms_output.put_line(sdhl|aa);end;改为create or replace function abc(aa varchar2) return varc

8、har2 isbeginreturn sdhl | aa;end;但函数不能像过程一样来执行,因为 execute 命令不允许管理函数返回值。必须要用 call 或 begin dbms. end 命令将返回值放入一个绑定变量(要先定义)中,在输出。(必须要先执行函数,在执行下面语句,不能一起运行)variable result varchar2(20);call abc(akdhak) into :result; -call 后面只能用绑定变量?或者:SQL begin2 dbms_output.put_line(abc(du);3 end;4 /sdhldu此处若用 print 则绑定变量

9、不能加冒号只能为 print result;但可以查询 select :result from dual;(exec 是 sqlplus 的命令,只能在 sqlplus 中使用。call 是 sql 命令,任何工具都可以使用)2.1.6 嵌套块命名块还可以嵌套在其他命名块或匿名块中,但嵌套命名块并不是已经发布的,这意味着在调用一个命名块时,被调用的命名块可能还没有定义declare procedure a isbegindbms_output.put_line(b|hello!); /*此处b为被调用函数,但之前没有被解析,所以运行会出错*/end a;function b return va

10、rchar2 isbeginreturn hello!;end b;begina;end;注:所有匿名块都会在程序都会在实际执行前进行分析,分析是一个编译过程。分析过程将会识别标识符(保留字)、预定义标识符、引用标识符、用户定义变量、子例程或 UDT。命名块也是标识符,PL/SQL 按照自顶向下的次序,将标识符读取到内存中。上例中函数 b 因为在过程 a 的下面还没被解析,所以会出错。使用“前向引用”可以修正这个问题,函数或过程的前向引用只需要函数或过程的署名,不需要同时包括署名和实现,这些署名在 PL/SQL 中叫做“占位程序( stub)”。占位程序允许编译过程在实现命名块之前接受其标识符

11、名称。更正:declare procedure a;function b return varchar2;procedure a isbegindbms_output.put_line(b|hello!);end a;function b return varchar2 isbeginreturn hello!;end b;begina;end;2.2 变量:类型、赋值和运算符2.2.1 文本数据类型用伪列来隐式地定义数据类型。伪列如%typeChar(20)为一个定长的类型,不管其中变量的长度有没有达到 20,最后显示长度均为 20 字符Varchar2(20)则要根据实际情况来确定其长度C

12、lob( character large object 字符大对象)同 varchar22.2.2 日期和时间戳类型1、日期有两种字符串字面值赋值支持到 date 类型的隐式转换Lv_date date := 22-mon-75;或者 Lv_date date := 22-mon-1975;除了上面两种,任何其他字符串字面值都要求使用 to_date 内置 SQL 函数来覆盖格式掩码如 lv_date_1 date := to_date(19750430,YYYYMMDD);2、间隔间隔子类型允许将天的间隔表示秒,将年的间隔表示月份数Interval day to second 数据类型的默认

13、值在两个 date 相减时能起作用,只要在执行减法之前将其转化为 timestamp,因为 to_timestamp 函数保留了 date 的精度,而该精度低于 timestamp将天的间隔转换为秒的数据类型为 interval day/day(4 或其他数) to seconddeclarelv_interval interval day to second;lv_end_day date := sysdate; -sysdate与date 对应lv_start_day date := 18-4月-2012;beginlv_interval := to_timestamp(lv_end_da

14、y)-to_timestamp(lv_start_day);dbms_output.put_line(lv_interval);end;结果-20 14:56:54.000000PL/SQL procedure successfully completedDate 数据类型默认支持 2 位数字表示的天,timestamp 的精度要求使用 9 位数字表示的天或者declarelv_interval interval day(9) to second;lv_end_day timestamp := systimestamp; -systimestamp与timestamp对应lv_start_da

15、y timestamp := 18-4月-2012;beginlv_interval := lv_end_day-lv_start_day;dbms_output.put_line(lv_interval);end;结果-000002943 02:52:41.860000PL/SQL procedure successfully completed将年的间隔转化为月份数的数据类型为 interval year to month从一个日期中提取年用 to_char(extract(year from lv_end_day)完整代码:declarelv_a date := 20-4月-2009;a

16、 varchar2(12);begina := to_char(extract(year from lv_a);dbms_output.put_line(a);end;结果为:20093、时间戳 (timestamp )Timestamp 数据类型精度要比 date 数据类型精度高22.3 数值类型可以将 number 数据类型隐性转化为 intger 类型,可能会丢失一些小数点Binary_float 32 位浮点数Binary_double 是一个 64 位浮点数2.2.4 复合变量类型SQL UDT 用于保存一个数据结构2.3 控制结构1、If 语句,if elsif else2、cas

17、e 语句 分为简单的 case 语句 case when then else end case (break 隐式存在) 与搜索型的 case 语句 case when then else end case简单 case 语句可使用 char、nchar、varchar2 数据类型,而搜索 case 语句可以使用任意布尔表达式,搜索 case 语句不局限于等值匹配2.3.3、循环结构Loop 循环退出要借助 exit 或 exit when 语句For loop 循环 :分为范围循环和游标循环插入:关于游标(见 E:sassql各类知识要点 游标)A、 范围循环即 for i in 14 lo

18、opB、 游标循环 1、隐式 for i in (select 语句)loop2、显式 for i in cur_v(游标)loop其中第 2 种要比第一种要有更好的可读性(以后用这种)C、 where current of 字句while 循环while (.)loop内可含 continue/goto 语句Simple 循环语句即利用隐式游标属性来进行循环判断 如 if SQL%FOUND then .else .end if ;24 批量操作(见 E:sassql各类知识要点游标)批量处理是进行成批处理和大批量处理的默认选择本章小结:1、始终在执行块中进行赋值或初始化。除非局部变量被视为

19、常量2、在实现任何局部块命名之前,始终未其定义前向引用规范,从而确保这些局部命名块能够互相调用3、应尽可能使用表集合。避免用 varray,因为前者不受固定大小的限制。 Varray 通常需要更改大小限制,这将花费时间和金钱4、显式游标应尽可能使用形参5、应尽可能使用 SQL 数据类型作为函数的返回值。SQL 数据类型不需要编写管道化表函数对其进行封装就可以在 SQL 中使用,并且数据类型总是可检测的,因为它是目录中的一个命名集合或结构本章的问题1、在程序块中至少包括一个 null 语句,否则会编译错误2、PL/SQL 中必须定义一个 record 结构,因为该结构是仅适用于 PL/SQL 环

20、境的变量3、for 循环必须知道其范围 ide 上界,而游标集返回的行数设置了游标 for 循环的上边界4、可以使用 bulk collect into 语句讲一个完整游标或游标的某些行选择到一个记录结构集合中。可以使用 limit 关键字来限制行集5、在循环内部可以使用 forall 语句,但该语句没有结束块语句,所以需要 end forall 或end loop 或 end forall loop 语句来结束 forall 语句。Chap3 事物作用域3.1 数据库 ACID 测试Atomicity 原子性、consistency 一致性、isolation 隔离性、durability

21、持久性3.2 多版本并发控制MVCC( multiversioned concurrency control)使用数据库快照为用户提供数据库的永久内存副本3.3 3.3.1 保存点、提交和事务回滚若有 2 个保存点,且回滚到了第一个保存点,则第二个保存点就不存在了3.3.2 提交注意:A、 数据字典作强制隐式的提交B、 Commit 命令中的注释将写入到 dba_pc2_pending 字典视图中C、 必须具有 force transaction 或 force any transaction 系统权限才能强制提交D、 Nowait 选项不会验证对重做和归档日志文件的写入E、 Work 选项将

22、会在所有 commit 语句中有效例1、标准commitUPDATE hr.employeesSET salary = salary * 1.03WHERE department_id in ( 20, 30, 40 );Commit或将commit改为 COMMIT WORK WRITE IMMEDIATE WAIT;例2、含有nowait 和batch选项的commit使用nowait选项将不会验证对重做和归档日志的写入避免重写oracle的提交等待过程。这样做可能会使自己的事物陷入危险例3、强制commit 语句并写入注释INSERTINTO hr.job_historyVALUES (

23、 100, 01-Jan-2000, trunc( sysdate ), AD_PRES, 90 );COMMITCOMMENT In-doubt transaction forced by process xyz on date 123;Commit force 2.33.192;发出commit force需要一个具有dba权限的账户。单引号()内的信息代表可疑的事物id。3.4DML锁定和隔离控制为了防止不可重复读取或影子读取a、 设置事物级别为读取一致(在跟踪分布式事物时,设置事物语句命名将会非常有益)set transaction name 可更好地监控长时间的事务。SET TRAN

24、SACTION READ ONLY NAME Distributed to NYC;-添加到该设置事物语句的distributed to NYC注释将会保存在dba_pc2_pending字典视图中(http:/www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm)SELECT product_id, warehouse_id, quantity_on_handFROM oe.inventoriesnyc_001WHERE product_id = 3246;COMMIT;b、 锁定用

25、户具有锁定自己所拥有的全部表的权限,如果想要锁定另一个模式中的表,则必须具有lock any table系统权限B1在游标内使用for updateDECLARECURSOR c_employees ISSELECT *FROM hr.employeesFOR UPDATE WAIT 10;-该行锁定c_employees游标中所引用的行。其中wait 10表示,若游标所引用的行已经存在锁定,则等待10秒,若前一次锁定持续时间大于10秒,则此次更新将会被取消,也可以用nowait关键字,表示存在锁定的情况下立即返回事物BEGINFOR r_employees IN c_employees LO

26、OPUPDATE hr.employeesSET salary = salary * 1.025WHERE CURRENT OF C_employees;-该语句引用游标中的最新行,最后锁定会一直持续,直至发出commit或rollback命令END LOOP;END;B 2发起 lock table语句LOCK TABLE hr.employees IN EXCLUSIVE MODE NOWAIT;UPDATE hr.employeesSET salary = salary * 1.025WHERE department_id = 10;COMMIT;与for update语句不同,lock

27、 table命令将会锁定表中的每一行。此外,短语in exclusive mode 将会锁定除select语句之外的全部操作有效的锁定模式有 :row exclusive模式, 限制最少的锁定级别,允许行共享,并防止用户锁定整个表或锁定到row share模式row share模式, 除了没有独占共享的限制之外,该模式等同于row exclusiveshare模式, 允许select但是不允许其他更新share row exclusive 模式,等同于share模式,但是同时禁止用户锁定到share模式exclusive模式 限制最多的级别,阻止除select之外的所有DML操作C、 改善事物

28、性能利用批量DML 操作的功能3.5调用者和定义者权限以程序所有者的身份来保留程序执行的全部权限:在命名程序头使用authid definer 关键字例1发出定义者权限CREATE OR REPLACE FUNCTION hr.quarterly_sales( pi_employee_id in number, pi_quarter in date)AUTHID DEFINERAS. declarative code goes here .BEGIN. do something here and return .EXCEPTION. handle the exception here and

29、return .END;例2. 发出调用者权限以程序调用者的身份来调用程序,用关键字authid current_userCREATE OR REPLACE FUNCTION hr.give_raise( pi_employee_id in number )AUTHID CURRENT_USERAS. declarative code goes here .BEGIN. do something here and return .EXCEPTION. handle the exception here and return .END;本章小结1、确保自己有一个良好的备份。仅仅激活像rman这样

30、的备份程序是不够的2、使用简洁而有意义的名称来命名保存点3、强制可疑事务要求深入了解oracle系统更改号( system change number,SCN)和数据字典。只有当事务无法再次尝试时才使用commit force命令4、使用set transaction name 参数对分布式事务命名测验小结1、 原子性意味着一个事务全部写入到永久存储中或任何部分都没有写入到永久存储中2、 一致性意味着一个并发多用户系统中为所有事务分配相同的服务cpu时间量和内存3、 隔离性意味着一个事务的任何部分在事务完成并提交之前都不可见4、 持久性意味着事务在完成之后写入到冗余磁盘阵列5、 Undo_re

31、tention 参数(还不是很熟悉),设置语句在内存中运行的时间长度Chap4 错误管理数据库强化的两种方法是使用DBMS_ASSERT包和绑定变量。DBMS_ASSERT 包用于验证输入参数的形式是否正确,以及模式和对象名称是否实际存在。绑定变量防止匿名PL/SQL块的嵌套4.1错误类型4.1.1编译时错误(即语法上有错误)很多程序员基于编写较大的代码块,而不愿意停下来执行临时编译。一次性调试很多错误可能会花费大量时间查看不重要的信息,尤其当错误栈中打印出许多不必要的信息时。一种更高效的编程方法是按逻辑分组来编写每个程序块,在函数单元完成后执行编译。例:循环式编码方法可以避免不必要的调试4.

32、1.2语义错误语义错误只在程序内部发生的逻辑错误。如加减乘除的错误1、 Oracle提供的错误条件Oracle提供了超过2300 页的预定义错误条件,程序员可以参考他们来编写或直接调用2、 Oracle sqlcode和sqlerrmSQLERRM是系统内置变量保存了当前错误的详细信息。Oracle databases error messages 11g guide 中的每个错误都有唯一的代号和消息。与错误条件相关联的数字值称为sqlcode。可以使用 pragma exception_init关键字将变量与sqlcode代号关联。当希望在发生oracle错误的情况下执行特定任务时,该功能特

33、别有用。例:用pragma exception_init捕获系统错误CREATE TABLE hr.emergency_contact( employee_id NUMBER, full_name VARCHAR2(50), phone_home VARCHAR2(15), phone_cell VARCHAR2(15), phone_pager VARCHAR2(15);ALTER TABLE emergency_contactADD ( CONSTRAINT ec_employee_id_unkUNIQUE ( employee_id, full_name );BEGINFOR i IN

34、1 2 LOOP -此处因为循环两次,导致插入的数据一样,所以会导致违反unique约束-INSERTINTO emergency_contactVALUES ( 1, Jane Doe, +1.123.456.7890, NULL, +1.123.567.8901);END LOOP;END;输出ORA-00001: 违反唯一约束条件 (SCOTT.EC_EMPLOYEE_ID_UNK)ORA-06512: 在 line 4用pragma exception_init来捕获(为什么要捕获错误,因为发现错误时oracle则不执行其他代码了,为了对其执行额外的任务,则就需要进行捕获错误,此处当程

35、序遇到ORA-00001错误时,运行执行dbms,而不会立即中断程序)declare unique_constraint exception;pragma exception_init (unique_constraint,-00001);BEGINFOR i IN 1 2 LOOPINSERTINTO emergency_contactVALUES ( 1, Jane Doe, +1.123.456.7890, NULL, +1.123.567.8901);END LOOP;exceptionwhen unique_constraint thendbms_output.put_line(o,

36、you throw the unique_constraint error);END;输出o,you throw the unique_constraint errorPL/SQL procedure successfully completed3、 异常作用域Pl/sql块的连续性通过在匿名子块中封装可能的错误代码来维护。封装技术有:标准子块封装、循环子块封装、保存点重定向、goto跳转例1、 封装子块DECLAREln_parent NUMBER;ln_child_level1 NUMBER;ln_child_level2 NUMBER;ln_random_0_1 NUMBER;BEGIN

37、BEGINDBMS_OUTPUT.PUT_LINE ( Made it past Parent. );ln_random_0_1 := ROUND ( DBMS_RANDOM.VALUE ( 0, 1 );ln_parent := 1 / ln_random_0_1;BEGINDBMS_OUTPUT.PUT_LINE ( Made it past Child Level 1. );ln_random_0_1 := ROUND ( DBMS_RANDOM.VALUE ( 0, 1 );ln_child_level1 := 1 / ln_random_0_1;BEGINDBMS_OUTPUT.PU

38、T_LINE ( Made it past Child Level 2. );ln_random_0_1 := ROUND ( DBMS_RANDOM.VALUE ( 0, 1 );ln_child_level2 := 1 / ln_random_0_1;END;END;END;EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE ( SQLERRM );END;例2 、 在循环内封装DECLAREln_employee_id NUMBER;ln_order_total NUMBER;CURSOR c_employee ISSELECT *FROM hr.

39、employees;BEGINFOR r_employee IN c_employee LOOPln_employee_id := r_employee.employee_id;DECLAREno_salesman_found exception;BEGINSELECT SUM ( order_total )INTO ln_order_totalFROM oe.ordersWHERE sales_rep_id = ln_employee_id;IF ln_order_total IS NOT NULL THENDBMS_OUTPUT.PUT_LINE ( ln_order_total );EL

40、SERAISE no_salesman_found;END IF;EXCEPTIONWHEN no_salesman_found THENDBMS_OUTPUT.PUT_LINE ( Caught NO_SALESMAN_FOUND );END;END LOOP;EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE ( SQLERRM );END;例3、 保存点异常重试4、 定义自定义错误条件为了定义自己的错误条件,首先必须创建一个异常变量。最后在代码的异常块内必须说明这个错误的处理方法例:DECLAREln_order_total number;ln_p

41、romotion_id number := 1;ln_order_count number;no_promo_found exception;BEGINSELECT COUNT(*)INTO ln_order_countFROM oe.ordersWHERE promotion_id = ln_promotion_id;IF ln_order_count 0 THENSELECT SUM ( order_total )INTO ln_order_totalFROM oe.ordersWHERE promotion_id = ln_promotion_id;ELSEraise no_promo_

42、found;END IF;EXCEPTIONWHEN no_promo_found THENDBMS_OUTPUT.PUT_LINE ( No Sales found for Promotion: |ln_promotion_id);END;开发人员总是使用这个逻辑,问题在于oracle已经使用no_data_found条件处理这种情况。下面对其精简:DECLAREln_order_total number;ln_promotion_id number := 1;BEGINSELECT order_totalINTO ln_order_totalFROM oe.ordersWHERE prom

43、otion_id = ln_promotion_id;IF ln_order_count 0 THENSELECT SUM ( order_total )INTO ln_order_totalFROM oe.ordersWHERE promotion_id = ln_promotion_id;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE (No Sales found for Promotion: |ln_promotion_id);END;注:掌握并适当利用内置错误,以简化自己的代码Raise_application_error 过

44、程是DBMS_STANDARD内置包的组成成分,该过程允许生成ORA-相关信息, 而不需要首先声明异常变量或使用exception_init指令(可以简化代码)例使用Raise_application_error捕获错误条件DECLARECURSOR c_rental ISSELECT c.member_id, c.first_name| |c.last_name full_name, t.transaction_amountFROM video_store.transaction t, video_store.rental r, video_store.contact cWHERE r.re

45、ntal_id = t.rental_idAND r.customer_id = c.contact_id;BEGINFOR r_rental IN c_rental LOOPIF r_rental.transaction_amount 75 THENRAISE_APPLICATION_ERROR ( -20001, No transaction may be more than $75, TRUE );END IF;END LOOP;END;注:上述程序并未创建异常变量。此外,将用户定义20001 SQLCODE与错误消息关联。其中的true 参数通知过程在错误栈中包含该错误。第三个参数的默

46、认值是false,通知RAISE_APPLICATION_ERROR过程清除错误栈,并只打印错误消息。4.2 PL/SQL工具用户编写的许多PL/SQL应用程序将需要花费一定的时间来执行,一种最常见但却存在问题的技术是在提交时使用时间戳。更新的时间戳列标记哪些行已经被程序修改。然而问题在于,提交本身基于需呀耗费不少时间,将其放在应用程序的中间会引发如下问题:减慢应用程序导致oracle服务器上的内存和cpu占用率突然增高生成大量的重做日志信息我们需要的是一种记录程序活动而不需要额外消耗太多系统资源的方法。这种输出也称为程序工具(利用内置程序结合实际需要写的代码)本章小结:1、如果PL/SQL

47、程序在创建时没有进行适当的错误处理和工具化,则开发人员需要花很多时间来维护并反复检查程序结果。通过工具化代码并提供适当的错误管理结果,将会节省大量的维护和排错时间。2、运行错误消息回传到其主调用应用程序,而不要使用when others短语3、使用保存点回滚部分完成的事务,可以编码产生孤立数据,从而维护数据完整性。4、避免使用 goto语句5、掌握并适当采用内置错误,以简化自己的代码6、尽可能工具化自己的 pl/sql程序测验小结:1、 DBMS_ASSET包允许验证输入参数来过滤传入的web参数2、 PLS-错误是PL-SQl错误3、 ORA-错误与常规数据库错误和SQL有关4、 RAISE

48、_APPLICATION_ERROR允许引发一个自定义异常,但是不等价于RAISE语句。RAISE 语句允许调用申明块中预定义的EXCEPTION变量5、 pragma exception_init允许将一个默认错误号映射到用户定义变量,然后可以使用RAISE语句引发该错误。6、 SQLCODE对于PL/SQL 块中引入的错误返回错误代码号7、 使用在-20000和-20999范围之间的错误号才能引发RAISE_APPLICATION_ERROR调用Chap5 函数5.1函数构架5.1.1传值函数传值函数在调用时接受值,在完成时返回单个值。形参只有in模式5.1.2传址函数在调用传址函数时,至

49、少发送一个或多个局部变量引用作为实参。形参有三种可能模式(in、in out、out)传址函数并不像传值函数那样将形参全部消耗,虽然in模式参数被消耗,但in out模式变量通常会在更改状态后返回5.1.3函数模型选择当希望消耗输入并产生某种结果时,应该将函数实现为传值函数当需要验证客户端或web交互程序的完成情况或返回结果时,应该使用传址模式。5.1.5调用参数说明create or replace function three(a number :=0,b number :=0,c number := 1) return number isbeginreturn (a-b)/c;end;位置参数说明实际调用参数依次映射到形参,但是必须为列表中的每个形参提供实参或调用值,当希望跳过某

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报