sql server与oracle的区别_第1页
sql server与oracle的区别_第2页
sql server与oracle的区别_第3页
sql server与oracle的区别_第4页
sql server与oracle的区别_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、第 1 页不足之处,敬请指正 QQ 77056803疯狂 SQL 之魔兽争霸本人平时比较沉默,但朋友们都说我很疯狂疯狂地学习、疯狂地工作。很久就有写点东西的打算啦,一直懒于打字,近来稍有空闲,决定杜撰此文,献给现些喜欢或不喜欢沉默的朋友。-自序网上已经有很多 SQL 与 ORACLE 的对比 ,但本人要讲的即不是单纯的 SQL,也不是单纯的ORACLE,更不是评价谁好谁坏(意思不大) ,而是两种数据库之相同和异同,本人曾讲授过SQL 与 ORACLE 的课程,讲 SQL 时说 SQL 好,讲 ORACLE 时又说 ORACLE 棒,现在终于可以平心而评啦。估计有人现在会嘿嘿冷笑(又一个误人子弟

2、的骗子) ,老实说,当初每次讲完课,就有这种感觉教的人不得其法,学的人不得其道。说点严肃的事吧,据说比尔与艾里森在洗手间相遇,两个又是拥抱,又是 KISS,不多久就吵了起来,比尔对查询分析器(SQL QUERY ANALYZE)赞不经绝口,艾里森嘿嘿冷笑,只说了一句话SQL PLUS 内秀。言归正传,且听我一一道来1.1.SQLSQL 与与 ORACLEORACLE 的内存分配的内存分配ORACLE 的内存分配大部分是由 INIT.ORA 来决定的,一个数据库实例可以有 N 种分配方案,不同的应用(OLTP、OLAP)它的配置是有侧重的。SQL 概括起来说,只有两种内存分配方式:动态内存分配与

3、静态内存分配,动态内存分配充许 SQL 自己调整需要的内存,静态内存分配限制了 SQL 对内存的使用。1.1.002002、SQLSQL 与与 ORACLEORACLE 的物理结构的物理结构 总得讲,它们的物理结构很相似,SQL 的数据库相当于 ORACLE 的模式(方案) ,SQL 的文件组相当于 ORACLE 的表空间,作用都是均衡 DISK I/O,SQL 创建表时,可以指定表在不同的文件组,ORACLE 则可以指定不同的表空间。CREATE TABLE A001(ID DECIMAL(8,0) ) ON 文件组 -CREATE TABLE A001(ID NUMBER(8,0) ) T

4、ABLESPACE 表空间注:以后所有示例,先 SQL,后 ORACLE2.2.003003、SQLSQL 与与 ORACLEORACLE 的日志模式的日志模式SQL 对日志的控制有三种恢复模型:SIMPLE、FULL、BULK-LOGGED;ORACLE 对日志的控制有二种模式:NOARCHIVELOG、ARCHIVELOG。SQL 的 SIMPLE 相当于 ORACLE 的NOARCHIVELOG,FULL 相当于 ARCHIVELOG,BULK-LOGGED 相当于 ORACLE 大批量数据装载时的 NOLOGGING。经常有网友抱怨 SQL 的日志庞大无比且没法处理,最简单的办法就是先

5、切第 2 页不足之处,敬请指正 QQ 77056803换到 SIMPLE 模式,收缩数据库后再切换到 FULL,记住切换到 FULL 之后要马上做完全备份。3.3.004004、SQLSQL 与与 ORACLEORACLE 的备份类型的备份类型SQL 的备份类型分的极杂:完全备份、增量备份、日志备份、文件或文件组备份;ORACLE的备份类型就清淅多啦:物理备份、逻辑备份;ORACLE 的逻辑备份(EXP)相当于 SQL 的完全备份与增量备份,ORACLE 的物理备份相当于 SQL 的文件与文件组备份。SQL 的各种备份都密切相关,以完全备份为基础,配合其它的备份方式,就可以灵活地备分数据;OR

