




已阅读5页,还剩106页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 bird,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定义变量与申明变量的区别:定义变量即为变量分配名称并指定数据类型;申明变量首先需要定义变量,然后为其赋值。(赋值也称为初始化)替代变量前面要加&前缀 且若替代变量为字符型时要加两个单引号 如&adeclare lv_whom varchar2(20);/*lv-whom为申明变量,a为替代变量,a没有变量类型*/ begin lv_whom := &a; end; 或者declare lv_whom varchar2(20); begin lv_whom := &a; end;但是要在输入框中字符加两个单引号替代变量用define申明,且定义时不可以指定类型,默认为char型Define x=emp;Select * from &x; /*调用要用&,此处不加单引号,解析后即为emp表*/ define x=adasd;select &x z from dual;/*此处解析后变为select adasd z from dual ,此处必须要有单引号,使adasd作为直接变量,否则出错*/所以替代变量是否加单引号要根据解析的值来确定注意:避免在声明块中将任何实参赋给局部变量 (constant变量除外),且替代变量与绑定变量都不应该在声明块中赋值定义为constant的变量,必须在申明块中申明,这意味着常量必须先定义,再给他赋一个不变的值绑定变量(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 end*/ PL/SQL procedure successfully completedx-1y-2也可以先定义好绑定变量,再将其赋给其他变量:var a numberbegin :a := 22;end;现将其运行再declarelv_a number;begin lv_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) isbegin dbms_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_OBJECTS WHERE OBJECT_NAME=STUDENT2;】错误二:过程中的参数不能指定具体长度2、函数块错误一:函数里面要有return,不是dbms_output.put_line(但实验之后二者均可以成功创建函数,但是调用时只有return的能没有错误的执行)create or replace function abc (aa varchar2)return varchar2 isbegin dbms_output.put_line(sdhl|aa);end;改为create or replace function abc(aa varchar2) return varchar2 isbegin return sdhl | aa;end;但函数不能像过程一样来执行,因为execute命令不允许管理函数返回值。必须要用call或begin dbms. end命令将返回值放入一个绑定变量(要先定义)中,在输出。(必须要先执行函数,在执行下面语句,不能一起运行)variable result varchar2(20);call abc(akdhak) into :result; -call后面只能用绑定变量?或者:SQL begin 2 dbms_output.put_line(abc(du); 3 end; 4 / sdhldu此处若用print则绑定变量不能加冒号只能为print result;但可以查询select :result from dual;(exec是sqlplus的命令,只能在sqlplus中使用。call是sql命令,任何工具都可以使用)2.1.6嵌套块命名块还可以嵌套在其他命名块或匿名块中,但嵌套命名块并不是已经发布的,这意味着在调用一个命名块时,被调用的命名块可能还没有定义declare procedure a is begin dbms_output.put_line(b|hello!); /*此处b为被调用函数,但之前没有被解析,所以运行会出错*/ end a; function b return varchar2 is begin return hello!; end b;begin a;end;注:所有匿名块都会在程序都会在实际执行前进行分析,分析是一个编译过程。分析过程将会识别标识符(保留字)、预定义标识符、引用标识符、用户定义变量、子例程或UDT。命名块也是标识符,PL/SQL按照自顶向下的次序,将标识符读取到内存中。上例中函数b因为在过程a的下面还没被解析,所以会出错。 使用“前向引用”可以修正这个问题,函数或过程的前向引用只需要函数或过程的署名,不需要同时包括署名和实现,这些署名在PL/SQL中叫做“占位程序(stub)”。占位程序允许编译过程在实现命名块之前接受其标识符名称。更正:declare procedure a;function b return varchar2;procedure a is begin dbms_output.put_line(b|hello!); end a; function b return varchar2 is begin return hello!; end b;begin a;end;2.2 变量:类型、赋值和运算符2.2.1文本数据类型用伪列来隐式地定义数据类型。伪列如%typeChar(20)为一个定长的类型,不管其中变量的长度有没有达到20,最后显示长度均为20字符Varchar2(20)则要根据实际情况来确定其长度Clob(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 数据类型的默认值在两个date相减时能起作用,只要在执行减法之前将其转化为timestamp,因为to_timestamp函数保留了date的精度,而该精度低于timestamp将天的间隔转换为秒的数据类型为interval day/day(4或其他数) to seconddeclare lv_interval interval day to second; lv_end_day date := sysdate; -sysdate与date对应 lv_start_day date := 18-4月-2012; begin lv_interval := to_timestamp(lv_end_day)-to_timestamp(lv_start_day); dbms_output.put_line(lv_interval); end;结果-20 14:56:54.000000 PL/SQL procedure successfully completedDate数据类型默认支持2位数字表示的天,timestamp的精度要求使用9位数字表示的天或者declare lv_interval interval day(9) to second; lv_end_day timestamp := systimestamp; -systimestamp与timestamp对应 lv_start_day timestamp := 18-4月-2012; begin lv_interval := lv_end_day-lv_start_day; dbms_output.put_line(lv_interval); end;结果-000002943 02:52:41.860000 PL/SQL procedure successfully completed将年的间隔转化为月份数的数据类型为interval year to month从一个日期中提取年 用 to_char(extract(year from lv_end_day)完整代码:declare lv_a date := 20-4月-2009; a varchar2(12);begin a := 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、case语句 分为简单的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 1.4 loopB、 游标循环 1、隐式 for i in (select 语句)loop 2、显式 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、始终在执行块中进行赋值或初始化。除非局部变量被视为常量2、在实现任何局部块命名之前,始终未其定义前向引用规范,从而确保这些局部命名块能够互相调用3、应尽可能使用表集合。避免用varray,因为前者不受固定大小的限制。Varray通常需要更改大小限制,这将花费时间和金钱4、显式游标应尽可能使用形参5、应尽可能使用SQL数据类型作为函数的返回值。SQL数据类型不需要编写管道化表函数对其进行封装就可以在SQL中使用,并且数据类型总是可检测的,因为它是目录中的一个命名集合或结构本章的问题1、在程序块中至少包括一个null语句,否则会编译错误2、PL/SQL中必须定义一个record结构,因为该结构是仅适用于PL/SQL环境的变量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持久性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选项将会在所有commit语句中有效例1、标准commit UPDATE hr.employees SET salary = salary * 1.03 WHERE department_id in ( 20, 30, 40 );Commit或将commit改为 COMMIT WORK WRITE IMMEDIATE WAIT;例2、含有nowait和batch选项的commit使用nowait选项将不会验证对重做和归档日志的写入避免重写oracle的提交等待过程。这样做可能会使自己的事物陷入危险例3、强制commit语句并写入注释INSERT INTO hr.job_historyVALUES ( 100, 01-Jan-2000, trunc( sysdate ), AD_PRES, 90 );COMMIT COMMENT 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 TRANSACTION READ ONLY NAME Distributed to NYC;-添加到该设置事物语句的distributed to NYC注释将会保存在dba_pc2_pending字典视图中(/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm)SELECT product_id , warehouse_id , quantity_on_hand FROM oe.inventoriesnyc_001 WHERE product_id = 3246;COMMIT;b、 锁定用户具有锁定自己所拥有的全部表的权限,如果想要锁定另一个模式中的表,则必须具有lock any table系统权限B1在游标内使用for updateDECLARE CURSOR c_employees IS SELECT * FROM hr.employees FOR UPDATE WAIT 10;-该行锁定c_employees游标中所引用的行。其中wait 10表示,若游标所引用的行已经存在锁定,则等待10秒,若前一次锁定持续时间大于10秒,则此次更新将会被取消,也可以用nowait关键字,表示存在锁定的情况下立即返回事物BEGIN FOR r_employees IN c_employees LOOP UPDATE hr.employees SET salary = salary * 1.025 WHERE CURRENT OF C_employees;-该语句引用游标中的最新行,最后锁定会一直持续,直至发出commit或rollback命令 END LOOP;END;B2发起lock table语句LOCK TABLE hr.employees IN EXCLUSIVE MODE NOWAIT;UPDATE hr.employees SET salary = salary * 1.025 WHERE department_id = 10;COMMIT;与for update语句不同,lock table命令将会锁定表中的每一行。此外,短语in exclusive mode 将会锁定除select语句之外的全部操作有效的锁定模式有 :row exclusive模式, 限制最少的锁定级别,允许行共享,并防止用户锁定整个表或锁定到row share模式row share模式, 除了没有独占共享的限制之外,该模式等同于row exclusiveshare模式, 允许select但是不允许其他更新share row exclusive 模式,等同于share模式,但是同时禁止用户锁定到share模式exclusive模式 限制最多的级别,阻止除select之外的所有DML操作C、 改善事物性能 利用批量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 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这样的备份程序是不够的2、使用简洁而有意义的名称来命名保存点3、强制可疑事务要求深入了解oracle系统更改号(system change number,SCN)和数据字典。只有当事务无法再次尝试时才使用commit force命令4、使用set transaction name 参数对分布式事务命名测验小结1、 原子性意味着一个事务全部写入到永久存储中或任何部分都没有写入到永久存储中2、 一致性意味着一个并发多用户系统中为所有事务分配相同的服务cpu时间量和内存3、 隔离性意味着一个事务的任何部分在事务完成并提交之前都不可见4、 持久性意味着事务在完成之后写入到冗余磁盘阵列5、 Undo_retention 参数(还不是很熟悉),设置语句在内存中运行的时间长度Chap4 错误管理数据库强化的两种方法是使用DBMS_ASSERT包和绑定变量。DBMS_ASSERT包用于验证输入参数的形式是否正确,以及模式和对象名称是否实际存在。绑定变量防止匿名PL/SQL块的嵌套4.1错误类型4.1.1编译时错误(即语法上有错误)很多程序员基于编写较大的代码块,而不愿意停下来执行临时编译。一次性调试很多错误可能会花费大量时间查看不重要的信息,尤其当错误栈中打印出许多不必要的信息时。一种更高效的编程方法是按逻辑分组来编写每个程序块,在函数单元完成后执行编译。例:循环式编码方法可以避免不必要的调试4.1.2语义错误语义错误只在程序内部发生的逻辑错误。如加减乘除的错误1、 Oracle提供的错误条件Oracle提供了超过2300页的预定义错误条件,程序员可以参考他们来编写或直接调用2、 Oracle sqlcode和sqlerrmSQLERRM是系统内置变量保存了当前错误的详细信息。Oracle databases error messages 11g guide 中的每个错误都有唯一的代号和消息。与错误条件相关联的数字值称为sqlcode。可以使用pragma exception_init关键字将变量与sqlcode代号关联。当希望在发生oracle错误的情况下执行特定任务时,该功能特别有用。例:用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_contact ADD ( CONSTRAINT ec_employee_id_unk UNIQUE ( employee_id, full_name );BEGIN FOR i IN 1 . 2 LOOP -此处因为循环两次,导致插入的数据一样,所以会导致违反unique约束- INSERT INTO emergency_contact VALUES ( 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则不执行其他代码了,为了对其执行额外的任务,则就需要进行捕获错误,此处当程序遇到ORA-00001错误时,运行执行dbms,而不会立即中断程序)declare unique_constraint exception;pragma exception_init (unique_constraint,-00001);BEGIN FOR i IN 1 . 2 LOOP INSERT INTO emergency_contact VALUES ( 1 , Jane Doe , +1.123.456.7890 , NULL , +1.123.567.8901 ); END LOOP; exception when unique_constraint then dbms_output.put_line(o,you throw the unique_constraint error);END;输出o,you throw the unique_constraint error PL/SQL procedure successfully completed3、 异常作用域Pl/sql块的连续性通过在匿名子块中封装可能的错误代码来维护。封装技术有:标准子块封装、循环子块封装、保存点重定向、goto跳转例1、 封装子块DECLARE ln_parent NUMBER; ln_child_level1 NUMBER; ln_child_level2 NUMBER; ln_random_0_1 NUMBER;BEGIN BEGIN DBMS_OUTPUT.PUT_LINE ( Made it past Parent. ); ln_random_0_1 := ROUND ( DBMS_RANDOM.VALUE ( 0, 1 ); ln_parent := 1 / ln_random_0_1; BEGIN DBMS_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; BEGIN DBMS_OUTPUT.PUT_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;EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ( SQLERRM );END;例2、 在循环内封装DECLARE ln_employee_id NUMBER; ln_order_total NUMBER; CURSOR c_employee IS SELECT * FROM hr.employees;BEGIN FOR r_employee IN c_employee LOOP ln_employee_id := r_employee.employee_id; DECLARE no_salesman_found exception; BEGIN SELECT SUM ( order_total ) INTO ln_order_total FROM oe.orders WHERE sales_rep_id = ln_employee_id; IF ln_order_total IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE ( ln_order_total ); ELSE RAISE no_salesman_found; END IF; EXCEPTION WHEN no_salesman_found THEN DBMS_OUTPUT.PUT_LINE ( Caught NO_SALESMAN_FOUND ); END; END LOOP;EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ( SQLERRM );END;例3、 保存点异常重试4、 定义自定义错误条件为了定义自己的错误条件,首先必须创建一个异常变量。最后在代码的异常块内必须说明这个错误的处理方法例:DECLARE ln_order_total number; ln_promotion_id number := 1; ln_order_count number; no_promo_found exception;BEGIN SELECT COUNT(*) INTO ln_order_count FROM oe.orders WHERE promotion_id = ln_promotion_id; IF ln_order_count 0 THEN SELECT SUM ( order_total ) INTO ln_order_total FROM oe.orders WHERE promotion_id = ln_promotion_id; ELSE raise no_promo_found; END IF;EXCEPTION WHEN no_promo_found THEN DBMS_OUTPUT.PUT_LINE ( No Sales found for Promotion: |ln_promotion_id);END;开发人员总是使用这个逻辑,问题在于oracle已经使用no_data_found条件处理这种情况。下面对其精简:DECLARE ln_order_total number; ln_promotion_id number := 1;BEGIN SELECT order_total INTO ln_order_total FROM oe.orders WHERE promotion_id = ln_promotion_id;IF ln_order_count 0 THEN SELECT SUM ( order_total ) INTO ln_order_total FROM oe.orders WHERE promotion_id = ln_promotion_id;EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE (No Sales found for Promotion: |ln_promotion_id);END;注:掌握并适当利用内置错误,以简化自己的代码Raise_application_error 过程是DBMS_STANDARD内置包的组成成分,该过程允许生成ORA-相关信息,而不需要首先声明异常变量或使用exception_init指令(可以简化代码)例使用Raise_application_error捕获错误条件DECLARE CURSOR c_rental IS SELECT c.member_id , c.first_name| |c.last_name full_name , t.transaction_amount FROM video_store.transaction t , video_store.rental r , video_store.contact c WHERE r.rental_id = t.rental_id AND r.customer_id = c.contact_id;BEGIN FOR r_rental IN c_rental LOOP IF r_rental.transaction_amount 75 THEN RAISE_APPLICATION_ERROR ( -20001, No transaction may be more than $75, TRUE ); END IF; END LOOP;END;注:上述程序并未创建异常变量。此外,将用户定义20001 SQLCODE与错误消息关联。其中的true参数通知过程在错误栈中包含该错误。第三个参数的默认值是false,通知RAISE_APPLICATION_ERROR过程清除错误栈,并只打印错误消息。4.2 PL/SQL工具用户编写的许多PL/SQL应用程序将需要花费一定的时间来执行,一种最常见但却存在问题的技术是在提交时使用时间戳。更新的时间戳列标记哪些行已经被程序修改。然而问题在于,提交本身基于需呀耗费不少时间,将其放在应用程序的中间会引发如下问题:减慢应用程序导致oracle服务器上的内存和cpu占用率突然增高生成大量的重做日志信息 我们需要的是一种记录程序活动而不需要额外消耗太多系统资源的方法。这种输出也称为程序工具(利用内置程序结合实际需要写的代码)本章小结:1、如果PL/SQL程序在创建时没有进行适当的错误处理和工具化,则开发人员需要花很多时间来维护并反复检查程序结果。通过工具化代码并提供适当的错误管理结果,将会节省大量的维护和排错时间。2、运行错误消息回传到其主调用应用程序,而不要使用when others短语3、使用保存点回滚部分完成的事务,可以编码产生孤立数据,从而维护数据完整性。4、避免使用goto语句5、掌握并适当采用内置错误,以简化自己的代码6、尽可能工具化自己的pl/sql程序测验小结:1、 DBMS_ASSET包允许验证输入参数来过滤传入的web参数2、 PLS-错误是PL-SQl错误3、 ORA-错误与常规数据库错误和SQL有关4、 RAISE_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传址函数在调用传址函数时,至少发送一个或多个局部变量引用作为实参。形参有三种可能模式(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 isbegin return (a-b)/c;end;位置参数说明实际调用参数依次映射到形参,但是必须为列表中的每个形参提供实参或调用值,当希望跳过某个形参时,可以赋值为nullbegin dbms_output.put_line(three(3,4,5);end;结果为-.2 PL/SQL procedure successfully completed命名参数说明实际调用参数不需要映射到形参序列begin dbms_output.put_line(three(c =4,b =3,a = 5);end;混合参数说明位置参数必须位于命名参数之前。且在第一个位置参数之后,只能省略可选参数。begin dbms_output.put_line(three(8,c =4);end;第一个参数是形参a,所以结果是8减去0并除以4结果:2 PL/SQL procedure successfully completed5.2函数开发限制:PL/SQL函数不能包含“数据操作语言”(DML)语言,或调用另一个包含DML语句的pl/sql单元,否则将会引发ORA-14551异常。该错误表示不能再查询内部执行DML操作。一个问题:虽然可以再SQL语句或PL/SQL块内部调用不带参数列表并且不适用括号的函数,但是在CALL语句中调用相同程序时必须使用空括号。例:利用之前的three函数variable a number;call three() into :a; -没有括号则会出错结果:Method calleda-0select :a from dual;结果: :A- 0a-0当然,也可以通过使用SQl来调用该函数,以节约时间(加不加括号均可以)SQL select three() from dual; THREE() - 良好的编程需要括号- 0 SQL select three from dual; THREE- 05.2.1确定性字句确定性函数在return number后面加上关键字deterministic (见各类知识要点)能够确
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 少儿活动中心策划方案
- 镇海炼化员工考试题库及答案
- 离婚协议书:涉及跨境财产分割及子女抚养协议
- 离婚时共同人寿保险权益分割与转移协议
- 离婚协议书中英对照及跨国财产转移操作指南
- 离婚房产过户合同范本:专业律师指导与风险控制要点
- 生物制品销售代理权及品牌推广合作协议书
- 学生校园安全教育条例
- 城市排水设计方案
- 校园安全教育绘画初中
- 《数学软件》课程教学大纲
- GB/T 18690.2-2017农业灌溉设备微灌用过滤器第2部分:网式过滤器和叠片式过滤器
- 粤教花城版小学音乐歌曲《哈哩噜》课件
- 河北省特种设备检验收费标准
- 集成电路技术导论课件
- 交管12123学法减分试题库带答案
- 培育和践行社会主义核心价值观的课件
- 交通标志牌工程施工组织设计(标准版)
- 全区建设工程质量检测人员岗位考试考核实施细则
- 【课件】《红烛》课件24张统编版高中语文必修上册
- 交通事故认定书复核申请书模板
评论
0/150
提交评论