oracle regexp instr中的instr函数,在MSSQL中怎样替代

MSSQL和ORACLE的区别_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
21页免费22页免费13页免费11页免费15页免费15页免费6页免费1页免费7页免费4页免费
喜欢此文档的还喜欢6页免费
MSSQL和ORACLE的区别|M​S​S​Q​L​和​O​A​C​L​E​的​区​别
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢Mssql/Oracle函数大全
&&From: 本站原创
--聚合函数 use pubs go select avg(distinct price) --算平均数 from titles where type='business' go use pubs go select max(ytd_sales) --最大数 from titles go use pubs go select min(ytd_sales) --最小数 from titles go use pubs go select type,sum(price),sum(advance) --求和 from titles group by type order by type go use pubs go select count(distinct city) --求个数 from authors go use pubs go select stdev(royalty) --返回给定表达式中所有值的统计标准偏差 from titles go use pubs go select stdevp(royalty) --返回表达式中所有制的填充统计标准偏差 from titles go use pubs go select var(royalty) --返回所有值的统计方差 from titles go use pubs go select varp(royalty) --返回所有值的填充的统计方差 from titles go --数学函数 select sin(23.45),atan(1.234),rand(),PI(),sign(-2.34) --其中rand是获得一个随机数 --配置函数 SELECT @@VERSION --获取当前数据库版本 SELECT @@LANGUAGE --当前语言 --时间函数 select getdate() as 'wawa_getdate' --当前时间 select getutcdate() as 'wawa_getutcdate' --获取utc时间 select day(getdate()) as 'wawa_day' --取出天 select month(getdate()) as 'wawa_month' --取出月 select year(getdate()) as 'wawa_year' --取出年 select dateadd(d,3,getdate()) as wawa_dateadd --加三天,注意'd'表示天,'m'表示月,'yy'表示年,下面一样 select datediff(d,'','') as wawa_datediff --计算两个时间的差 select datename(d,'') as wawa_datename --取出时间的某一部分 select datepart(d,getdate()) as wawa_datepart --取出时间的某一部分,和上面的那个差不多 --字符串函数 select ascii(123) as '123',ascii('123') as '&123&',ascii('abc') as '&abc&' --转换成ascii码 select char(123),char(321),char(-123) --根据ascii转换成字符 select lower('ABC'),lower('Abc'),upper('Abc'),upper('abc') --转换大小写 select str(123.45,6,1), str(123.45,2,2) --把数值转换成字符串 select ltrim(' &左边没有空格&') --去空格 select rtrim('&右边没有空格& ') --去空格 select ltrim(rtrim(' &左右都没有空格& ')) --去空格 select left('sql server',3),right('sql server',6) --取左或者取右 use pubs select au_lname,substring(au_fname,1,1) --取子串 from authors order by au_lname select charindex('123','abc123def',2) --返回字符串中指定表达式的起始位置 select patindex('123','abc123def'),patindex('%123%','abc123def') --返回表达式中某模式第一次出现的起始位置 select quotename('abc','{'),quotename('abc') --返回由指定字符扩住的字符串 select reverse('abc'),reverse('上海') --颠倒字符串顺序 select replace('abcdefghicde','cde','xxxx') --返回呗替换了指定子串的字符串 select space(5),space(-2) --系统函数 select host_name() as 'host_name',host_id() as 'host_id',user_name() as 'user_name',user_id() as 'user_id',db_name() as 'db_name' --变量的定义使用 --声明局部变量 declare @mycounter int declare @last_name varchar(30),@fname varchar(20),@state varchar(2) --一下声明多个变量 --给变量赋值 use northwind go declare @firstnamevariable varchar(20), @regionvariable varchar(30) set @firstnamevariable='anne' --可以用set,也可以用select给变量赋值,微软推荐用set,但select在选择一个值直接赋值时很有用 set @regionvariable ='wa' select lastname,firstname,title --用声明并赋值过的变量构建一个Select语句并查询 from employees where firstname= @firstnamevariable or region=@regionvariable go --全局变量 select @@version --返回数据库版本 select @@error --返回最后的一次脚本错误 select @@identity --返回最后的一个自动增长列的id --while,break,continue的使用 --首先计算所有数的平均价格,如果低于30的话进入循环让所有的price翻倍, --里面又有个if来判断如果最大的单价还大于50的话,退出循环,否则继续循环,知道最大单价大于50就break出循环,呵呵, --我分析的应该对吧. use pubs go while (select avg(price) from titles) &$30 begin update titles set price=price*2 select max(price) from titles if(select max(price) from titles) &$50 break else continue end print 'too much for the marker to bear' --事务编程经典例子 --begin transaction是开始事务,commit transaction是提交事务,rollback transaction是回滚事务 --这个例子是先插入一条记录,如果出现错误的话就回滚事务,也就是取消,并直接return(返回),如果没错的话就commit 提交这个事务了哦 --上面的那个return返回可以返回一个整数值,如果这个值是0的话就是执行的时候没出错,如果出错了就是一个负数, --这个return也可以用在存储过程中,可用用 exec @return_status= pro_name来获取这个值 use pubs go begin tran mytran insert into stores(stor_id,stor_name) values('333','my books') go insert into discounts(discounttype,stor_id,discount) values('清仓甩卖',';,50.00) if @@error&&0 begin rollback tran mytran print '插入打折记录出错' return end commit tran mytran --事务处理的保存点示例 --做了事务保存点后可以rollback(回滚)到指定的保存点,不至于所有的操作都不能用 use pubs go select * from stores begin transaction testsavetran insert into stores(stor_id,stor_name) values(';,'W.Z.D Book') save transaction before_insert_data2 go insert into stores(stor_id,stor_name) values(';,'foreat Books') go rollback transaction before_insert_data2 select * from stores --存储存储过程 use pubs if exists(select name from sysobjects where name= 'proc_calculate_taxes' and type='P') drop procedure proc_calculate_taxes go create procedure proc_calculate_taxes (@p1 smallint=42,@p2 char(1),@p3 varchar(8)='char') as select * from titles --执行过程 EXECUTE PROC_CALCULATE_TAXES @P2='A' --创建对象(表、视图、存储过程、函数)命令] create table/view/procedure/function --创建表 create table tabtestvb (vbname varchar(10),value numeric(10)) go create table tabtestvb1 (vbname varchar(10),value1 numeric(10)) go --插入数据(两种方式) insert into tabtestvb(vbname,value) select aaa,123 insert into tabtestvb1(vbname,value1) select aaa,456 insert into tabtestvb(vbname,value) values (bbb,345) insert into tabtestvb1(vbname,value1) values (ccc,1002) --更改数据 update tabtestvb set value=798 where vbname=aaa --关联更改 update tabtestvb set value=tabtestvb1.value1 from tabtestvb1 where tabtestvb.vbname=tabtestvb1.vbname --删除数据 delete tabtestvb where vbname=aaa --无日志删除数据 truncate table tabtestvb --删除对象(表、视图、存储过程、函数)命令 drop table/view/proc/function --删除表 drop table tabtestvb drop table tabtestvb1 --赋值命令 set --定义变量 declare --流程控制语句 while ... break begin ... end if ...else ----1...100 的和 declare @nn numeric(3) declare @sum numeric(8) set @nn=1 set @sum=0 while @nn&=100 begin set @sum=@sum+@nn set @nn=@nn+1 end select @sum --加上条件:当@nn=20 时退出循环(计算出1...19的和) declare @nn numeric(3) declare @sum numeric(8) set @nn=1 set @sum=0 while @nn&=100 begin if @nn&&20 --begin set @sum=@sum+@nn --end else --begin break --end set @nn=@nn+1 end select @sum --全局变量 @@rowcount --返回受上一语句影响的行数 select 1 union all select 3 select @@rowcount @@error --返回最后执行的 transact-sql 语句的错误代码。 set @n =1 select @@error ----函数的使用 --返回当前日期 select getdate() --生成16进制的标志列uniqueidentifier select newid() --转换数据类型和格式 select convert(varchar(10),getdate(),120) 多软件公司都理解开发不依赖于特定数据库类型(例如Oracle、SQL Server、DB2)的应用程序的重要性,它可以让客户们选择自己习惯的平台。一般来说,软件开发人员都能够识别出他们的负责数据库维护的客户,和必须使用现有平台和个性化的客户。 关于Oracle和SQL Server之间的区别,已经有很多篇文章从企业的角度和数据库管理员的角度出发描写了两者之间的一般差别。在这篇文章里面,我将会从应用程序的角度向你描述SQL erver 和oracle平台之间的区别,并且将会讨论开发不依赖于数据库环境的应用程序的几种可能的方法。与此同时,我不会再论讨对于应用程序来说,两个平台之间显而易见的区别,例如表的分割和索引。 定义通用接口和语言有很少的几种通用语言和接口可以让应用程序不依赖于数据库,想来也可以以同样的方式应用在关系型数据库上面: ANSI是美国国家标准局定义的,这是一家志愿者成员的组织(用私人基金运转),他们在有关设备和程序等广泛领域内开发了国家承认的标准。在数据库领域,ANSI定义了编写SQL命令的标准,假设命令可以运行在任何的数据库上,而不需要更改命令的语法。ODBC是开放数据库连接(ODBC)接口,微软定义的,它可以让应用程序访问数据库管理系统(DBMS)中的数据,使用SQL作为访问数据的标准。ODBC允许最大的互联性,这意味着一个单个的应用程序可以访问不同的数据库管理系统。然后,应用程序终端用户可以添加开放数据库连接(ODBC)数据库驱动来将应用程序与他们所选择的数据库管理系统链接上。 OLE DB是ODBC的继承者,是一组允许例如基于VB、C++、Access等任何可以连接到类似SQL Server、Oracle、DB2、MySQL等后台的“前台”的软件组件。在许多种情况下,OLE DB组件都比原有的ODBC提供了好得多的性能。 JDBC(Java数据库连接)应用程序接口是Java编程语言和广泛范围的数据库,SQL数据库和其他表列数据源(例如电子表格或者普通文本文件)之间,进行不依赖于数据库的连接的行业标准。JDBD应用程序接口为基于SQL的数据库访问提供了调用级别的应用程序接口。真实世界中的通用接口不幸的是,并不是所有数据库级别的命令都是ANSI,每个数据库平台都有自己的扩展功能。对于ANSI或者通用接口,一般来说都代表着几本功能,因此也可能意味着丧失了性能方面的竞争力。对于小型数据库和小型应用程序来说,要维护对数据库的通用访问是简单的,但是当数据库和/或应用程序变得越来越大,越来越复杂,你就不得不向代码中添加功能。 SQL Server和Oracle的常用函数对比 ---------数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from dual 3.取整(小) S:select floor(-1.001) value O:select floor(-1.001) value from dual 4.取整(截取) S:select cast(-1.002 as int) value O:select trunc(-1.002) value from dual 5.四舍五入 S:select round(1.23456,4) value 1.23460 O:select round(1.23456,4) value from dual 1.2346 6.e为底的幂 S:select Exp(1) value 2.0451 O:select Exp(1) value from dual 2. 7.取e为底的对数 S:select log(2.0451) value 1 O:select ln(2.0451) 1 8.取10为底对数 S:select log10(10) value 1 O:select log(10,10) 1 9.取平方 S:select SQUARE(4) value 16 O:select power(4,2) value from dual 16 10.取平方根 S:select SQRT(4) value 2 O:select SQRT(4) value from dual 2 11.求任意数为底的幂 S:select power(3,4) value 81 O:select power(3,4) value from dual 81 12.取随机数 S:select rand() value O:select sys.dbms_random.value(0,1) 13.取符号 S:select sign(-8) value -1 O:select sign(-8) value from dual -1 ----------三角函数相关 14.圆周率 S:SELECT PI() value 3.7931 O:不知道 15.sin,cos,tan 参数都以弧度为单位 例如:select sin(PI()/2) value 得到1(SQLServer) 16.Asin,Acos,Atan,Atan2 返回弧度 17.弧度角度互换(SQLServer,Oracle不知道) DEGREES:弧度-〉角度 RADIANS:角度-〉弧度 ---------数值间比较 18. 求集合最大值 S:select max(value) value from (select 1 value union select -2 value union select 4 value union select 3 value)a O:select greatest(1,-2,4,3) value from dual 19. 求集合最小值 S:select min(value) value from (select 1 value union select -2 value union select 4 value union select 3 value)a O:select least(1,-2,4,3) value from dual 20.如何处理null值(F2中的null以10代替) S:select F1,IsNull(F2,10) value from Tbl O:select F1,nvl(F2,10) value from Tbl --------字符串函数 21.求字符序号 S:select ascii('a') value O:select ascii('a') value from dual 22.从序号求字符 S:select char(97) value O:select chr(97) value from dual 23.连接 S:select '11'+'22'+'33' value O:select CONCAT('11','22')||33 value from dual 23.子串位置 --返回3 S:select CHARINDEX('s','sdsq',2) value O:select INSTR('sdsq','s',2) value from dual 23.模糊子串的位置 --返回2,参数去掉中间%则返回7 // 本文转自 C++Builder 研究 -
S:select patindex('%d%q%','sdsfasdqe') value O:oracle没发现,但是instr可以通过第四个参数控制出现次数 select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6 24.求子串 S:select substring('abcd',2,2) value O:select substr('abcd',2,2) value from dual 25.子串代替 返回aijklmnef S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual 26.子串全部替换 S:Replace O:select Translate('fasdbfasegas','fa','我' ) value from dual 27.长度 S:len,datalength O:length 28.大小写转换 lower,upper 29.单词首字母大写 S:没发现 O:select INITCAP('abcd dsaf df') value from dual 30.左补空格(LPAD的第一个参数为空格则同space函数) S:select space(10)+'abcd' value O:select LPAD('abcd',14) value from dual 31.右补空格(RPAD的第一个参数为空格则同space函数) S:select 'abcd'+space(10) value O:select RPAD('abcd',14) value from dual 32.删除空格 S:ltrim,rtrim O:ltrim,rtrim,trim 33. 重复字符串 S:select REPLICATE('abcd',2) value O:没发现 34.发音相似性比较(这两个单词返回值一样,发音相同) S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差 返回0-4,4为同音,1最高 --------------日期函数 35.系统时间 S:select getdate() value O:select sysdate value from dual 36.前后几日 直接与整数相加减 37.求日期 S:select convert(char(10),getdate(),20) value O:select trunc(sysdate) value from dual select to_char(sysdate,'yyyy-mm-dd') value from dual 38.求时间 S:select convert(char(8),getdate(),108) value O:select to_char(sysdate,'hh24:mm:ss') value from dual 39.取日期时间的其他部分 S:DATEPART 和 DATENAME 函数 (第一个参数决定) O:to_char函数 第二个参数决定 参数---------------------------------下表需要补充 year yy, yyyy quarter qq, q (季度) month mm, m (m O无效) dayofyear dy, y (O表星期) day dd, d (d O无效) week wk, ww (wk O无效) weekday dw (O不清楚) Hour hh,hh12,hh24 (hh12,hh24 S无效) minute mi, n (n O无效) second ss, s (s O无效) millisecond ms (O无效) ---------------------------------------------- 40.当月最后一天 S:不知道 O:select LAST_DAY(sysdate) value from dual 41.本星期的某一天(比如星期日) S:不知道 O:SELECT Next_day(sysdate,7) vaule FROM DUAL; 42.字符串转时间 S:可以直接转或者select cast(''as datetime) value O:SELECT To_date(' 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL; 43.求两日期某一部分的差(比如秒) S:select datediff(ss,getdate(),getdate()+12.3) value O:直接用两个日期相减(比如d1-d2=12.3) SELECT (d1-d2)*24*60*60 vaule FROM DUAL; 44.根据差值求新的日期(比如分钟) S:select dateadd(mi,8,getdate()) value O:SELECT sysdate+8/60/24 vaule FROM DUAL; 45.求不同时区时间 S:不知道 O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL; -----时区参数,北京在东8区应该是Ydt------- AST ADT 大西洋标准时间 BST BDT 白令海标准时间 CST CDT 中部标准时间 EST EDT 东部标准时间 GMT 格林尼治标准时间 HST HDT 阿拉斯加—夏威夷标准时间 MST MDT 山区标准时间 NST 纽芬兰标准时间 PST PDT 太平洋标准时间 YST YDT YUKON标准时间 Oracle支持的字符函数和它们的Microsoft SQL Server等价函数: 函数 Oracle Microsoft SQL Server 把字符转换为ASCII ASCII ASCII 字串连接 CONCAT (expression + expression) 把ASCII转换为字符 CHR CHAR 返回字符串中的开始字符(左起) INSTR CHARINDEX 把字符转换为小写 LOWER LOWER 把字符转换为大写 UPPER UPPER 填充字符串的左边 LPAD N/A 清除开始的空白 LTRIM LTRIM 清除尾部的空白 RTRIM RTRIM 字符串中的起始模式(pattern) INSTR PATINDEX 多次重复字符串 RPAD REPLICATE 字符串的语音表示 SOUNDEX SOUNDEX 重复空格的字串 RPAD SPACE 从数字数据转换为字符数据 TO_CHAR STR 子串 SUBSTR SUBSTRING 替换字符 REPLACE STUFF 将字串中的每个词首字母大写 INITCAP N/A 翻译字符串 TRANSLATE N/A 字符串长度 LENGTH DATELENGTH or LEN 列表中最大的字符串 GREATEST N/A 列表中最小的字符串 LEAST N/A 如果为NULL则转换字串 NVL ISNULL 日期函数 函数 Oracle Microsoft SQL Server 日期相加 (date column +/- value) or ADD_MONTHS DATEADD 两个日期的差 (date column +/- value) or MONTHS_BETWEEN DATEDIFF 当前日期和时间 SYSDATE GETDATE() 一个月的最后一天 LAST_DAY N/A 时区转换 NEW_TIME N/A 日期后的第一个周日 NEXT_DAY N/A 代表日期的字符串 TO_CHAR DATENAME 代表日期的整数 TO_NUMBER (TO_CHAR)) DATEPART 日期舍入 ROUND CONVERT 日期截断 TRUNC CONVERT 字符串转换为日期 TO_DATE CONVERT 如果为NULL则转换日期 NVL ISNULL 转换函数 函数 Oracle Microsoft SQL Server 数字转换为字符 TO_CHAR CONVERT 字符转换为数字 TO_NUMBER CONVERT 日期转换为字符 TO_CHAR CONVERT 字符转换为日期 TO_DATE CONVERT 16进制转换为2进制 HEX_TO_RAW CONVERT 2进制转换为16进制 RAW_TO_HEX CONVERT 其它行级别的函数 函数 Oracle Microsoft SQL Server 返回第一个非空表达式 DECODE COALESCE 当前序列值 CURRVAL N/A 下一个序列值 NEXTVAL N/A 如果exp1 = exp2, 返回null DECODE NULLIF 用户登录账号ID数字 UID SUSER_ID 用户登录名 USER SUSER_NAME 用户数据库ID数字 UID USER_ID 用户数据库名 USER USER_NAME 当前用户 CURRENT_USER CURRENT_USER 用户环境(audit trail) USERENV N/A 在CONNECT BY子句中的级别 LEVEL N/A 合计函数 函数 Oracle Microsoft SQL Server Average AVG AVG Count COUNT COUNT Maximum MAX MAX Minimum MIN MIN Standard deviation STDDEV STDEV or STDEVP Summation SUM SUM Variance VARIANCE VAR or VARP Oracle还有一个有用的函数EXTRACT,提取并且返回日期时间或时间间隔表达式中特定的时间域: EXTRACT(YEAR FROM 日期)
引用功能被关闭了。
热门围观排行榜:
随便拿点来看看:
好多好多关键词
这些词比较火爆MSSQL与Oracle函数区别_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
20页免费27页免费11页免费15页免费7页免费11页免费1页免费3页免费1页免费4页免费
MSSQL与Oracle函数区别|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢2634人阅读
本人平时比较沉默,但朋友们都说我很疯狂&疯狂地学习、疯狂地工作。很久就有写点东西的打算啦,一直懒于打字,近来稍有空闲,决定杜撰此文,献给现些喜欢或不喜欢沉默的朋友。----疯子自序网上已经有很多SQL与ORACLE的对比 ,但本人要讲的即不是单纯的SQL,也不是单纯的ORACLE,更不是评价谁好谁坏(意思不大),而是两种数据库之相同和异同,本人曾讲授过SQL与ORACLE的课程,讲SQL时说SQL好,讲ORACLE时又说ORACLE棒,现在终于可以平心而评啦。估计有人现在会嘿嘿冷笑(又一个误人子弟的骗子),老实说,当初每次讲完课,就有这种感觉&教的人不得其法,学的人不得其道。说点严肃的事吧,据说比尔与艾里森在洗手间相遇,两个又是拥抱,又是KISS,不多久就吵了起来,比尔对查询分析器(SQL QUERY ANALYZE)赞不经绝口,艾里森嘿嘿冷笑,只说了一句话&SQL PLUS内秀。言归正传,且听我一一道来001、SQL与ORACLE的内存分配ORACLE的内存分配大部分是由INIT.ORA来决定的,一个数据库实例可以有N种分配方案,不同的应用(OLTP、OLAP)它的配置是有侧重的。SQL概括起来说,只有两种内存分配方式:动态内存分配与静态内存分配,动态内存分配充许SQL自己调整需要的内存,静态内存分配限制了SQL对内存的使用。002、SQL与ORACLE的物理结构& &总得讲,它们的物理结构很相似,SQL的数据库相当于ORACLE的模式(方案),SQL的文件组相当于ORACLE的表空间,作用都是均衡DISK I/O,SQL创建表时,可以指定表在不同的文件组,ORACLE则可以指定不同的表空间。&CREATE TABLE A001(ID DECIMAL(8,0)) ON [文件组]& & --------------------------------------------------------------------------------------------&CREATE TABLE A001(ID NUMBER(8,0)) TABLESPACE 表空间&注:以后所有示例,先SQL,后ORACLE003、SQL与ORACLE的日志模式SQL对日志的控制有三种恢复模型:SIMPLE、FULL、BULK-LOGGED;ORACLE对日志的控制有二种模式:NOARCHIVELOG、ARCHIVELOG。SQL的SIMPLE相当于ORACLE的NOARCHIVELOG,FULL相当于ARCHIVELOG,BULK-LOGGED相当于ORACLE大批量数据装载时的NOLOGGING。经常有网友抱怨SQL的日志庞大无比且没法处理,最简单的办法就是先切换到SIMPLE模式,收缩数据库后再切换到FULL,记住切换到FULL之后要马上做完全备份。004、SQL与ORACLE的备份类型SQL的备份类型分的极杂:完全备份、增量备份、日志备份、文件或文件组备份;ORACLE的备份类型就清淅多啦:物理备份、逻辑备份;ORACLE的逻辑备份(EXP)相当于SQL的完全备份与增量备份,ORACLE的物理备份相当于SQL的文件与文件组备份。SQL的各种备份都密切相关,以完全备份为基础,配合其它的备份方式,就可以灵活地备分数据;ORACLE的物理备份与逻辑备份各司其职。SQL可以有多个日志,相当于ORACLE日志组,ORACLE的日志自动切换并归档,SQL的日志不停地膨胀&&SQL有附加数据库,可以将数据库很方便地移到别一个服务器,ORACLE有可传输表空间,可操作性就得注意啦。005、SQL与ORACLE的恢复类型SQL有完全恢复与基于时间点的不完全恢复;ORACLE有完全恢复与不完全恢复,不完全恢复有三种方式:基于取消的、基于时间的、基于修改的(SCN)的恢复。不完全恢复可以恢复数据到某个稳定的状态点。006、SQL与ORACLE的事务隔离SET TRANSACTION ISOLATION LEVEL SQL有四种事务隔离级别:READ COMMITTED、READ UNCOMMITTED、REPEATABLE READ、SERIALIZABLEORACLE有两种事务隔离级别READ COMMITTED、SERIALIZABLESQL虽然有四种事务隔离,事务之间还是经常发生阻塞;ORACLE则利用回退段很好地实现了事务隔离,不会产生阻塞。SQL与ORACLE如果发生死锁,都可以很快地识别并将之处理掉。007 SQL与ORACLE的外键约束SQL的外键约束可以实现级联删除与级联更新,ORACLE则只充许级联删除。CREATE TABLE A001(ID INT PRIMARY KEY,NAME VARCHAR(20))CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE ON UPDATE CASCADE,AGE TINYINT)CREATE TABLE A001(ID INT PRIMAY KEY,NAME VARCHAR2(20))CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE,AGE NUMBER(2,0))008、SQL与ORACLE的临时表SQL的临时表用#或##开头,使用完后自动释放,ORACLE的临时表则存在数据库中,每个会话的数据都互不干涉。oracle临时表中的纪录可以被定义为自动删除(分commit方式和transaction方式),而表结构不会被自动删除。临时表的DML,DDL操作和标准表一样。CREATE TABLE #TEMP(ID INT,NAME VARCHAR(20))-------------------------------------------------------CREATE GLOBAL TEMPORARY TABLE TEMP(ID INT,VARCHAR2(20))009、SQL与ORACLE的类型转换SQL常用类型转换函数有:CAST、CONVERT、STRORACLE常用类型转换函数有:TO_CHAR、TO_NUMBER、TO_DATESELECT CONVERT(VARCHAR(20),GETDATE(),112)------------------------------------------------------------------------------------------------SELECT TO_CHAR(SYSDATE,&YYYYMMDD&)FROM DUAL010、SQL与ORACLE的自动编号SQL的编号一般由IDENTITY字段来提供,可以灵活地设定种子值,增量,取值范围有BIGINT、INT、SMALLINT、TINYINT、DEIMAL等;ORACLE的编号一般由SEQUENCE来提供,由NEXTVAL与CURVAL函数从SEQUENCES取值。CREATE TABLE A003(ID INT IDENTITY(-9999,9),NAME VARCHAR(20))-------------------------------------------------------------------------------------------------------CREATE SEQUENCE SEQ_001 START 9999 INCREMENT BY 9CREATE TABLE A004(ID INT)INSERT INTO A004 VALUES(SEQ_001.NEXTVAL)INSERT INTO A004 VALUES(SEQ_001.CURVAL+1)011、SQL与ORACLE的分区表&从严格意思上来讲,SQL还没有分区表,它的分区表是以UNION为基础,将多个结果集串起来,实际上是视图;ORACLE的分区表有多种:PARTITION BY RANGE、PARTITION BY HASH、PARTITION BY LIST,其它就是混合分区,以上三种基础分区的混合使用。当然ORACLE也可以象SQL那样分区视图。CREATE TABLE A1999(ID INT,NAME VARCHAR(20))CREATE TABLE A2000(ID INT,NAME VARCHAR(20))CREATE VIEW V_PART AS SELECT * FROM A1999 UNION SELECT * FROM A2000--------------------------------------------------CREATE TABLE A_PART1(ID INT,NAME VARCHAR2(20))PARTITON BY RANGE(ID)(PARTITION P1 VALUES LESS THEN (2000000) PATITION P2 VALUES LESS THEN (MAXVALUE))CREATE TABLE A_PART2(ID INT,NAME VARCHAR2(20))PARTITION BY HASH(ID) PARTITIONS 2 STORE IN (USERS01,USERS02)CREATE TABLE A_PART3(ID INT,NAME VARCHAR2(20))PARTITION BY LIST(ID)(PARTIION P1 VALUES(&01&,&03&,&05&) PARTITON P2 VALUES(&02&,&04&))012、SQL与ORACLE的存储过程SQL的存储过程可以很方便地返回结果集,ORACLE的存储过程只有通过游标类型返回结果集,这种结果集ADO不可识别,如果想使用ORACLE存储过程的结果集,只有使用ODAC开发包(DELPHI/BCB控件组
与CREATE PROCEDURE UP_001(@ID INT) ASBEGIN SELECT ID ,SUM(QTY) FROM A_TEST WHERE ID=@ID GROUP BY @IDEND------------------------------------------------------------CREATE OR REPLACE PACKAGE UP_002 ASTYPE MYCURSOR IS REF CURSOR;FUNCTION GETRECORD RETURN MYCURSOR;END;CEEATE OR REPLACE PACKAGE BODY UP_002 AS& & FUNCTION GETRECORD RETURN MYCURSOR AS& & & MC MYCURSOR;& &SL VARCHAR2(999);& & BEGIN& & OPEN MC FOR SELECT * FROM A001;& & RETURN MC;& & END; END;ORACLE的存储函数返回结果这么艰难,但SQL的触发器竟然也充许返回结果集就令人费解啦,触发器的调试比较麻烦,在SQL实际开发中,一般都将触发器要执行的代码放到过程中进行调试,在查询分析器中可以对过程进行设断点调试。013、SQL与ORACLE的触发器触发器的事务是引起触发动作事务的延续,在SQL的触发器中是可以无BEGIN TRAN而可以直接COMMIT TRAN的。SQL的触发器是表级触发器,DML影响一行或无数行触发动作只触发一次,ORACLE分表级触发器与行级触发器,触发的粒度更细腻一些,SQL在处理多行时就必须使用CURSOR啦。ORACLE使用INSERTING、DELTING、UPDATING判断执行了什么DML操作,SQL只有判断INSERTED、DELETED的记录数来判断执行了什么操作,只有INSERTED映象表记录数大于0表示INSERT,只有DELETED映象表记录数大于0表示DELETE,若两个表记录数都大于0表示UPDATE。用SQL的触发器实现级联添加、级联删除、级联更新CREATE TABLE A1(ID INT,NAME VARCHAR(20))CREATE TABLE A2(ID INT,NAME VARCHAR(20))CREATE TRIGGER TRI_A1_INS ON A1 FOR INSERT , DELETE , UPDATE AS BEGIN& DECLARE @I INT,@D INT,@ID INT& SELECT @I=COUNT(*) FROM INSERTED& SELECT @D=COUNT(*) FROM DELETED& --IF (@I&0 AND @D&0) 执行更新,由于用到游标,故略去& IF @I&0& & &INSERT INTO A2 SELECT * FROM INSERTED& IF @D&0& & &DELETE FROM A2 WHERE ID=@IDEND----------------------------------------------------------------------用ORACLE的触发器实现级联添加、级联删除、级联更新CREATE OR REPLACE TRI_A1_INS AFTER INSERT OR DELETE OR UPDATE ON A1 FOR EACH ROWBEGIN&IF INSERTING THEN& &INSERT INTO A2 SELECT * FROM :NEW;& & END IF;&IF DELETING THEN& &DELETE FROM A2 WHERE ID = :OLD.ID ;& & END IF;&IF UPDATING THEN& &UPATE A2 SET ID = :NEW.ID , NAME = &:NEW.NAME WHERE ID = :OLD.ID ;& & END IF;END 014、SQL与ORACLE的游标SQL的游标用@@FETCH_STATUS判断是否还有数据,ORACLE的游标用%FOUND、%NOTFOUND来判断游标是否结束,游标分服务端游标与客户端游标,在存储过程、函数、触发器中声明的游标为服务端游标,其它处声明的游标为客户端游标,游标需要使用较多的内存,但它比临时表的性能要优一些,因为临时表占用的是DISK I/O,DISK I/O应该比服务器的内存要更珍贵一些吧。015、SQL与ORACLE的重复记录删除好的数据库设计重复记录是不存在的,如果有重复记录如何删除呢?SQL可以使用SET ROWCOUNT N设置客户端缓冲区的记录来删除,ORACLE可以使用ROWID来进行,都必须进行一些简单的编程,SQL可以做用过程,更通用一些,ORACLE如果想做得通过不太容易,字段小些会更方便处理一些。DECLARE @M INTSELECT @M=COUNT(*) FROM A_TEST WHERE ID=XSELECT @M=@M-1SET ROWCOUNT @M & &--限制客户端缓冲区的记录数DELETE FROM A_TEST WHERE ID=XSET ROWCOUNT 0 & & --取消限制说明 删除某条记录的重复值,如果想清除表的所有重值要使用游标,取得所有的X---------------------------------------------------------------------DELETE FROM A_TEST A WHERE ROWID!=(SELECT MAX(ROWID) FROM A_TEST B& &WHERE A.ID=B.ID AND A.NAME=B.NAME)说明 当数据量较大时,这种方法将会使用系统大量的资源016 SQL与ORACLE的对象加密SQL与ORACLE的某些对象如过程、视图、函数、触发器可能涉及商业,开发商通常希望对这些对象进行加密,SQL的加密方法在创建时带上WITH ENCRYPTION,ORACLE的对象加密明显复杂一些,要使用WRAP工具,在ORACLE的BIN目录内。017 SQL与ORACLE的表生成SQL语句SQL与ORACLE的表如何才导成SQL语句呢?如果一定要编程实现,SQL需要将其它数据类型的字段转换成VARCHAR类型,ORACLE则可以隐式进行数据类型转换。CREATE TABLE A_SQL(ID INT,NAME VARCHAR(20)) &假如有两万记录SELECT &INSERT INTO A_SQL VALUES(&+CAST(ID AS VARCHAR(20))+&,&&&+NAME+&&&)& FROM A_SQL----------------------------------------------------------------SELECT &INSERT INTO A_SQL VALUES(&||ID||&,&||&&&||NAME||&&&||&)&&FROM A_SQL说明 SQL的字符串连接用+号,ORACLE字符串连接用||,单引号可以做转义符。018、SQL与ORACLE的动态SQLSQL与ORACLE都支持动态SQL语句,SQL用EXEC()执行的动态SQL语句,ORACLE用EXECUTE IMMEDIATE执行动态SQL。动态SQL的效率要比非动态SQL性能差,但使用起来非常灵活,可以根据不同条件执行不同的任务。DECLARE @SQL VARCHAR(99)SELECT @SQL=&declare @m int select @m=count(*) from sysobjects select @m&EXEC(@SQL)--------------------------------------------DECLARES VARCHAR2(99);BEGIN S:='SELECT COUNT(*) &FROM '||' USER_TABLES';EXECUTE IMMEDIATE S;END;19、返回记录集中前N条记录的语法?SQL只有使用TOP,ORACLE可以使用ROWNUMSELECT TOP N * FROM 记录集(表,视图,子查询)---------------------------------------------SELECT * FROM 记录集 WHERE ROWNUM&=N20 如何返回记录集中相临两记录之间某字段的差值?CREATE TABLE A001(ID INT,QTY INT)INSERT INTO A001 VALUES(1,20)INSERT INTO A001 VALUES(4,10)SELECT IDENTITY(INT,1,1) CODE,QTY INTO #X FROM A001SELECT B.QTY-A.QTY FROM #X A,#X B WHERE A.CODE=B.CODE-1DROP TABLE #X--------------------------------------------------------CREATE TABLE A002(ID INT)INSERT INTO A002 VALUES(1)INSERT INTO A002 VALUES(9)WITH A AS (SELECT ROWNUM RN,ID FROM A002)SELECT A2.ID-A1.ID FROM A A2,A A1 WHERE A2.RN=A1.RN-1说明 虽然语法大不相同,但最大的特点是两者都使用了自连接技术。21 如何返回任意某个范围之间的记录集?CREATE TABLE A03(ID INT)DECLARE @I INTSELECT @I=1WHILE @I&1000 BEGININSERT INTO A03 VALUES(@I)& SELECT @I=@I+1END--前部分是创建环境,后一部分是实现方法,比较牵强SELECT IDENTITY(INT,1,1) CODE,ID INTO #X FROM A03SELECT ID FROM #X WHERE CODE BETWEEN 10 AND 20DROP TABLE #X------------------------------------------------------BEGINFOR I IN 1..999 LOOP& INSERT INTO A03 VALUES(I);END LOOP;END;SELECT * FROM A03 WHERE ROWNUM&20MINUSSELECT * FROM A03 WHERE ROWNUM&10;说明 在数据提取方面,ORACLE有ROWID,ROWNUM使之有相当强的优势,SQL只有使用函数IDENTITY来构建一个临时表,这样来说还不好使用CURSOR来性能会好一些。通过这个例子,大家还可以看出SQL与ORACLE的程序结构,ORACLE更严谨、人性化一些。22、表A04中的含有A、B、C、D四个字段,当按A字段分组后,如果D等1,则只统计B的值,如果D等0,则只统计C的值。CREATE TABLE A04(A VARCHAR(20),B INT,C INT,D INT)INSERT INTO A04 VALUES('01',20,7,'0')INSERT INTO A04 VALUES('01',10,8,'1')INSERT INTO A04 VALUES('02',20,7,'1')INSERT INTO A04 VALUES('02',10,8,'0')SELECT A,SUM(CASE D WHEN 1 THEN B WHEN 0 THEN C END) FROM A04 GROUP BY A---------------------------------------------------------------SELECT A,SUM(DECODE(D,1,B,0,C)) FROM A04 GROUP BY A 说明 ORACLE 9I可以使用CASE语句来实现这种操作,但也可以用DECODE来作统计,使用CASE比DECODE提供了更为强大的功能,但DECODE的语法显然比CASE WHEN THEN END要简洁得多。23、如何删除数据库所有表?(ORACLE则是删除模式所有表)DECLARE @SQL VARCHAR(99),@TBL VARCHAR(30),@FK VARCHAR(30)DECLARE CUR_FK CURSOR LOCAL FOR& &SELECT OBJECT_NAME(CONSTID),OBJECT_NAME(FKEYID) FROM SYSREFERENCES--删除所有外键OPEN CUR_FKFETCH CUR_FK INTO @FK,@TBLWHILE @@FETCH_STATUS =0BEGINSELECT @SQL='ALTER TABLE '+@TBL+' DROP CONSTRAINT '+@FK& EXEC(@SQL)& --SELECT @SQL='DROP TABLE '+@TBL& FETCH CUR_FK INTO @FK,@TBLENDCLOSE CUR_FKDECLARE CUR_FKS CURSOR LOCAL FOR& &SELECT NAME FROM SYSOBJECTS WHERE XTYPE='U'OPEN CUR_FKSFETCH CUR_FKS INTO @TBLWHILE @@FETCH_STATUS =0BEGIN& &SELECT @SQL='DROP TABLE ['+@TBL+']'& &EXEC(@SQL)& &FETCH CUR_FKS INTO @TBLENDCLOSE CUR_FKS &----------------------------------------------------------------DECLARES VARCHAR2(99);CURSOR CUR_F IS SELECT CONSTRAINT_NAME,TABLE_NAME FROM USER_CONSTRAINTS& & &WHERE CONSTRAINT_TYPE='R';CURSOR CUR_T IS SELECT TABLE_NAME FROM USER_TABLES;BEGIN& FOR V IN CUR_F LOOP& & &S:='ALTER TABLE '||V.TABLE_NAME||' DROP CONSTRAINT '||V.CONSTRAINT_NAME;& & &EXECUTE IMMEDIATE S;& END LOOP;& & FOR T IN CUR_T LOOP& & & &S:='DROP TABLE '||T.TABLE_NAME;& & & &EXECUTE IMMEDIATE S;& & END LOOP;END;说明 SQL删除数据库时,用到了两个系统表:SYSREFERENCES、SYSOBJECTS,前一个可以获得所有外键键信息,后者可以获得所有表的信息,在删除表时还在表名上加了一对中括号,即使用表名含有空格键或其它特殊这符也可以顺利删除。在ORACLE中,要删除模式的所有表,方法和SQL差不多,需要用到的数据字典也有两个:USER_CONSTRAINTS、USER_TABLES;USER_CONSTRAINTS中CONSTRAINT_TYPE值等于R表示是外键,同样也要用到CURSOR与动态SQL,这里提醒一下大家,FOR & LOOP内的变量变量是FOR & LOOP声明的,可以ORACLE的程序结构比SQL简洁。24、如何统计数据库所有用户表的记录数(ORACLE统计模式内所有表的记录数)?& CREATE TABLE #TMP (QTY INT)& CREATE TABLE #TMP1 (TBL VARCHAR(30),QTY INT)&DECLARE @SQL VARCHAR(99),@TBL VARCHAR(30),@QTY INT& DECLARE CUR_FKS CURSOR LOCAL FOR& & &SELECT NAME FROM SYSOBJECTS WHERE XTYPE='U'& OPEN CUR_FKS& FETCH CUR_FKS INTO @TBL& WHILE @@FETCH_STATUS =0& BEGIN& & &SELECT @SQL='SELECT COUNT(*) FROM '+@TBL& & &INSERT INTO #TMP EXEC(@SQL)& & &SELECT @QTY=QTY FROM #TMP& & &INSERT INTO #TMP1 VALUES(@TBL,@QTY)& & &DELETE FROM #TMP & & &FETCH CUR_FKS INTO @TBL& END& CLOSE CUR_FKS && SELECT * FROM #TMP1---------------------------------------------------------------DESC DBMS_UTILITYEXECUTE DBMS_UTILITY.ANALYZE_SCHEMA('SCOTT','COMPUTE');SELECT TABLE_NAME,NUM_ROWS FROM USER_TABLES;说明 SQL的EXEC功能可谓十分强大,竟然可以和INSERT INTO合用,将结果集存入一个表中,MS可真牛。ORACLE就只好用个偷懒的方法,首先将要统计的模式进行统计分析,在数据字典中就记载了每个表的行数,ORACLE很简单吧。25、SQL与ORACLE快速建表的方法?SELECT * INTO 新表名称 FROM 子查询|表名-----------------------------------------CREATE TABLE 新表名称 AS 子查询说明 快速建表可以有效地消除碎片,速度极快。26、如何实现有一组有规则的编号(如&)?DECLARE @I INT,@C VARCHAR(20)SELECT @I=1WHILE @I&1000 BEGIN& SELECT @C=CASE WHEN @I&10 THEN '000'+CAST(@I AS CHAR(1))& & & & & & & & &WHEN @I BETWEEN 10 AND 99 THEN '00'+CAST(@I AS CHAR(2))& & & & & & & & &WHEN @I BETWEEN 100 AND 999 THEN '0'+CAST(@I AS CHAR(3))& & & & & & END& SELECT @C=CONVERT(VARCHAR(20),GETDATE(),112)+@C& SELECT @C & & --在查询分析器中输出& SELECT @I=@I+1END---------------------------------------------------------DECLAREC VARCHAR2(20);BEGIN& FOR I IN 1 .. 999 LOOP& & DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'YYYYMMDD')||LPAD(I,4,'0'));& END LOOP;END;说明 虽然都可以实现,但ORACLE的LPAD果然身手不凡,可怜的MS还没有类似LPAD的函数,只有用CASE进行判断组合,真得很蠢,如果你有好的办法,请明示,甚至连循环结构,SQL稍也不慎,就死循环啦(如果注释掉加蓝显示那条语句的话)。27、关于SQL与ORACLE的分布式结构SQL在分布式方面做得不错,不仅提供了链接服务器的方式供初级用户使用,还提供了OPENDATASOURCE、OPENXML、OPENQUERY、OPENROWSET等行集函数,可以方便地通过SQL语句从*.TXT、*.XLS、*.XML、*.MDB、*.DBF等介质获取数据,还可以从ORACLE、DB2、SYBASE等数据库获取数据;ORACLE在同构数据库之间提供了DB LINK,异构数据库之间提供了透明网关软件。28、现在有三个表,结构如下Score(FScoreId &成绩记录号,FSubID 课程号,FStdID 学生号,FScore & &成绩)student:(FID &学生号,FName &姓名)subject:(FSubID & 课程号,FSubName 课程名), & 怎么能实现这个表:姓名 & 英语 & 数学 & 语文 &历史张萨 & 78 & & 67 & & 89 & &76王强 & 89 & & 67 & & 84 & &96 & 李三 & 70 & & 87 & & 92 & &56李四 & 80 & & 78 & & 97 & &66SELECT A.FNAME AS 姓名, & & & 英语 = SUM(CASE B.FSUBNAME WHEN '英语' THEN C.FSCORE END), & & & 数学 = SUM(CASE B.FSUBNAME WHEN '数学' THEN C.FSCORE END), & & & 语文 = SUM(CASE B.FSUBNAME WHEN '语文' THEN C.FSCORE END), & & & 历史 = SUM(CASE B.FSUBNAME WHEN '历史' THEN C.FSCORE END)FROM STUDENT A, SUBJECT B, SCORE CWHERE A.FID = C.FSTDID AND B.FSUBID = C.FSUBID GROUP BY A.FNAME------------------------------------------------------------------------SELECT A.FNAME AS 姓名, & & &英语 = &SUM(DECODE(B.FSUBNAME,& 英语&,C.FSORE)),& & &数学 = &SUM(DECODE(B.FSUBNAME,& 数学&,C.FSORE)),& & &语文 = &SUM(DECODE(B.FSUBNAME,& 语文&,C.FSORE)),& & &历史 = &SUM(DECODE(B.FSUBNAME,& 历史&,C.FSORE)),FROM STUDENT A, SUBJECT B, SCORE CWHERE A.FID = C.FSTDID AND B.FSUBID = C.FSUBID GROUP BY A.FNAME说明 这个案例主要是运用CASE与DECODE,当然也涉及GROUP BY的用法。29、有两个表,用一条SQL语句算出商品A,B目前还剩多少?表结构如下:商品名称mc &商品总量sl &表一(AAA)& A & & & & 100& B & & & & 120商品名称mc &出库数量sl 表二(BBB)& &A & & & & 10& &A & & & & 20& &B & & & & 10& &B & & & & 20SELECT TA.商品名称,A-B AS 剩余数量 FROM(SELECT 商品名称,SUM(商品总量) AS A FROM AAA GROUP BY 商品名称)TA,(SELECT 商品名称,SUM(出库数量) AS B FROM BBB GROUP BY 商品名称)TBWHERE TA.商品名称=TB.商品名称----------------------------------------------------------SELECT 商品名称,SUM(商品总量)剩余数量 FROM (SELECT * FROM AAA UNION ALLSELECT 商品名称,-出库数量 FROM BBB)A GROUP BY 商品名称30、如何将A表的某个字段更新到表B的某个字段?UPDATE A SET QTY=B.QTY FROM B WHERE A.CODE=B.CODE---------------------------------------------------UPDATE A SET QTY=(SELECT QTY FROM B WHERE B.CODE=A.CODE)说明 这两道题在语法上SQL与ORACLE没有发别,只不过是两种思路而已。31、有一个商品销售表,记载了某月商品的销售数量,现在要为所有商品排名次,放到一个单独的字段中,就是说达到右边显示的效果,如何作?BU1032 &5 &NULL & & &BUPS2091 &3 &NULL & & &PSPC8888 &50 &NULL & & &PCUPDATE X SET ORD=(SELECT COUNT(*)+1 FROM X B WHERE B.QTY&X.QTY)----------------------------------------------------------------SELECT CODE,QTY,RANK() OVER (ORDER BY QTY) ORD FROM A_TEST说明 SQL中的排序是通过UPDATE更新,然后再显示出来,而ORACLE使用了RANK OVER函数,直接将数据集显示出来,而且RANK OVER函数还可以通过PARTITION BY对分组中的数据进行排序。32、SQL与ORACLE的文件结构SQL文件被格式化为8K为单位的页,每8个相邻的页称为盘区(64K),若该盘区分配给一个对象,称为一致盘区,若分配给多个对象等为混合盘区,SQL有全局分配页面、数据页面、索引页页、BLOB页面、TEXT页面。ORACLE的文件最小逻辑单位是由INIT.ORA中的BLOCK_SIZE的值决定的,可以取2K、4K、6K、8K、16K、32K等,ORACLE的盘区是由一些块组成的,ORACLE的段是由盘区组成的,ORACLE有数据段、索引段、回退段(UNDO段)、临时段、CLOB/BLOB段、CLUSTER段等。33、SQL与ORACLE如何取得一个全局唯一标识标(GUID)SELECT NEWID()----------------------------------SELECT SYS_GUID() FROM DUAL34、本人有一张表单, 要求统计COL1~COL6中不等于2的列的个数,数据如下:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ROW_ID | &COL1 &| &COL2 &| &COL3 &| &COL4 &| &COL5 &| &COL6 &|& 1 & &| & &2 & | & &1 & | & &1 & | & &2 & | & &3 & | & &2 & |& 2 & &| & &1 & | & &1 & | & &2 & | & &2 & | & &2 & | & &2 & |& 3 & &| & &2 & | & &3 & | & &2 & | & &2 & | & &1 & | & &2 & |& 4 & &| & &2 & | & &2 & | & &2 & | & &2 & | & &1 & | & &2 & |& 5 & &| & &1 & | & &2 & | & &2 & | & &2 & | & &2 & | & &2 & |& 6 & &| & &2 & | & &2 & | & &2 & | & &2 & | & &2 & | & &1 & |&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&要求结果如下:&&&&&&&&&&ROW_ID | COUNT &| & 1 & &| & &3 & | && 2 & &| & &2 & |& 3 & &| & &2 & |& 4 & &| & &1 & |& 5 & &| & &1 & |& 6 & &| & &1 & |SELECT ROW_ID,(6-(CASE WHEN COL1=2 THEN COL1 / 2 ELSE 0 END)-(CASE WHEN COL2=2 THEN COL2 / 2 ELSE 0 END)-(CASE WHEN COL3=2 THEN COL3 / 2 ELSE 0 END)-(CASE WHEN COL4=2 THEN COL4 / 2 ELSE 0 END)-(CASE WHEN COL5=2 THEN COL5 / 2 ELSE 0 END)-(CASE WHEN COL6=2 THEN COL6 / 2 ELSE 0 END))AS COUNT FROM TABLE_A &说明 本例摘自&35、有一客户表,数据如下:客户 & & 日期 & & & & &资金F001 & & & & 123.00F002 & & & & 1223.00F002 & & & & 1123.00F003 & & & & 1231.00F003 & & & & 1232.00要求选出每个客户最新的哪条记录 组成一个结果集,结果如下:F001 & & & & 123.00F002 & & & & 1223.00F003 & & & & 1231.00实现方法:SELECT A.客户, B.日期, A.资金 FROM &客户资金表 A,& & (SELECT 客户, MAX(日期) 日期 &FROM 客户资金表 &GROUP BY 客户 ) BWHERE A.客户 = B.客户 AND A.日期 = B.日期&说明 ORACLE的写法与SQL一样,本例也摘自&36 现在看一个高难度的作业,后来解决办法和本例不同,请看需求。视图1 CITYWATER_VIEW行政区划名称 &城市用水量(亿M3) &。。。北京市 &15000 &&上海市 &9000 &&天津市 &5400 &&重庆市 &9500 &&表2 CODE区划 &代码北京市 &100000上海市 &200000天津市 &300000表3 CITYWATER代码 &城市用水0000000表1 DICTIONARY字段别名 &字段全名区划 &行政区划名称代码 &行政区划代码城市用水 &城市用水量(亿M3)表1-2是数据库public中的基表,表3是数据库water中的基表;在数据库water中创建视图1,用T-SQL语句怎样实现?把查询结果的&字段别名&修改为视图中的&字段全名&,如果采用T-SQL中的常用修改列标题方式(SELECT column_name AS expression或者SELECT expression= column_name ),很烦,每个基表里的字段太多,并且基表有近200个,字段近3000个。说明:其实现在要作的就是将表3中的&代码&、&城市用水&替代成表1中的行政区划代码、城市用户量(亿M3)等。CREATE VIEW V_GODAS SELECT A.[100000],B.[310000],B.[114011],B.[114111],B.[114421],B.[114311],B.[114321] FROM CODE A,FA01P B WHERE A.[200000]=B.[200000]DECLARE CUR_COL CURSOR LOCAL FOR & &SELECT NAME FROM SYSCOLUMNS WHERE ID=OBJECT_ID('V_GOD')DECLARE @COL VARCHAR(20),@SQL VARCHAR(999),& & & & @COL_TOTAL VARCHAR(8000),@ALIAS VARCHAR(99),& & & & @SOURCE VARCHAR(8000)OPEN CUR_COLFETCH CUR_COL INTO @COLWHILE @@FETCH_STATUS=0BEGIN& SELECT @ALIAS=字段名 FROM DICTIONARY WHERE 段码=@COL& IF @COL_TOTAL IS NULL & & &SELECT @COL_TOTAL=@ALIAS& ELSE& & &SELECT @COL_TOTAL=@COL_TOTAL+','+@ALIAS& FETCH CUR_COL INTO @COLENDCLOSE CUR_COLSELECT @SOURCE=RTRIM(TEXT) FROM SYSCOMMENTS WHERE ID=OBJECT_ID('V_GOD')SELECT @SOURCE=RTRIM(SUBSTRING(@SOURCE,CHARINDEX('AS',@SOURCE),LEN(@SOURCE)))SELECT @SOURCE='ALTER VIEW V_GOD('+@COL_TOTAL+') '+@SOURCEEXEC(@SOURCE)说明 由于该实例需要的表有两个已没有记录,所以大家只有看看T-SQL的语法及动态SQL的编写,ORACLE也类似。&37、如何用SQL操作一段XML文件?CREATE PROCEDURE UP_XML_TEST(@DOC VARCHAR(7999))ASBEGINDECLARE @IDOC INTEXEC SP_XML_PREPAREDOCUMENT @IDOC OUTPUT, @DOCSELECT *FROM & OPENXML (@IDOC, '/ROOT/DATASET/BOOKS',2)& WITH(TITLE VARCHAR(32) 'TITLE',& & & &AUTHOR VARCHAR(20) 'AUTHOR',& & & &PRICE DECIMAL(9,2) 'PRICE')EXEC SP_XML_REMOVEDOCUMENT @IDOCEND& & & &CREATE FUNCTION UF_XML_TEST(@DOC VARCHAR(7999))RETURNS @T TABLE(TITLE VARCHAR(32),& & & & AUTHOR VARCHAR(20),& & & & PRICE DECIMAL(9,2))ASBEGIN&DECLARE @IDOC INT&EXEC SP_XML_PREPAREDOCUMENT @IDOC OUTPUT, @DOC&INSERT INTO @T SELECT *&FROM & OPENXML (@IDOC, '/ROOT/DATASET/BOOKS',2)& &WITH(TITLE VARCHAR(32) 'TITLE',& & & & AUTHOR VARCHAR(20) 'AUTHOR',& & & & PRICE DECIMAL(9,2) 'PRICE')&EXEC SP_XML_REMOVEDOCUMENT @IDOC&RETURNENDDECLARE @DOC VARCHAR(7999)SELECT @DOC='&ROOT&&DATASET&&&BOOKS&& &&TITLE&DELPHI&/TITLE&& &&AUTHOR&ABC&/AUTHOR&& &&PRICE&38.00&/PRICE&&&/BOOKS&&&BOOKS&& &&TITLE&MIDAS&/TITLE&& &&AUTHOR&DEF&/AUTHOR&& &&PRICE&26.00&/PRICE&&&/BOOKS&&/DATASET&&/ROOT&'EXEC UP_XML_TEST @DOC--SELECT * FROM DBO.UF_XML_TEST(@DOC)说明 用过程可以方便地对XML进行操作,但编写成FUNCTION时就报错,大概MS的函数内部不充许执行OPENXML等这类行集函数。另一个重要的问题是,SQL的这种语法竟然不支持汉字字串,真是要命。38、使用DBMS_REPAIR检测与修复破损的BLOCK?ADMIN_TABLES &提供管理函数修复或孤立关键表,包含创建、净化与删除函数。CHECK_OBJECT &检测并报告表或索引的破损块。DUMP_ORPHAN_KEYS &导出破损块的数据FIX_CORRUPT_BLOCKS &在CHECK_OBJECT检测出的破损块上做标记REBUILD_FREELISTS &重建对象的FREELISTSSKIP_CORRUPT_BLOCKS &设置在表或索引扫描时是否不扫描被做了破损标记的块。SEGMENT_FIX_STATUS &整理BITMAP实体上的破损标志&上表列举了DBMS_REPAIR包所有的过程,下边将对这些过程要引入的参数的枚举值进行说明,这引些参数将在过程应用中起决定作用。object_type &TABLE_OBJECT, INDEX_OBJECT, CLUSTER_OBJECTaction &CREATE_ACTION, DROP_ACTION, PURGE_ACTIONtable_type &REPAIR_TABLE, ORPHAN_TABLEflags &SKIP_FLAG, NOSKIP_FLAG&SQL& &EXEC DBMS_REPAIR.ADMIN_TABLES('SCOTT.EMP',DBMS_REPAIR.REPAIR_TABLE,-DBMS_REPAIR.CREATE_ACTION,'USERS');ORA-24129: 表名 SCOTT.EMP 没有以前缀 REPAIR_ 开始SQL& EXEC DBMS_REPAIR.ADMIN_TABLES('REPAIR_EMP',DBMS_REPAIR.REPAIR_TABLE,-& & &DBMS_REPAIR.CREATE_ACTION,'USERS');& & SQL& SELECT OBJECT_NAME FROM REPAIR_EMP;& & SQL& EXEC DBMS_REPAIR.ADMIN_TABLES('ORPHAN_EMP',DBMS_REPAIR.ORPHAN_TABLE,-DBMS_REPAIR.CREATE_ACTION,'USERS');SQL& SELECT TABLE_NAME FROM ORPHAN_EMP;ADMIN_TABLES过程可以创建DBMS_REPAIR包的使用中需要的一些辅助表。SQL& DECLARE& & M INTEGER;& & BEGIN& & & DBMS_REPAIR.CHECK_OBJECT(SCHEMA_NAME=&'SCOTT',& & & & & & & & OBJECT_NAME=&'EMP',& & & & & & & & REPAIR_TABLE_NAME =&'REPAIR_EMP',& & & & & & & & CORRUPT_COUNT=&M);& & & DBMS_OUTPUT.PUT_LINE(M);& & END;说明 统计SCOTT模式的EMP表有多少破损块。其它的过程本人就不再一一举例说明啦,引用方法类似与上边的实例,其它一些过程的参数列表可以通用SQL&DESC DBMS_REPAIR来查看。39、关于UTL_FILE包的使用方法使用UTL_FILE时有个地方要注意:INIT.ORA文件中的UTL_FILE_DIR参数必须指定路径,即UTL_FILE包只有在UTL_FILE_DIR所指的目录中有权限读写,以下的实例表示本人已经修改UTL_FILE_DIR=C:/啦。SQL&DESC UTL_FILE& & 可以查看UTL_FILE包的所有类型与过程。例将表中数据输出到文件:CREATE OR REPLACE PROCEDURE UP_FILEW &IS& & ID NUMBER;& & NAME VARCHAR2(20);& & HANDLE &UTL_FILE.FILE_TYPE;& & CURSOR REGION_CUR &IS & SELECT * FROM A_JOB;BEGIN& &HANDLE :=UTL_FILE.FOPEN('C:/','JOB.OUT','W');& &OPEN &REGION_CUR;& &FETCH &REGION_CUR &INTO ID,NAME;& &WHILE &REGION_CUR%FOUND LOOP& & &UTL_FILE.PUTF(HANDLE,'%S,%S/N',ID,NAME);& & &FETCH &REGION_CUR &INTO &ID,NAME;& &END LOOP;& &CLOSE REGION_CUR;& &UTL_FILE.FFLUSH(HANDLE);& &UTL_FILE.FCLOSE(HANDLE);& &END UP_FILEW;&例将文件中数据写入到表中 &CREATE OR REPLACE PROCEDURE UP_FILER &IS& & &STR VARCHAR(200);& & &ID NUMBER;& & &NAME VARCHAR2(20);& & &HANDLE &UTL_FILE.FILE_TYPE;& & &POS NUMBER(6);&BEGIN& & HANDLE :=UTL_FILE.FOPEN('C:/','JOB.OUT','R');& & UTL_FILE.GET_LINE(HANDLE,STR);& & WHILE &LENGTH(STR)&0 LOOP& & & POS:=INSTR(STR,',');& & & ID := TO_NUMBER(SUBSTR(STR,1,POS-1));& & & NAME:=SUBSTR(STR,POS+1,LENGTH(STR));& & & --DBMS_OUTPUT.PUT_LINE(TO_CHAR(ID)||NAME);& & & INSERT INTO A_JOB VALUES(ID,NAME);& & & UTL_FILE.GET_LINE(HANDLE,STR);& & END LOOP;& & EXCEPTION& & WHEN OTHERS THEN& & & & &UTL_FILE.FCLOSE(HANDLE);END UP_FILER;说明:由于没办法判断文件是否结束,所以本例就使用EXCEPTION处理,在文件读完时触发异常,并关闭文件。UTL_FILE.FILE_TYPE是文件句柄,就象C或PASCAL中读写文件的方式是一样的。40、关于DBMS_JOB包的使用方法?首先在SQL&DESC DBMS_JOB来查看DBMS_JOB的一些过程,然后可以在RDBMS目录中找到DBMSJOB.SQL,这个文件就是DBMS_JOB包的源程序,并有参数说明,本例就给出来实例与常用的数据字典(USER_JOBS、DBA_JOBS、ALL_JOBS)。创建测试表SQL& CREATE TABLE A_JOB(DT DATE);创建一个自定义过程SQL& CREATE OR REPLACE PROCEDURE UP_TEST AS& & BEGIN& & & &INSERT INTO A_JOB VALUES(SYSDATE);& & END;& & /创建JOBSQL& VARIABLE JOB1 NUMBER;SQL& SQL& BEGINDBMS_JOB.SUBMIT(:JOB1,'UP_TEST;',SYSDATE,'SYSDATE+1/(24*60)');  --每天1440分钟,即一分钟运行TEST过程一次& & END;& & /运行JOBSQL& BEGIN& & DBMS_JOB.RUN(:JOB1);& & END;& & /查看结果SQL& SELECT TO_CHAR(DT,'YYYY/MM/DD HH24:MI:SS') 时间 FROM A_JOB;时间------------------- 23:51:21 23:52:22 23:53:24删除JOBSQL& BEGIN& 2 &DBMS_JOB.REMOVE(:JOB1);& 3 &END;& 4 &/说明:JOB1是BIND VARIABLE(绑定变量),相当于一个常局变量,在当前会话的生命期内可以引用,如果我们要删除一个JOB,通常是从USER_JOBS字典中找到JOB的ID。SQL& SELECT JOB FROM USER_JOBS;SQL&EXEC DBMS_JOB.REMOVE(上一句查出来的JOB号);41、关于DBMS_SQL包的使用方法?DBMS_SQL包是动态执行SQL语句的一个包,它使用方法比EXECUTE IMMEDIATE复杂,但功能更强大一些,最主要的是它执行的SQL可以超出64K的限制,DBMSSQL.SQL是该包的SQL源程序(RDBMS目录内)。DECLARE& & & T_C1_TNAME & & &USER_TABLES.TABLE_NAME%TYPE;& & & T_COMMAND & & & VARCHAR2(200);& & & T_CID & & & & & INTEGER;& & & T_TOTAL_RECORDS NUMBER(10);& & & STAT & & & & & &INTEGER;& & & ROW_COUNT & & & INTEGER;T_LIMIT & & & & INTEGER := 0; &--限制只取出记录大于0的表的情况& & & CURSOR C1 IS SELECT TABLE_NAME FROM USER_TABLES ORDER BY TABLE_NAME; &--查出所有表的名字BEGIN& & T_LIMIT := 0;& & OPEN C1;LOOP& & & &--取出一个表名& & & & & &FETCH C1 INTO T_C1_TNAME;& & & --如果游标记录取完,退出循环 & && & & & & &EXIT WHEN C1%NOTFOUND; & & && & & & & &T_COMMAND := 'SELECT COUNT(0) FROM '||T_C1_TNAME;& & & & & &T_CID := DBMS_SQL.OPEN_CURSOR; & &--创建一个游标& & & & & &DBMS_SQL.PARSE(T_CID,T_COMMAND,DBMS_SQL.NATIVE); &--向服务器发出一个语句并检查这个语句的语法和语义错误& & & & & &DBMS_SQL.DEFINE_COLUMN(T_CID,1,T_TOTAL_RECORDS); &--定义将从FETCHROWS()函数接收数据的变量的& & & & & &STAT := DBMS_SQL.EXECUTE(T_CID); & &--执行此语句,必须跟着FETCH_ROWS函数并为单个行检索数据& & & & & &ROW_COUNT := DBMS_SQL.FETCH_ROWS(T_CID); &--取回一行数据放入局部缓冲区& & & & & &DBMS_SQL.COLUMN_VALUE(T_CID,1,T_TOTAL_RECORDS); &--返回调用FETCHROWS()取回的值,值存储在T_TOTAL_RECORDS中& & & & & &IF T_TOTAL_RECORDS & T_LIMIT THEN& & & & & & & &DBMS_OUTPUT.PUT_LINE(RPAD(T_C1_TNAME,55,' ')||& & & & & & & &TO_CHAR(T_TOTAL_RECORDS,'')||' RECORD(S)'); & & & & & &END IF;& & & & & &DBMS_SQL.CLOSE_CURSOR(T_CID);& & &END LOOP;& & CLOSE C1;END;42、SQL与ORACLE取随机数的方法,本例要求从65到97之间的随机数?SELECT 65+FLOOR(RAND()*26)-------------------------------------------SELECT FLOOR(DBMS_RANDOM.VALUE(65,97)) FROM DUAL43、SQL与ORACLE取系统时间的方法SELECT GETDATE()-------------------------------------------SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MM:SS') FROM DUAL44、关于DBMS_FLASHBACK包的使用方法?DBMS_FLASHBACK包处理ORACLE的闪回功能,它是ORACLE9I新增的一个功能,可以方便地提取表中数据的前映象。你不要指望闪回功能帮你找回所有有意或无意删除的数据,它最多只能得到5天内的前映象而不用回退日志。SQL&DESC DBMS_FLASHBACK&现在看示例如下&SQL&CREATE TABLE A_TEST(ID INT);/*创建表后请退出SQL PLUS再进来做测试*/&SQL&INSERT INTO A_TEST VALUES(1);&SQL&COMMIT;&SQL&SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;& &此处显示SCN号1()&SQL&INSERT INTO A_TEST VALUES(2);&SQL&COMMIT;&SQL&SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;& &此处显示SCN号2 ()&SQL&SELECT * FROM A_TEST AS OF SCN &SQL&SELECT * FROM A_TEST AS OF SCN &SQL&SELECT * FROM A_TEST&说明:如果创建表A_TEST后立即使用SELECT * FROM &AS OF SCN 这种语法,ORACLE会返回ORA-01466: 无法读数据 - 表定义已更改,这是正常的,只有退出再进来就可以使用闪回语法啦,SYS用户无法使用闪回语法。相关链接:45、有一个表,记录数据较多,要求对同一分类的数据进行排序?工號 &姓名 &時間 & & 序號001 & abc & 08:00 & & 1001 & abc & 12:01 & & 2001 & abc & 13:28 & & 3001 & abc & 17:40 & & 4002 & def & &07:30 & &1002 & def & &22:59 & &2SQL的解决方法如下:CREATE TABLE A_TEST(ID VARCHAR(10),SJ VARCHAR(20),ORD INT)INSERT INTO A_TEST VALUES('001','07',0)INSERT INTO A_TEST VALUES('001','08',0)INSERT INTO A_TEST VALUES('001','09',0)INSERT INTO A_TEST VALUES('002','07',0)INSERT INTO A_TEST VALUES('002','08',0)INSERT INTO A_TEST VALUES('002','09',0)INSERT INTO A_TEST VALUES('003','07',0)INSERT INTO A_TEST VALUES('003','08',0)INSERT INTO A_TEST VALUES('003','09',0)UPDATE A_TEST SET ORD=(SELECT COUNT(*)+1 FROM A_TEST B WHERE B.SJ&A_TEST.SJ AND B.ID=A_TEST.ID)46、SQL与ORACLE如何延时执行程序?WAITFOR DELAY &00:01:00& & --延时一分钟WAITFOR TIME &&12:00:00& & --定时到12点整------------------------------------------------SQL&EXEC DBMS_LOCK.SLEEP(1)说明:DBMS_LOCK.SLEEP延时一分钟与SQL第一条语法作用相当。47、SQL与ORACLE如何返回服务器的IP地址?CREATE PROCEDURE GETIP ASBEGIN& CREATE TABLE M(DEMO VARCHAR(7999))& DECLARE @SQL VARCHAR(99)& SELECT @SQL='XP_CMDSHELL '+'''IPCONFIG'''& INSERT INTO M EXEC(@SQL)DECLARE @S VARCHAR(99),@IP VARCHAR(24),@P INT,@L INTSELECT @S=RTRIM(LTRIM(DEMO)) FROM M WHERE DEMO LIKE '%IP ADDRESS%'SELECT @L=LEN(@S),@P=CHARINDEX(':',@S,1)SELECT @IP=RTRIM(LTRIM(RIGHT(@S,@L-@P)))SELECT @IP& DROP TABLE MENDEXEC GETIP------------------------------------------------------------SELECT SYS_CONTEXT('USERENV','IP_ADDRESS') FROM DUAL; EXEC DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_ADDRESS);说明 SYS_CONTEXT求客户端IP地址,一般在触发器中使用48、SQL与ORACLE中对象是如何重命名的?EXEC SP_RENAME &旧表名&,&新表名&EXEC SP_RENAME &表名.字段名&,&新字段名&EXEC SP_RENAMEDB &旧数据库名&,&新数据库名&------------------------------------------------------------RENAME 旧表名 TO 新表名数据库重命名可以用NID(从9I开始),字段重命名暂缺。49、ORACLE9I中INSERT 的新语法,源表的结构与数据示例如下:&SQL&SELECT * FROM sales_input_PRODUCT_ID CUSTOMER_ID WEEKLY_ST &SALES_SUN &SALES_MON &SALES_TUE &SALES_WED SALES_THU &SALES_FRI &SALES_SAT---------- ----------- --------- ---------- ---------- ---------- -------------------- ---------- ----------& & & &111 & & & & 222 01-OCT-00 & & & &100 & & & &200 & & & &300 & & & &400 & & & 500 & & & &600 & & & &700& & & &222 & & & & 333 08-OCT-00 & & & &200 & & & &300 & & & &400 & & & &500 & & & 600 & & & &700 & & & &800& & & &333 & & & & 444 15-OCT-00 & & & &300 & & & &400 & & & &500 & & & &600 & & & 700 & & & &800 & & & &900&sales_input_table表存储了商品每周的销售明细,将它转成如下所示?& &PROD_ID & &CUST_ID TIME_ID & C & PROMO_ID QUANTITY_SOLD & & AMOUNT & & & COST---------- ---------- --------- - ---------- ------------- ---------- ----------& & & &111 & & & &222 01-OCT-00 & & & & & & & & & & & & & & & & & 100& & & &111 & & & &222 02-OCT-00 & & & & & & & & & & & & & & & & & 200& & & &111 & & & &222 03-OCT-00 & & & & & & & & & & & & & & & & & 300& & & &111 & & & &222 04-OCT-00 & & & & & & & & & & & & & & & & & 400& & & &111 & & & &222 05-OCT-00 & & & & & & & & & & & & & & & & & 500& & & &111 & & & &222 06-OCT-00 & & & & & & & & & & & & & & & & & 600& & & &111 & & & &222 07-OCT-00 & & & & & & & & & & & & & & & & & 700& & & &222 & & & &333 08-OCT-00 & & & & & & & & & & & & & & & & & 200& & & &222 & & & &333 09-OCT-00 & & & & & & & & & & & & & & & & & 300& & & &222 & & & &333 10-OCT-00 & & & & & & & & & & & & & & & & & 400& & & &222 & & & &333 11-OCT-00 & & & & & & & & & & & & & & & & & 500& & & &222 & & & &333 12-OCT-00 & & & & & & & & & & & & & & & & & 600& & & &222 & & & &333 13-OCT-00 & & & & & & & & & & & & & & & & & 700& & & &222 & & & &333 14-OCT-00 & & & & & & & & & & & & & & & & & 800& & & &333 & & & &444 15-OCT-00 & & & & & & & & & & & & & & & & & 300& & & &333 & & & &444 16-OCT-00 & & & & & & & & & & & & & & & & & 400& & & &333 & & & &444 17-OCT-00 & & & & & & & & & & & & & & & & & 500& & & &333 & & & &444 18-OCT-00 & & & & & & & & & & & & & & & & & 600& & & &333 & & & &444 19-OCT-00 & & & & & & & & & & & & & & & & & 700& & & &333 & & & &444 20-OCT-00 & & & & & & & & & & & & & & & & & 800& & & &333 & & & &444 21-OCT-00 & & & & & & & & & & & & & & & & & 900请看下边的这组SQL语句,成功而方便地解决这个问题SQL& INSERT ALL& & & INTO sales (prod_id, cust_id, time_id, amount)& & & VALUES (product_id, customer_id, weekly_start_date, sales_sun)& & & INTO sales (prod_id, cust_id, time_id, amount)& & & VALUES (product_id, customer_id, weekly_start_date+1, sales_mon)& & & INTO sales (prod_id, cust_id, time_id, amount)& & & VALUES (product_id, customer_id, weekly_start_date+2, sales_tue)& & & INTO sales (prod_id, cust_id, time_id, amount)& & & VALUES (product_id, customer_id, weekly_start_date+3, sales_wed)& & & INTO sales (prod_id, cust_id, time_id, amount)& & & VALUES (product_id, customer_id, weekly_start_date+4, sales_thu)& & & INTO sales (prod_id, cust_id, time_id, amount)& & & VALUES (product_id, customer_id, weekly_start_date+5, sales_fri)& & & INTO sales (prod_id, cust_id, time_id, amount)& & & VALUES (product_id, customer_id, weekly_start_date+6, sales_sat)& &SELECT product_id, customer_id, weekly_start_date, sales_sun,& & & sales_mon, sales_tue, sales_wed, sales_thu, sales_fri, sales_sat& & & FROM sales_input_刚才看了INSERT ALL的用法,现在再看看INSERT ALL与WHEN的用法:CREATE TABLE small_orders & &(order_id & & & NUMBER(12) & NOT NULL,& & customer_id & &NUMBER(6) & &NOT NULL,& & order_total & &NUMBER(8,2),& & sales_rep_id & NUMBER(6) & );CREATE TABLE medium_orders AS SELECT * FROM small_CREATE TABLE large_orders AS SELECT * FROM small_CREATE TABLE special_orders & &(order_id & & & NUMBER(12) & &NOT NULL,& & customer_id & &NUMBER(6) & & NOT NULL,& & order_total & &NUMBER(8,2),& & sales_rep_id & NUMBER(6),& & credit_limit & NUMBER(9,2),& & cust_email & & VARCHAR2(30) & );& 现在已经创建了四个表,将测试的环境搭起来啦。INSERT ALL& &WHEN order_total & 1000000 THEN& & & INTO small_orders& &WHEN order_total & 1000000 AND order_total & 2000000 THEN& & & INTO medium_orders& &WHEN order_total & 2000000 THEN & & & INTO large_orders& &SELECT order_id, order_total, sales_rep_id, customer_id & FROM当然,我们也可以使用ELSE来替代最后一个WHEN&THENINSERT ALL& &WHEN order_total & 100000 THEN& & & INTO small_orders& &WHEN order_total & 100000 AND order_total & 200000 THEN& & & INTO medium_orders& &ELSE& & & INTO large_orders& &SELECT order_id, order_total, sales_rep_id, customer_id & FROM以上两组SQL功能是一样的。现在再看一下INSERT FIRST的用法:INSERT FIRST& &WHEN ottl & 100000 THEN& & & INTO small_orders& & & & &VALUES(oid, ottl, sid, cid)& &WHEN ottl & 100000 and ottl & 200000 THEN& & & INTO medium_orders& & & & &VALUES(oid, ottl, sid, cid)& &WHEN ottl & 290000 THEN& & & INTO special_orders& &WHEN ottl & 200000 THEN& & & INTO large_orders& & & & &VALUES(oid, ottl, sid, cid)& &SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,& & & o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem& & & FROM orders o, customers c& & & WHERE o.customer_id = c.customer_说明:Large_Orders表中将不含有OTT1&290000这部分数据。INSERT ALL& &WHEN ottl & 100000 THEN& & & INTO small_orders & VALUES(oid, ottl, sid, cid)& &WHEN ottl & 100000 and ottl & 200000 THEN& & & INTO medium_orders &VALUES(oid, ottl, sid, cid)& &WHEN ottl & 200000 THEN& & & into large_orders & VALUES(oid, ottl, sid, cid)& &WHEN ottl & 290000 THEN& & & INTO special_orders& &SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,& & & o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem& & & FROM orders o, customers c &WHERE o.customer_id = c.customer_说明:Large_Orders表中将含有OTT1&290000这部分数据,这就是INSERT ALL与INSERT FIRST的区别。&50、ORACLE9I中WITH的新用法。可以理解成WITH是用来对ORACLE9I子查询定义别名SQL& with total as ( select deptno,sum(sal) from emp group by deptno) & &select count(*)
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:638113次
积分:8877
积分:8877
排名:第681名
原创:124篇
转载:81篇
译文:107篇
评论:172条
文章:10篇
阅读:65449
(3)(6)(5)(1)(3)(1)(1)(1)(1)(1)(3)(2)(2)(2)(2)(11)(14)(4)(4)(8)(8)(7)(10)(7)(11)(10)(1)(3)(1)(1)(1)(1)(1)(5)(1)(1)(1)(7)(3)(5)(3)(2)(10)(2)(3)(1)(8)(11)(6)(1)(1)(11)(71)(22)(1)}

我要回帖

更多关于 oracle instr函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信