6、ACLE 的物理备份与逻辑备份各司其职。SQL 可以有多个日志,相当于 ORACLE 日志组,ORACLE 的日志自动切换并归档,SQL 的日志不停地膨胀SQL 有附加数据库,可以将数据库很方便地移到别一个服务器,ORACLE 有可传输表空间,可操作性就得注意啦。4.4.005005、SQLSQL 与与 ORACLEORACLE 的恢复类型的恢复类型SQL 有完全恢复与基于时间点的不完全恢复;ORACLE 有完全恢复与不完全恢复,不完全恢复有三种方式:基于取消的、基于时间的、基于修改的(SCN)的恢复。不完全恢复可以恢复数据到某个稳定的状态点。5.5.006006、SQLSQL 与与 ORAC

7、LEORACLE 的事务隔离的事务隔离SET TRANSACTION ISOLATION LEVEL SQL 有四种事务隔离级别:READ COMMITTED、READ UNCOMMITTED、REPEATABLE READ、SERIALIZABLEORACLE 有两种事务隔离级别READ COMMITTED、SERIALIZABLESQL 虽然有四种事务隔离,事务之间还是经常发生阻塞;ORACLE 则利用回退段很好地实现了事务隔离,不会产生阻塞。SQL 与 ORACLE 如果发生死锁,都可以很快地识别并将之处理掉。6.6.007007 SQLSQL 与与 ORACLEORACLE 的外键约束

8、的外键约束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

9、CASCADE,AGE 第 3 页不足之处,敬请指正 QQ 77056803NUMBER(2,0) )7.7.008008、SQLSQL 与与 ORACLEORACLE 的临时表的临时表SQL 的临时表用#或#开头,使用完后自动释放,ORACLE 的临时表则存在数据库中,每个会话的数据都互不干涉。oracle 临时表中的纪录可以被定义为自动删除(分 commit 方式和transaction 方式) ,而表结构不会被自动删除。临时表的 DML,DDL 操作和标准表一样。CREATE TABLE #TEMP(ID INT,NAME VARCHAR(20) )-CREATE GLOBAL TEMP

10、ORARY TABLE TEMP(ID INT,VARCHAR2(20) )8.8.009009、SQLSQL 与与 ORACLEORACLE 的类型转换的类型转换SQL 常用类型转换函数有:CAST、CONVERT、STRORACLE 常用类型转换函数有:TO_CHAR、TO_NUMBER、TO_DATESELECT CONVERT(VARCHAR(20) ,GETDATE() ,112)-SELECT TO_CHAR(SYSDATE, YYYYMMDD )FROM DUAL9.9.010010、SQLSQL 与与 ORACLEORACLE 的自动编号的自动编号SQL 的编号一般由 IDEN

11、TITY 字段来提供,可以灵活地设定种子值,增量,取值范围有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.N

12、EXTVAL)INSERT INTO A004 VALUES(SEQ_001.CURVAL+1)10.10. 011011、SQLSQL 与与 ORACLEORACLE 的分区表的分区表 从严格意思上来讲,SQL 还没有分区表,它的分区表是以 UNION 为基础,将多个结果集串起来,实际上是视图;ORACLE 的分区表有多种:PARTITION BY RANGE、PARTITION BY HASH、PARTITION BY LIST,其它就是混合分区,以上三种基础分区的混合使用。当然第 4 页不足之处,敬请指正 QQ 77056803ORACLE 也可以象 SQL 那样分区视图。CREATE

13、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)CREAT

14、E 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)11.11. 012012、SQLSQL 与与 ORACLEORACLE 的存储过程的存储过程SQL 的存储过程可以很方便地返回结果集,ORACLE 的存储

15、过程只有通过游标类型返回结果集,这种结果集 ADO 不可识别,如果想使用 ORACLE 存储过程的结果集,只有使用 ODAC 开发包(DELPHI/BCB 控件组 与 有下载) ,SQL 的过程参数如果是字符必须指定参数长度,ORACLE 的过程则不充许指定字符参数的长度。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;F

16、UNCTION 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 实际开发中,一般都将触发器要执行的代码放到过程中进行调试

