PLSQL应用问题汇总.docx
- 文档编号:9804171
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:28
- 大小:33.72KB
PLSQL应用问题汇总.docx
《PLSQL应用问题汇总.docx》由会员分享,可在线阅读,更多相关《PLSQL应用问题汇总.docx(28页珍藏版)》请在冰点文库上搜索。
PLSQL应用问题汇总
第一部分:
查询常用语句汇总
1.casewhenthen条件表达式
CASEWHENconditionTHENresult
[WHEN...]
[ELSEresult]
END
CASE子句可以用于任何表达式可以有效存在的地方。
condition是一个返回boolean的表达式。
如果结果为真,那么CASE表达式的结果就是符合条件的result。
如果结果为假,那么以相同方式搜寻任何随后的WHEN子句。
如果没有WHENcondition为真,那么case表达式的结果就是在ELSE子句里的值。
如果省略了ELSE子句而且没有匹配的条件,结果为NULL。
例子:
SELECT*FROMtest;
a
---
1
2
3
SELECTa,
CASEWHENa=1THEN'one'
WHENa=2THEN'two'
ELSE'other'
END
FROMtest;
a|case
---+-------
1|one
2|two
3|other
所有result表达式的数据的类型都必须可以转换成单一的输出类型。
下面这个"简单的"CASE表达式是上面的通用形式的一个特殊的变种。
CASEexpression
WHENvalueTHENresult
[WHEN...]
[ELSEresult]
END
先计算expression的值,然后与所有在WHEN子句里声明的value对比,直到找到一个相等的。
如果没有找到匹配的,则返回在ELSE子句里的result(或者NULL)。
这个类似于C里的switch语句。
上面的例子可以用简单CASE语法来写:
SELECTa,
CASEaWHEN1THEN'one'
WHEN2THEN'two'
ELSE'other'
END
FROMtest;
a|case
---+-------
1|one
2|two
3|other
CASE表达式并不计算任何对于判断结果并不需要的子表达式。
比如,下面是一个可以避免被零除的方法:
SELECT...WHERECASEWHENx<>0THENy/x>1.5ELSEfalseEND;
2.oracle pl/sql INSTR(C1,C2,I,J)
INSTR(C1,C2,I,J)在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1
SQL>selectinstr('oracletraning','ra',1,2)instringfromdual;
INSTRING
---------
9
INSTR方法的格式为
INSTR(源字符串,目标字符串,起始位置,匹配序号)
例如:
INSTR('CORPORATEFLOOR','OR',3,2)中,源字符串为'CORPORATEFLOOR',目标字符串为'OR',起始位置为3,取第2个匹配项的位置。
默认查找顺序为从左到右。
当起始位置为负数的时候,从右边开始查找。
所以SELECTINSTR('CORPORATEFLOOR','OR',-1,1)"Instring"FROMDUAL的显示结果是
Instring
——————
14
3.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函数的实参支持值。
SELECTcheckup_type,
DECODE(blood_test_flag,’Y’,’Yes’,’N’,’No’,NULL,’None’,’Invalid’)
FROMcheckup;
例如:
selectdecode(x,1,‘xis1’,2,‘xis2’,‘others’)fromdual
当x等于1时,则返回‘xis1’。
当x等于2时,则返回‘xis2’。
否则,返回others’。
需要,比较2个值的时候,可以配合SIGN()函数一起使用。
SELECTDECODE(SIGN(5-6),1'IsPositive',-1,'IsNagative','IsZero')
同样,也可以用CASE实现:
SELECTCASESIGN(5-6)
WHEN1THEN'IsPositive'
WHEN -1THEN'IsNagative'
ELSE 'IsZero'END
FROMDUAL
此外,还可以在Orderby中使用Decode。
例如:
表table_subject,有subject_name列。
要求按照:
语、数、外的顺序进行排序。
这时,就可以非常轻松的使用Decode完成要求了。
select*fromtable_subjectorderbydecode(subject_name,'语文',1,'数学',2,,'外语',3)
4.UNION和UNIONALL的区别
在数据库中,UNION和UNIONALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。
如:
select*fromgc_dfys
union
select*fromls_jg_dfys
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
而UNIONALL只是简单的将两个结果合并后就返回。
这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,UNIONALL要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNIONALL,如下:
select*fromgc_dfys
unionall
select*fromls_jg_dfys
5.在SQL中如何显示字段为'编号'重复的记录?
Select*FromTabName1ASaWhereExists(Select*FromTabName1ASbWhereb.编号=a.编号GroupBy编号havingCount(*)>1)
6.MINUS关键字两个查询语句相减
SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。
如果有的话,那这一笔记录就被去除,而不会在最后的结果中出现。
如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,其语法如下:
[SQLSegment1]
MINUS
[SQLSegment2]
其实简单的一句话就是找出第一条SQL查询的不在第二条SQL语句查询结果中的那些记录,并且要注意最后返回的结果集中,不同的记录只会被列出一次!
9.instr用法
InStr([start,]string1,string2[,compare])
start可选参数。
为数值表达式,设置每次搜索的起点。
如果省略,将从第一个字符的位置开始。
如果start包含Null,将发生错误。
如果指定了compare参数,则一定要有start参数。
string1必要参数。
接受搜索的字符串表达式。
string2必要参数。
被搜索的字符串表达式。
Compare可选参数。
指定字符串比较。
如果compare是Null,将发生错误。
如果省略compare,OptionCompare的设置将决定比较的类型。
7.sql中exists和in的区别
exists只是返回有没有相同的记录,跟字段相不相同没有关系.
exists返回的是trueorfalse,而不是记录集。
Exists代表存在量词,首先扫描外层查询的每一个元组,若对应内层查询非空,则外层查询的where后面条件为真,则取出外层相关元组;否则若对应内层查询为空,外层查询条件为假,则不取出该外层元祖。
对于表A的每一条数据,都执行select*from表Bwhere表B.id=表A.id的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示。
exits适合内小外大的查询,in适合内大外小的查询。
8.SQL用法小结
1.模糊查询:
select*from表名where查询字段like'%biao_'
%通配符--匹配任意字符
_通配符--匹配单个字符
2.字符串的连接(||):
select字段1||','||字段2别名from表名
输出:
字段1,字段2
3.查找非空项:
select*from表名where字段isnotnull
4.集合查询:
union返回两个查询的结果并去除其中的重复部分:
select字段1from表1unionselect字段1from表2
unionall与union一样对表进行了合并但是它不去掉重复的记录:
select字段1from表1unionallselect字段1from表2
intersect(相交)返回两个表中共有的行:
select字段1from表1intersectselect字段1from表2
mimus(相减)返回的记录是存在于第一个表中但不存在于第二个表中的记录例:
select字段1from表1mimusselect字段1from表2
5.从属运算(in,between)
select*from表where字段in('值1','值2',-----) ----括号内是数字则不需要用引号
select*from表where字段betweenMinandMax
二.函数
1.count:
该函数将返回满足WHERE条件子句中记录的个数
selectcount(*)from表where条件
2.sum返回某一列的所有数值的和
selectsum(字段)from表
3.avg可以返回某一列的平均值
selectavg(字段)from表
4.max(min)取得某一列中的最大(小)值
selectmax(字段)from表
select*from表where字段=min(字段)
@_@(太多了,不一一列举了,弄些自己喜欢的^_^)----------------
5.user该函数返回当前使用数据库的用户的名字
selectuser[from表]
三.子句
1.groupby用于分组
selectsum(字段1)from表groupby字段2having条件------按照字段2进行分组显示
2.having在分组中设置条件
四.子查询(子查询的条件可以关联主表和子表)
select*from表1where字段=(select字段from表2条件)---子查询的结果必须是唯一
select*from表1where字段in(select字段from表2条件)----子查询的结果不唯一
select*from表1where exists(select........)-----exists返回trueorfalse
五.精彩语句:
insertinto表1(字段1,字段2....)select字段1,字段2.....from表2条件-----复制表
六.创建和操作表
1.创建表:
CREATETABLEtable_name(field1datatype[NOTNULL]
field2datatype[NOTNULL]
field3datatype[NOTNULL]...)
2.ALTERTABLE语句可以帮助你做两件事
-加入一列到已经存在的表中
-修改已经存在的表中的某一列
ALTERTABLE语句的语法如下
ALTERTABLEtable_name MODIFYcolumn_namedata_type;> -------修改一列 3.删除表和数据库: DROPTABLEtable_name DROPDATABASEdatabase_name 4.创建临时表: createtable#table_name(field1datatype, . fieldndatatype 七,存贮过程: 创建存贮过程的语法: createprocedureprocedure_name [[(]@parameter_name datatype[(length)|(precision[,scale]) [=default][output] -----------参数 [,@parameter_name datatype[(length)|(precision[,scale]) [=default][output]]...[)]] [withrecompile] asSQL_statements 运行存贮过程的EXECUTE命令的语法: execute[@return_status=] procedure_name [[@parameter_name=]value| ------------参数值 [@parameter_name=]@variable[output]...]] [withrecompile] 八.SQLSERVER提供的全局变量: 在使用存储过程的时候你可以自己定义全局变量是非常有用的SQLSERVER也提供 了几种系统全局变量对于数据库的系统用户来说它可能是有用的下表中给出了这些变 量的全部清单你可以在SQLSERVERSYSTEM10的文档中找到它 变量名作用 @@char_convert如果字符转换成功时其值为0 @@client_csid客户机所使用字符集的ID @@client_csname客户机的字符集的名字 @@connections从SQLServer启动以来的登录次数 @@cpu_busy从SQLServer启动以来的CPU忙的时间总数 @@error错误的状态 @@identity插入到确定列中的最后一个值 @@idle从SQLServer启动以来的总时间数 @@io_busySQLServer用于I/O操作的时间 @@isolation当前的Transact-SQL程序的隔离级别 @@langid定义了本地语言的ID号 @@language定义了本地语言的名称 @@maxcharlen字符的最大长度 @@max_connections可与SQLSERVER进行连接的最大数量 @@ncharsizeAveragelengthofanationalcharacter. @@nestlevel当前进程的嵌套级别 @@pack_received从SQLServer启动以来的读入的数据包的数量 @@pack_sent从SQLServer所发出的输出包的数量 @@packet_errors从SQLServer启动以来产生错误的数量 @@procid当前正在运行的存储过程的ID号 @@rowcount上一个命令所涉及的行数 @@servername本地localSQLServer的名字 @@spid当前正在处理的进程ID号 @@sqlstatus存储状态信息 @@textsize由SELECT语句所返回的文本映像的最大长度 @@thresh_hysteresisChangeinfreespacerequiredtoactivateathreshold. @@timeticksNumberofmicrosecondspertick. @@total_errors在读写过程中产生的错误数 @@total_read在SQLServer启动以来读磁盘的次数 @@total_write在SQLServer启动以来写磁盘的次数 @@tranchained在Transact-SQL程序中当前事务的模式 @@trancount事务的嵌套级别 @@transtate当一个语句运行后当前事务的状态 @@version当前SQLServer的版本日期 第二部分: PL/SQL使用常用知识 第一章、PL/SQL存储过程编程 2008-04-1615: 41 PL/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(Proceduallanguage/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_nametype[CONSTANT][NOTNULL][: =value]; 注: 1)申明时可以有默认值也可以没有; 2)如有[CONSTANT][NOTNULL],变量一定要有一个初始值; 3)赋值语句为“: =”; 4)变量可以认为是数据库里一个字段; 5)规定没有初始化的变量为NULL; 第三章 1.数据类型 答: 1)标量型: 数字型、字符型、布尔型、日期型; 2)组合型: RECORD(常用)、TABLE(常用)、VARRAY(较少用) 3)参考型: REFCURSOR(游标)、REFobject_type 4)LOB(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLSQL 应用 问题 汇总