PLSQL应用问题汇总.doc_第1页
PLSQL应用问题汇总.doc_第2页
PLSQL应用问题汇总.doc_第3页
PLSQL应用问题汇总.doc_第4页
PLSQL应用问题汇总.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一部分:查询常用语句汇总1.case when then条件表达式CASE WHEN condition THEN result WHEN . ELSE resultENDCASE 子句可以用于任何表达式可以有效存在的地方。 condition 是一个返回boolean 的表达式。 如果结果为真,那么 CASE 表达式的结果就是符合条件的 result。 如果结果为假,那么以相同方式搜寻任何随后的 WHEN 子句。 如果没有 WHEN condition 为真,那么 case 表达式的结果就是在 ELSE 子句里的值。 如果省略了 ELSE 子句而且没有匹配的条件, 结果为 NULL。 例子: SELECT * FROM test; a- 1 2 3SELECT a, CASE WHEN a=1 THEN one WHEN a=2 THEN two ELSE other END FROM test; a | case-+- 1 | one 2 | two 3 | other所有 result 表达式的数据的类型都必须可以转换成单一的输出类型。 下面这个简单的 CASE 表达式是上面的通用形式的一个特殊的变种。 CASE expression WHEN value THEN result WHEN . ELSE resultEND先计算 expression 的值, 然后与所有在WHEN 子句里声明的 value 对比,直到找到一个相等的。 如果没有找到匹配的,则返回在 ELSE 子句里的 result (或者 NULL)。 这个类似于 C 里的 switch 语句。 上面的例子可以用简单 CASE 语法来写: SELECT a, CASE a WHEN 1 THEN one WHEN 2 THEN two ELSE other END FROM test; a | case-+- 1 | one 2 | two 3 | otherCASE 表达式并不计算任何对于判断结果并不需要的子表达式。 比如,下面是一个可以避免被零除的方法: SELECT . WHERE CASE WHEN x 0 THEN y/x 1.5 ELSE false END;2.oraclepl/sqlINSTR(C1,C2,I,J)INSTR(C1,C2,I,J) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置;C1 被搜索的字符串C2 希望搜索的字符串I 搜索的开始位置,默认为1J 出现的位置,默认为1SQL select instr(oracle traning,ra,1,2) instring from dual; INSTRING-9INSTR方法的格式为INSTR(源字符串, 目标字符串, 起始位置, 匹配序号)例如:INSTR(CORPORATE FLOOR,OR, 3, 2)中,源字符串为CORPORATE FLOOR, 目标字符串为OR,起始位置为3,取第2个匹配项的位置。默认查找顺序为从左到右。当起始位置为负数的时候,从右边开始查找。所以SELECT INSTR(CORPORATE FLOOR, OR, -1, 1) Instring FROM DUAL的显示结果是Instring143. Oracle的DECODE()函数DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。区别于SQL的其它函数,DECODE函数还能识别和操作空值. 其具体的语法格式如下: DECODE(input_value,value,result,value,result,default_result); 其中: input_value 试图处理的数值。DECODE函数将该数值与一系列的序偶相比较,以决定最后的返回结果 value 是一组成序偶的数值。如果输入数值与之匹配成功,则相应的结果将被返回。对应一个空的返回值,可以使用关键字NULL于之对应 result 是一组成序偶的结果值 default_result 未能与任何一序偶匹配成功时,函数返回的默认值 下面的例子说明了,如何读取用户CHECKUP表SEAPARK中的BLOOD_TEST_FLAG列下的项目,作为DECODE函数的实参支持值。 SELECT checkup_type, DECODE(blood_test_flag,Y,Yes,N,No,NULL,None,Invalid) FROM checkup;例如: selectdecode( x , 1 , x is 1 , 2 , x is 2 , others) from dual 当x等于1时,则返回x is 1。 当x等于2时,则返回x is 2。 否则,返回others。 需要,比较2个值的时候,可以配合SIGN()函数一起使用。 SELECT DECODE( SIGN(5 -6), 1 Is Positive, -1, Is Nagative, Is Zero) 同样,也可以用CASE实现: SELECT CASE SIGN(5 - 6) WHEN 1 THEN Is Positive WHEN-1 THEN Is Nagative ELSEIs Zero END FROM DUAL 此外,还可以在Order by中使用Decode。 例如:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。 select * from table_subject order by decode(subject_name, 语文, 1, 数学, 2, , 外语,3)4.UNION 和UNION ALL 的区别在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。 从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下: select * from gc_dfys union all select * from ls_jg_dfys 5. 在SQL中如何显示字段为编号重复的记录?Select * From TabName1 AS a Where Exists(Select * From TabName1 AS b Where b.编号=a.编号 Group By 编号 having Count(*)1)6. MINUS关键字 两个查询语句相减SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有的话,那这一笔记录就被去除,而不会在最后的结果中出现。如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,其语法如下:SQL Segment 1MINUSSQL Segment 2其实简单的一句话就是找出第一条SQL查询的不在第二条SQL语句查询结果中的那些记录,并且要注意最后返回的结果集中,不同的记录只会被列出一次!9.instr用法InStr( start, string1, string2 , compare )start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。 string1 必要参数。接受搜索的字符串表达式。 string2 必要参数。被搜索的字符串表达式。 Compare 可选参数。指定字符串比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。 7.sql中exists 和 in 的区别exists只是返回有没有相同的记录,跟字段相不相同没有关系.exists返回的是true or false ,而不是记录集。 Exists代表存在量词,首先扫描外层查询的每一个元组,若对应内层查询非空,则外层查询的where后面条件为真,则取出外层相关元组;否则若对应内层查询为空,外层查询条件为假,则不取出该外层元祖。 对于表A的每一条数据,都执行select * from 表B where 表B.id=表A.id的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示。 exits适合内小外大的查询,in适合内大外小的查询。8. SQL用法小结1.模糊查询: select * from 表名 where 查询字段 like %biao_ %通配符-匹配任意字符_通配符-匹配单个字符2.字符串的连接(|): select 字段1 | , | 字段2 别名 from 表名输出: 字段1,字段23.查找非空项: select * from 表名 where 字段 is not null4.集合查询:union 返回两个查询的结果并去除其中的重复部分: select 字段1 from 表1 union select 字段1 from 表2union all 与 union 一样对表进行了合并但是它不去掉重复的记录: select 字段1 from 表1 union all select 字段1 from 表2intersect(相交) 返回两个表中共有的行: select 字段1 from 表1 intersect select 字段1 from 表2mimus(相减) 返回的记录是存在于第一个表中但不存在于第二个表中的记录例: select 字段1 from 表1 mimus select 字段1 from 表25.从属运算(in,between)select * from 表 where 字段 in (值1,值2,-) -括号内是数字则不需要用引号select * from 表 where 字段 between Min and Max二.函数1.count: 该函数将返回满足WHERE 条件子句中记录的个数select count(*) from 表 where 条件2.sum 返回某一列的所有数值的和select sum(字段) from 表3.avg 可以返回某一列的平均值select avg(字段) from 表4.max(min) 取得某一列中的最大(小)值select max(字段) from 表select * from 表 where 字段=min(字段)_ (太多了,不一一列举了,弄些自己喜欢的_)-5.user 该函数返回当前使用数据库的用户的名字select user from 表三.子句1.group by 用于分组select sum(字段1) from 表 group by 字段2 having 条件 -按照字段2进行分组显示2.having 在分组中设置条件四.子查询(子查询的条件可以关联主表和子表)select * from 表1 where 字段=(select 字段 from 表2 条件) -子查询的结果必须是唯一select * from 表1 where 字段 in (select 字段 from 表2 条件) -子查询的结果不唯一select * from 表1 whereexists (select .) -exists 返回true or false五.精彩语句:insert into 表1(字段1,字段2.) select 字段1,字段2. from 表2 条件 -复制表六.创建和操作表1.创建表:CREATE TABLE table_name (field1 datatype NOT NULL field2 datatype NOT NULL field3 datatype NOT NULL .)2.ALTER TABLE 语句可以帮助你做两件事 -加入一列到已经存在的表中 -修改已经存在的表中的某一列ALTER TABLE 语句的语法如下ALTER TABLE table_name -修改一列3.删除表和数据库:DROP TABLE table_name DROP DATABASE database_name4.创建临时表:create table #table_name (field1 datatype, . fieldn datatype七,存贮过程:创建存贮过程的语法:create procedure procedure_name (parameter_name datatype (length) | (precision , scale) = defaultoutput -参数 , parameter_name datatype (length) | (precision , scale) = defaultoutput.) with recompile as SQL_statements运行存贮过程的EXECUTE 命令的语法:execute return_status = procedure_name parameter_name = value | -参数值 parameter_name = variable output. with recompile八.SQL SERVER 提供的全局变量:在使用存储过程的时候你可以自己定义全局变量是非常有用的SQL SERVER 也提供了几种系统全局变量对于数据库的系统用户来说它可能是有用的下表中给出了这些变量的全部清单你可以在SQL SERVER SYSTEM10 的文档中找到它变量名作用char_convert 如果字符转换成功时其值为0client_csid 客户机所使用字符集的IDclient_csname 客户机的字符集的名字connections 从SQL Server启动以来的登录次数cpu_busy 从SQL Server启动以来的CPU 忙的时间总数error 错误的状态identity 插入到确定列中的最后一个值idle 从SQL Server启动以来的总时间数io_busy SQL Server用于I/O操作的时间isolation 当前的Transact-SQL程序的隔离级别langid 定义了本地语言的ID号language 定义了本地语言的名称maxcharlen 字符的最大长度max_connections 可与SQL SERVER进行连接的最大数量ncharsize Average length of a national character.nestlevel 当前进程的嵌套级别pack_received 从SQL Server启动以来的读入的数据包的数量pack_sent 从SQL Server所发出的输出包的数量packet_errors 从SQL Server启动以来产生错误的数量procid 当前正在运行的存储过程的ID号rowcount 上一个命令所涉及的行数servername 本地local SQL Server的名字spid 当前正在处理的进程ID号sqlstatus 存储状态信息textsize 由SELECT语句所返回的文本映像的最大长度thresh_hysteresis Change in free space required to activate a threshold.timeticks Number of microseconds per tick.total_errors 在读写过程中产生的错误数total_read 在SQL Server启动以来读磁盘的次数total_write 在SQL Server启动以来写磁盘的次数tranchained 在Transact-SQL程序中当前事务的模式trancount 事务的嵌套级别transtate 当一个语句运行后当前事务的状态version 当前SQL Server的版本日期第二部分:PL/SQL使用常用知识第一章、PL/SQL存储过程编程2008-04-16 15:41PL/SQL存储过程编程(上) 1. Oracle应用编辑方法概览 答:1) Pro*C/C+/. : C语言和数据库打交道的方法,比OCI更常用;2) ODBC 3) OCI: C语言和数据库打交道的方法,和ProC很相似,更底层,很少用; 4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多; 5) JDBC 6) PL/SQL: 存储在数据内运行, 其他方法为在数据库外对数据库访问; 2. PL/SQL 答:1) PL/SQL(Procedual language/SQL)是在标准SQL的基础上增加了过程化处理的语言; 2) Oracle客户端工具访问Oracle服务器的操作语言; 3) Oracle对SQL的扩充; 4. PL/SQL的优缺点 答:优点: 1) 结构化模块化编程,不是面向对象; 2) 良好的可移植性(不管Oracle运行在何种操作系统); 3) 良好的可维护性(编译通过后存储在数据库里); 4) 提升系统性能;缺点 1) 不便于向异构数据库移植应用程序(只能用于Oracle); 5. SQL与PL/SQL的区别 答:SQL:1) 第四代语言(智能语言); 2) 做什么,不管怎么做; 3) 缺少过程与控制语句; 4) 无算法 PL/SQL: 1) 扩展变量和类型; 2) 扩展控制结构; 3) 扩展过程与函数; 4) 扩展对象类型与方法 第二章 PL/SQL程序结构 1. PL/SQL块 答:1) 申明部分, DECLARE(不可少); 2) 执行部分, BEGIN.END; 3) 异常处理,EXCEPTION(可以没有); 2. PL/SQL开发环境 答:可以运用任何纯文本的编辑器编辑,例如:VI 3. PL/SQL字符集 答:PL/SQL对大小写不敏感 4. 标识符命名规则 答:1) 字母开头; 2) 后跟任意的非空格字符、数字、货币符号、下划线、或# ; 3) 最大长度为30个字符(八个字符左右最合适); 5. 变量声明 答:语法 Var_name type CONSTANTNOT NULL:=value; 注:1) 申明时可以有默认值也可以没有; 2) 如有CONSTANTNOT NULL, 变量一定要有一个初始值; 3) 赋值语句为“:=”; 4) 变量可以认为是数据库里一个字段; 5) 规定没有初始化的变量为NULL;第三章1. 数据类型 答:1) 标量型:数字型、字符型、布尔型、日期型; 2) 组合型:RECORD(常用)、TABLE(常用)、VARRAY(较少用) 3) 参考型:REF CURSOR(游标)、REF object_type 4) LOB(Large Object) 2. %TYPE 答:变量具有与数据库的表中某一字段相同的类型 例:v_FirstName studengts.first_name%TYPE; 3. RECORD类型 答:TYPE record_name IS RECORD( /*其中TYPE,IS,RECORD为关键字,record_name为变量名称*/ field1 type NOT NULL:=expr1, /*每个等价的成员间用逗号分隔*/ field2 type NOT NULL:=expr2, /*如果一个字段限定NOT NULL,那么它必须拥有一个初始值*/ . /*所有没有初始化的字段都会初始为NULL fieldn type NOT NULL:=exprn); 4. %ROWTYPE 答:返回一个基于数据库定义的类型 DECLARE v_StuRec Student%ROWTYPE; /*Student为表的名字*/ 注:与3中定一个record相比,一步就完成,而3中定义分二步:a. 所有的成员变量都要申明; b. 实例化变量; 5. TABLE类型 答:TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER; 例:DECLARE TYPE t_StuTable IS TABLE OF Student%ROWTYPE INDEX BY BINARY_INTERGER; v_Student t_StuTable; BEGIN SELECT * INTO v_Student(100) FROM Student WHERE id = 1001; END; 注:1) 行的数目的限制由BINARY_INTEGER的范围决定; 6. 变量的作用域和可见性 答:1) 执行块里可以嵌入执行块; 2) 里层执行块的变量对外层不可见; 3) 里层执行块对外层执行块变量的修改会影响外层块变量的值; 第四章 1. 条件语句 答:IF boolean_expression1 THEN . ELSIF boolean_expression2 THEN /*注意是ELSIF,而不是ELSEIF*/ . /*ELSE语句不是必须的,但END IF;是必须的*/ ELSE . END IF; 2. 循环语句 答:1) Loop . IF boolean_expr THEN /* */ EXIT; /* EXIT WHEN boolean_expr */ END IF; /* */ END LOOP; 2) WHILE boolean_expr LOOP . END LOOP; 3) FOR loop_counter IN REVERSE low_blound.high_bound LOOP . END LOOP; 注:a. 加上REVERSE 表示递减,从结束边界到起始边界,递减步长为一; b. low_blound 起始边界; high_bound 结束边界; 3. GOTO语句 答:GOTO label_name; 1) 只能由内部块跳往外部块; 2) 设置标签: 3) 示例: LOOP . IF D%ROWCOUNT = 50 THEN GOTO l_close; END IF; . END LOOP; ; . 4. NULL语句 答:在语句块中加空语句,用于补充语句的完整性。示例: IF boolean_expr THEN . ELSE NULL; END IF; 5. SQL in PL/SQL 答:1) 只有DML SQL可以直接在PL/SQL中使用; 第五章 1. 游标(CURSOR) 答:1) 作用:用于提取多行数据集; 2) 声明:a. 普通申明:DELCARE CURSOR CURSOR_NAME IS select_statement /* CURSOR的内容必须是一条查询语句*/ b. 带参数申明:DELCARE CURSOR c_stu(p_id student.ID%TYPE) SELECT * FROM student WHERE ID = p_id; 3) 打开游标:OPEN Cursor_name; /*相当于执行select语句,且把执行结果存入CURSOR; 4) 从游标中取数:a. FETCH cursor_name INTO var1, var2, .; /*变量的数量、类型、顺序要和Table中字段一致;*/ b. FETCH cursor_name INTO record_var; 注:将值从CURSOR取出放入变量中,每FETCH一次取一条记录; 5) 关闭游标: CLOSE Cursor_name; 注:a. 游标使用后应该关闭; b. 关闭后的游标不能FETCH和再次CLOSE; c. 关闭游标相当于将内存中CURSOR的内容清空; 2. 游标的属性 答:1) %FOUND: 是否有值; 2) %NOTFOUND: 是否没有值; 3) %ISOPEN: 是否是打开状态; 4) %ROWCOUNT: CURSOR当前的记录号; 3. 游标的FETCH循环 答:1) LOOP FETCH cursor INTO . EXIT WHEN cursor%NOTFOUND; /*当cursor中没记录后退出*/ END LOOP; 2) WHILE cursor%FOUND LOOP FETCH cursor INTO . END LOOP; 3) FOR var IN cursor LOOP FETCH cursor INTO. END LOOP; 第六章 1. 异常 答:DECLARE . e_TooManyStudents EXCEPTION; /* 申明异常 */ . BEGIN . RAISE e_TooManyStudents; /* 触发异常 */ . EXCEPTION WHEN e_TooManyStudents THEN /* 触发异常 */ . WHEN OTHERS THEN /* 处理所有其他异常 */ . END; PL/SQL存储过程编程(下) 1. 存储过程(PROCEDURE) 答:创建过程: CREATE OR REPLACE PROCEDURE proc_name (arg_nameIN|OUT|IN OUTTYPE, arg_nameIN|OUT|IN OUTTYPE) IS|AS procedure_body 1) IN: 表示该参数不能被赋值(只能位于等号右边); 2) OUT:表示该参数只能被赋值(只能位于等号左边); 3) IN OUT: 表示该类型既能被赋值也能传值; 2. 存储过程例子 答:CREATE OR REPLACE PROCEDURE ModeTest( p_InParm IN NUMBER, p_OutParm OUT NUMBER, p_InOutParm IN OUT NUMBER) IS v_LocalVar NUMBER; /* 声明部分 */ BEGIN v_LocalVar:=p_InParm; /* 执行部分 */ p_OutParm:=7; p_InOutParm:=7; . EXCEPTION . /* 异常处理部分 */ END ModeTest; 3. 调用PROCEDURE的例子 答:1) 匿名块可以调; 2) 其他PROCDEURE可以调用; 例: DECLARE v_var1 NUMBER; BEGIN ModeTest(12, v_var1, 10); END; 注:此时v_var1等于7 4. 指定实参的模式 答:1) 位置标示法:调用时添入所有参数,实参与形参按顺序一一对应; 2) 名字标示法:调用时给出形参名字,并给出实参 ModeTest(p_InParm=12, p_OutParm=v_var1, p_Inout=10); 注:a. 两种方法可以混用; b. 混用时第一个参数必须通过位置来指定。 5. 函数(Function)与过程(Procedure)的区别 答:1) 过程调用本身是一个PL/SQL语句(可以在命令行中通过exec语句直接调用); 2) 函数调用是表达式的一部分; 6. 函数的声明 答:CREATE OR REPLACE PROCEDURE proc_name (arg_nameIN|OUT|IN OUTTYPE, arg_nameIN|OUT|IN OUTTYPE) RETURN TYPE IS|AS procedure_body 注:1) 没有返回语句的函数将是一个错误; 7. 删除过程与函数 答:DROP PROCEDURE proc_name; DROP FUNCTION func_name; 第八章 1. 包 答:1) 包是可以将相关对象存储在一起的PL/SQL的结构; 2) 包只能存储在数据库中,不能是本地的; 3) 包是一个带有名字的声明; 4) 相当于一个PL/SQL块的声明部分; 5) 在块的声明部分出现的任何东西都能出现在包中; 6) 包中可以包含过程、函数、游标与变量; 7) 可以从其他PL/SQL块中引用包,包提供了可用于PL/SQL的全局变量。 8) 包有包头和包主体,如包头中没有任何函数与过程,则包主体可以不需要。 2. 包头 答:1) 包头包含了有关包的内容的信息,包头不含任何过程的代码。 2) 语法: CREATE OR REPLACE PACKAGE pack_name IS|AS procedure_specification|function_specification|variable_declaration|type_definition|exception_declaration|cursor_declaration END pack_name; 3) 示例: CREATE OR REPLACE PACKAGE pak_test AS PROCEDURE RemoveStudent(p_StuID IN students.id%TYPE); TYPE t_StuIDTable IS TABLE OF students.id%TYPE INDEX BY BINARY_INTEGER; END pak_test; 3. 包主体 答:1) 包主体是可选的,如包头中没有任何函数与过程,则包主体可以不需要。 2) 包主体与包头存放在不同的数据字典中。 3) 如包头编译不成功,包主体无法正确编译。 4) 包主体包含了所有在包头中声明的所有过程与函数的代码。 5) 示例: CREATE OR REPLACE PACKAGE BODY pak_test AS PROCEDURE RemoveStudent(p_StuID IN students.id%TYPE) IS BEGIN . END RemoveStudent; TYPE t_StuIDTable IS TABLE OF students.id%TYPE INDEX BY BINARY_INTEGER; END pak_test; 4. 包的作用域 答:1) 在包外调用包中过程(需加包名):pak_test.AddStudent(100010, CS, 101); 2) 在包主体中可以直接使用包头中声明的对象和过程(不需加包名); 5. 包中子程序的重载 答:1) 同一个包中的过程与函数都可以重载; 2) 相同的过程或函数名字,但参数不同; 6. 包的初始化 答:1) 包存放在数据库中; 2) 在第一次被调用的时候,包从数据库中调入内存并被初始化; 3) 包中定义的所有变量都被分配内存; 4) 每个会话都将拥有自己的包内变量的副本。 第九章 1. 触发器 答:1) 触发器与过程/函数的相同点 a. 都是带有名字的执行块; b. 都有声明、执行体和异常部分; 2) 触发器与过程/函数的不同点 a. 触发器必须存储在数据库中; b. 触发器自动执行; 2. 创建触发器 答:1) 语法: CREATE OR REPLACE TRIGGER trigger_name BEFORE|AFTER triggering_event ON table_reference FOR EACH ROW WHEN trigger_condition trigger_body; 2) 范例: CREATE OR REPLACE TRIGGER UpdateMajorStats AFTER INSERT OR DELETE OR UPDATE ON students DECLARE CURSOR c_Statistics IS SELECT * FROM students GROUP BY major; BEGIN . END Up; 3. 触发器 答:1) 三个语句(INSERT/UPDATE/DELETE); 2) 二种类型(之前/之后); 3) 二种级别(row-level/statement-level); 所以一共有 3 X 2 X 2 = 12 4. 触发器的限制 答:1) 不应该使用事务控制语句; 2) 不能声明任何LONG或LONG RAW变量; 3) 可以访问的表有限。 5. 触发器的主体可以访问的表 答:1) 不可以读取或修改任何变化表(被DML语句正在修改的表); 2) 不可以读取或修改限制表(带有约束的表)的主键、唯一值、外键列。 二、在PL/SQL 开发中调试存储过程和函数的一般性方法摘要: Oracle 在PLSQL中提供的强大特性使得数据库开发人员可以在数据库端完成功能足够复杂的任务, 本文将结合Oracle提供的相关程序包(package)以及一个非常优秀的第三方开发工具来介绍在PLSQL中开发及调试存储过程的方法,当然也适用于函数。准备工作 从一个最简单的存储过程开始 调试存储过程 在存储过程中写日志文件 捕获违例 版权声明: 本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息。Oracle 在PLSQL中提供的强大特性使得数据库开发人员可以在数据库端完成功能足够复杂的任务, 本文将结合Oracle提供的相关程序包(package)以及一个非常优秀的第三方开发工具来介绍在PLSQL中开发及调试存储过程的方法,当然也适用于函数。本文所采用的软件版本和环境:服务器: Oracle 8.1.2 for Solaris 8PL/SQL Developer 4.5准备工作在开始之前, 假设您已经安装好了Oracle的数据库服务, 并已经建立数据库, 设置好监听程序, 以允许客户端进行连接; 同时您已经拥有了一台设置好本地Net服务名的开发客户机, 并已经安装好PL/SQL Developer开发工具的以上版本或者更新.在下面的示例代码中,我们使用Oracle数据库默认提供的示例表 scott.dept 和 scott.emp. 建表的语句如下:create table SCOTT.DEPT(DEPTNO NUMBER(2) not null,DNAME VARCHAR2(14),LOC VARCHAR2(13)create table SCOTT.EMP(EMPNO NUMBER(4) not null,ENAME VARCHAR2(10),JOB VARCHAR2(9),MGR NUMBER(4),HIREDATE DATE,SAL NUMBER(7,2),COMM NUMBER(7,2),DEPTNO NUMBER(2)从一个最简单的存储过程开始我们现在需要编写一个存储过程, 输入一个部门的编号, 要求取得属于这个部门的所有员工信息, 包括员工编号和姓名. 员工的信息通过一个cursor返回给应用程序.create or replace procedure usp_getEmpByDept(in_deptNo in number,out_curEmp out pkg_const.REF_CURSOR) asbeginopen curEmp forselect empno,enamefrom scott.empwhere deptno = in_deptNo;end usp_getEmpByDept;上面我们定义了两个参数, 其中第二个参数需要利用cursor返回员工信息, PLSQL中提供了REF CURSOR的数据类型, 可以采用两种方式进行定义, 一种是强类型,一种是弱类型, 前者在定义时指定cursor返回的数据类型, 后者可以不指定, 由数据库根据查询语句进行动态绑定.在使用前必须首先使用TYPE关键字进行定义, 我们把数据类型REF_CURSOR定义在自定义的程序包中: pkg_constcreate or replace package pkg_const astype REF_CURSOR is ref cursor;end pkg_const;注意: 这个包需要在创建上面的存储过程之前被编译, 因为存储过程用到了包中定义的数据类型.调试存储过程使用PL/SQL Developer 登录数据库, 用户名scott, 密码默认为:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论