17、,在查询分析器中可以对过程进行设断点调试。第 5 页不足之处,敬请指正 QQ 7705680312.12. 013013、SQLSQL 与与 ORACLEORACLE 的触发器的触发器触发器的事务是引起触发动作事务的延续,在 SQL 的触发器中是可以无 BEGIN TRAN 而可以直接 COMMIT TRAN 的。SQL 的触发器是表级触发器,DML 影响一行或无数行触发动作只触发一次,ORACLE 分表级触发器与行级触发器,触发的粒度更细腻一些,SQL 在处理多行时就必须使用 CURSOR 啦。ORACLE 使用 INSERTING、DELTING、UPDATING 判断执行了什么 DML

18、操作,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

19、 AS BEGIN DECLARE I INT,D INT,ID INT SELECT I=COUNT(*) FROM INSERTED SELECT D=COUNT(*) FROM DELETED -IF (I0 AND D0) 执行更新,由于用到游标,故略去 IF I0 INSERT INTO A2 SELECT * FROM INSERTED IF D0 DELETE FROM A2 WHERE ID=IDEND-用 ORACLE 的触发器实现级联添加、级联删除、级联更新CREATE OR REPLACE TRI_A1_INS AFTER INSERT OR DELETE OR UPDA

20、TE ON A1 FOR EACH ROWBEGINIF INSERTING THENINSERT INTO A2 SELECT * FROM :NEW; END IF;IF DELETING THENDELETE FROM A2 WHERE ID = :OLD.ID ; END IF;IF UPDATING THENUPATE A2 SET ID = :NEW.ID , NAME = :NEW.NAME WHERE ID = :OLD.ID ; END IF;END 第 6 页不足之处,敬请指正 QQ 7705680313.13. 014014、SQLSQL 与与 ORACLEORACLE

21、的游标的游标SQL 的游标用FETCH_STATUS 判断是否还有数据,ORACLE 的游标用%FOUND、%NOTFOUND 来判断游标是否结束,游标分服务端游标与客户端游标,在存储过程、函数、触发器中声明的游标为服务端游标,其它处声明的游标为客户端游标,游标需要使用较多的内存,但它比临时表的性能要优一些,因为临时表占用的是 DISK I/O,DISK I/O 应该比服务器的内存要更珍贵一些吧。14.14. 015015、SQLSQL 与与 ORACLEORACLE 的重复记录删除的重复记录删除好的数据库设计重复记录是不存在的,如果有重复记录如何删除呢?SQL 可以使用 SET ROWCOU

22、NT 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_T

23、EST A WHERE ROWID!=(SELECT MAX(ROWID) FROM A_TEST B WHERE A.ID=B.ID AND A.NAME=B.NAME)说明 当数据量较大时,这种方法将会使用系统大量的资源15.15. 016016 SQLSQL 与与 ORACLEORACLE 的对象加密的对象加密SQL 与 ORACLE 的某些对象如过程、视图、函数、触发器可能涉及商业,开发商通常希望对这些对象进行加密,SQL 的加密方法在创建时带上 WITH ENCRYPTION,ORACLE 的对象加密明显复杂一些,要使用 WRAP 工具,在 ORACLE 的 BIN 目录内。16.1

24、6. 017017 SQLSQL 与与 ORACLEORACLE 的表生成的表生成 SQLSQL 语句语句SQL 与 ORACLE 的表如何才导成 SQL 语句呢?如果一定要编程实现,SQL 需要将其它数据类型的字段转换成 VARCHAR 类型,ORACLE 则可以隐式进行数据类型转换。CREATE TABLE A_SQL(ID INT,NAME VARCHAR(20) 假如有两万记录SELECT INSERT INTO A_SQL VALUES(+CAST(ID 第 7 页不足之处,敬请指正 QQ 77056803AS VARCHAR(20)+, +NAME+ ) FROM A_SQL-SE

25、LECT INSERT INTO A_SQL VALUES(|ID|,|NAME|) SQLFROM A_SQL说明 SQL 的字符串连接用+号,ORACLE 字符串连接用|,单引号可以做转义符。17.17. 018018、SQLSQL 与与 ORACLEORACLE 的动态的动态 SQLSQLSQL 与 ORACLE 都支持动态 SQL 语句,SQL 用 EXEC()执行的动态 SQL 语句,ORACLE 用EXECUTE IMMEDIATE 执行动态 SQL。动态 SQL 的效率要比非动态 SQL 性能差,但使用起来非常灵活,可以根据不同条件执行不同的任务。DECLARE SQL VARC

26、HAR(99)SELECT SQL=declare m int select m=count(*) from sysobjects select mEXEC(SQL)-DECLARES VARCHAR2(99);BEGIN S:=SELECT COUNT(*) FROM | USER_TABLES;EXECUTE IMMEDIATE S;END;18.18. 1919、返回记录集中前、返回记录集中前 N N 条记录的语法?条记录的语法?SQL 只有使用 TOP,ORACLE 可以使用 ROWNUMSELECT TOP N * FROM 记录集(表,视图,子查询)-SELECT * FROM 记

27、录集 WHERE ROWNUM=N19.19. 2020 如何返回记录集中相临两记录之间某字段的差值?如何返回记录集中相临两记录之间某字段的差值?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 A00

28、2(ID INT)INSERT INTO A002 VALUES(1)第 8 页不足之处,敬请指正 QQ 77056803INSERT 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说明 虽然语法大不相同,但最大的特点是两者都使用了自连接技术。20.20. 2121 如何返回任意某个范围之间的记录集?如何返回任意某个范围之间的记录集?create table a03(id int)declare i intselec

29、t i=1while i1000 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 rownum20minussel

30、ect * from a03 where rownum10;说明 在数据提取方面,ORACLE 有 ROWID,ROWNUM 使之有相当强的优势,SQL 只有使用函数IDENTITY 来构建一个临时表,这样来说还不好使用 CURSOR 来性能会好一些。通过这个例子,大家还可以看出 SQL 与 ORACLE 的程序结构,ORACLE 更严谨、人性化一些。21.21. 2222、表、表 A04A04 中的含有中的含有 A A、B B、C C、D D 四个字段,当按四个字段,当按 A A 字段分组后,如果字段分组后,如果 D D 等等 1 1,则只统,则只统计计 B B 的值,如果的值,如果 D D

31、 等等 0,0,则只统计则只统计 C 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)第 9 页不足之处,敬请指正 QQ 77056803select a,sum(case d when 1 then B when 0 then c end) from a04 grou

32、p 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 要简洁得多。22.22. 2323、如何删除数据库所有表?(、如何删除数据库所有表?(ORACLEORACLE 则是删除模式所有表)则是删除模式所有表)declare sql varchar(99),tbl varchar(30),fk varchar(30

33、)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

34、 cur_fks cursor local for select name from sysobjects where xtype=Uopen 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

35、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;第 10 页不足之处,敬请指正 QQ 77056803 execute immediate S; end loop; for t in cur_t loop S:=drop table |t.table_name; Execute immediate S; end l

36、oop;end;说明 SQL 删除数据库时,用到了两个系统表:SYSREFERENCES、SYSOBJECTS,前一个可以获得所有外键键信息,后者可以获得所有表的信息,在删除表时还在表名上加了一对中括号,即使用表名含有空格键或其它特殊这符也可以顺利删除。在 ORACLE 中,要删除模式的所有表,方法和 SQL 差不多,需要用到的数据字典也有两个:USER_CONSTRAINTS、USER_TABLES;USER_CONSTRAINTS 中 CONSTRAINT_TYPE 值等于 R 表示是外键,同样也要用到 CURSOR 与动态 SQL,这里提醒一下大家,FOR LOOP 内的变量变量是 FO

37、R LOOP 声明的,可以 ORACLE 的程序结构比 SQL 简洁。23.23. 2424、如何统计数据库所有用户表的记录数(、如何统计数据库所有用户表的记录数(ORACLEORACLE 统计模式内所有表的记录数)?统计模式内所有表的记录数)? 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 sysobj

38、ects 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_UTILIT

39、Yexecute dbms_utility.analyze_schema(SCOTT,COMPUTE);select table_name,num_rows from user_tables;说明 SQL 的 EXEC 功能可谓十分强大,竟然可以和 INSERT INTO 合用,将结果集存入一个表中,MS 可真牛。ORACLE 就只好用个偷懒的方法,首先将要统计的模式进行统计分析,在数据字典中就记载了每个表的行数,ORACLE 很简单吧。第 11 页不足之处,敬请指正 QQ 7705680324.24. 2525、SQLSQL 与与 ORACLEORACLE 快速建表的方法?快速建表的方法?S

40、ELECT * INTO 新表名称 FROM 子查询|表名-CREATE TABLE 新表名称 AS 子查询说明 快速建表可以有效地消除碎片,速度极快。25.25. 2626、如何实现有一组有规则的编号(如、如何实现有一组有规则的编号(如 200305310001200305310999200305310001200305310999)? ?declare i int,c varchar(20)select i=1while i1000 begin select c=case when ix.qty)-select code,qty,rank() over (order by qty) ord

41、 from a_test说明 SQL 中的排序是通过 UPDATE 更新,然后再显示出来,而 ORACLE 使用了 RANK OVER 函数,直接将数据集显示出来,而且 RANK OVER 函数还可以通过 PARTITION BY 对分组中的数据进行排序。31.31. 3232、SQLSQL 与与 ORACLEORACLE 的文件结构的文件结构SQL 文件被格式化为 8K 为单位的页,每 8 个相邻的页称为盘区(64K) ,若该盘区分配给一个对象,称为一致盘区,若分配给多个对象等为混合盘区,SQL 有全局分配页面、数据页面、索引页页、BLOB 页面、TEXT 页面。ORACLE 的文件最小逻辑

42、单位是由 INIT.ORA 中的BLOCK_SIZE 的值决定的,可以取 2K、4K、6K、8K、16K、32K 等,ORACLE 的盘区是由一些块组成的,ORACLE 的段是由盘区组成的,ORACLE 有数据段、索引段、回退段(UNDO 段) 、临时段、CLOB/BLOB 段、CLUSTER 段等。第 14 页不足之处,敬请指正 QQ 7705680332.32. 3333、SQLSQL 与与 ORACLEORACLE 如何取得一个全局唯一标识标(如何取得一个全局唯一标识标(GUIDGUID)SELECT NEWID()-SELECT SYS_GUID() FROM DUAL33.33. 3

43、434、本人有一张表单、本人有一张表单, , 要求统计要求统计 col1col6col1col6 中不等于中不等于 2 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

44、 |要求结果如下: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 el

45、se 0 end)-(case when col6=2 then col6 / 2 else 0 end)as count from table_A 说明 本例摘自 WWW.DELPHIBBS.COM,有名的 DELPHI 开发网站,本人不拥有版权。该 SQL的实现方法与 ORACLE 的实现写法完全一样,不在多述。34.34.3535、有一客户表,数据如下:、有一客户表,数据如下:客户 日期 资金F001 2003-03-05 123.00F002 2003-03-04 1223.00第 15 页不足之处,敬请指正 QQ 77056803F002 2003-03-02 1123.00F003

46、 2003-03-05 1231.00F003 2003-03-04 1232.00要求选出每个客户最新的哪条记录 组成一个结果集,结果如下:F001 2003-03-05 123.00F002 2003-03-04 1223.00F003 2003-03-05 1231.00实现方法:select a.客户, b.日期, a.资金 from 客户资金表 a, (select 客户, max(日期) 日期 from 客户资金表 group by 客户 ) bwhere a.客户 = b.客户 and a.日期 = b.日期说明 ORACLE 的写法与 SQL 一样,本例也摘自 WWW.DELP

47、HIBBS.COM,本人不拥有版权。35.35.3636 现在看一个高难度的作业,后来解决办法和本例不同,请看需求。现在看一个高难度的作业,后来解决办法和本例不同,请看需求。视图 1 CITYWATER_VIEW行政区划名称 城市用水量(亿 M3)。 。 。北京市15000上海市9000天津市5400重庆市9500表 1 DICTIONARY字段别名字段全名区划行政区划名称代码行政区划代码城市用水城市用水量(亿M3)表 1-2 是数据库 public 中的基表,表 3 是数据库 water 中的基表;在数据库 water 中创建视图 1,用 T-SQL 语句怎样实现?把查询结果的“字段别名”修

48、改为视图中的“字段全名” ,如果采用 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 co

49、de a,fa01p b where a.200000=b.200000表 2 CODE区划代码北京市100000上海市200000天津市300000表 3 CITYWATER代码城市用水1000001500020000090003000005400第 16 页不足之处,敬请指正 QQ 77056803declare 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(80

50、00),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) fro

51、m 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 也类似。36.36.3737、如何用、如何用 SQLSQL 操作一段操作一段 XMLXML 文件?文件?create procedure up_

52、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

53、(7999)returns t table(title varchar(32), author varchar(20), price decimal(9,2)第 17 页不足之处,敬请指正 QQ 77056803asbegindeclare idoc intexec sp_xml_preparedocument idoc OUTPUT, docinsert into t SELECT *FROM OPENXML (idoc, /root/dataset/books,2) with(title varchar(32) title, author varchar(20) author, price

54、 decimal(9,2) price)exec sp_xml_removedocument idocreturnenddeclare doc varchar(7999)select doc= Delphi abc 38.00 MIDAS def 26.00 exec up_xml_test doc-select * from dbo.uf_xml_test(doc)说明 用过程可以方便地对 XML 进行操作,但编写成 FUNCTION 时就报错,大概 MS 的函数内部不充许执行 OPENXML 等这类行集函数。另一个重要的问题是,SQL 的这种语法竟然不支持汉字字串,真是要命。37.37.

55、3838、使用、使用 DBMS_REPAIRDBMS_REPAIR 检测与修复破损的检测与修复破损的 BLOCKBLOCK?ADMIN_TABLES 提供管理函数修复或孤立关键表,包含创建、净化与删除函数。CHECK_OBJECT 检测并报告表或索引的破损块。DUMP_ORPHAN_KEYS导出破损块的数据第 18 页不足之处,敬请指正 QQ 77056803FIX_CORRUPT_BLOCKS在 CHECK_OBJECT 检测出的破损块上做标记REBUILD_FREELISTS重建对象的 FREELISTSSKIP_CORRUPT_BLOCKS设置在表或索引扫描时是否不扫描被做了破损标记的块

56、。SEGMENT_FIX_STATUS整理 BITMAP 实体上的破损标志上表列举了 DBMS_REPAIR 包所有的过程,下边将对这些过程要引入的参数的枚举值进行说明,这引些参数将在过程应用中起决定作用。object_typeTABLE_OBJECT, INDEX_OBJECT, CLUSTER_OBJECTactionCREATE_ACTION, DROP_ACTION, PURGE_ACTIONtable_typeREPAIR_TABLE, ORPHAN_TABLEflagsSKIP_FLAG, NOSKIP_FLAGSQL exec dbms_repair.admin_tables(s

57、cott.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,d

58、bms_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_lin

59、e(m); end;说明 统计 SCOTT 模式的 EMP 表有多少破损块。其它的过程本人就不再一一举例说明啦,引用方法类似与上边的实例,其它一些过程的参数列表可以通用 SQLDESC DBMS_REPAIR 来查看。38.38. 3939、关于、关于 UTL_FILEUTL_FILE 包的使用方法包的使用方法使用 UTL_FILE 时有个地方要注意:INIT.ORA 文件中的 UTL_FILE_DIR 参数必须指定路径,即 UTL_FILE 包只有在 UTL_FILE_DIR 所指的目录中有权限读写,以下的实例表示本人已经修改 UTL_FILE_DIR=C:啦。SQLDESC UTL_FILE第 19 页不足之处,敬请指正 QQ 77056803 可以查看 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

温馨提示

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

最新文档

评论

0/150

提交评论