先热烈欢迎版主回归!不同的地方很多,以至于一开始用SQLServer居然有点不习惯。等有时间再整理吧。

解决方案 »

  1.   

    有很多不同,我看过一本书还不错,好象是叫“ORACLE 与 SQL SERVER 集成”(等晚上回家去确定一下),差不多将两种数据库所有的不同都列出来了。而且还讲了怎么移植及开发通用的应用程序。只是我差不多看完了整本书,还是只会SQL SERVER,不会ORACLE  :((
      

  2.   

    我这以前收藏了一篇文档,找不到出处了,是HTML的,如何贴出?
      

  3.   

    斑竹可以去看一本叫做sql in nutiall(好像是这样的,就是著名的orelly的坚果系列),里面逐条语句的讲了每一种sql语句在sql server,oracle,mysql,postsql中的写法,应该能够解决大部分问题(关键的是只要4X元就可以拿下)
      

  4.   

    回家看了看,书名是“oracle8i与SQLSERVER2000集成”。
      

  5.   

    1.处理的机制不一样,一个是T-SQL 是基于事务处理,一个是PL_SQL是事务于过程处理(当然并不总是这样).
    2.功能不一样,PL-SQL功能更强一点,支持超大规模数据,可以把一个认得属性信息定义个数据类型,是家常便饭.但更晦涩一点,T-SQL更易学习一点,功能不是很强大.
    3.两个编辑器,SQL SERVER做的确最好,不同类型 的关键字有不同的颜色,书写错误是灰色的,ORACLE没有做到着一点!很晚啦,睡觉:)~~~~~~~~~~~~~~~~~
      

  6.   

    谢谢大家的讨论!
    由于MS SQL只能用于WINDOWS平台,所以有必要了解ORACLE,通过对比来达到互通的目的,是一个好方法。
    扬兄说的没错,要2个通才可回答,希望知者尽言,1000分相送。
      

  7.   

    to:OpenVMS
    文档给你发到邮箱了,请查收,帮忙贴出,共享快乐 ^_^
      

  8.   

    To: jinfeng_wang,ora help is good,but only in ora
    TO: inalover(奇遇),thanks your html
    TO: icevi(按钮工厂),is there e books?
      

  9.   

    数据库基础版的zhuzhichao(竹之草)大哥写过一篇这方面的文章:http://www.itpub.net/showthread.php?s=&threadid=26185
    http://www.itpub.net/showthread.php?s=&threadid=26184
      

  10.   

    想知道什么呢?
    太多了,SQL 6.5 和现在的操作有点相似!
    在备份和恢复上都不相同!
    管理的机制也不相同,很大的不同!
      

  11.   

    很不错的文章。
    要说有什么大的不同,就是oracle比较强大吧,哈哈
      

  12.   

    我正准备开始学习ORACLE,不过在我的PC(PIII866 128M)安装SQL SERVER2K AND ORACLE9I,启动非常的慢,而且经常....;建议大家不要这样安装。还有ORACLE9I安装非常慢,我安装了2个小时。谁有ORACLE9I的入门电子书(DOWNLOAD)?谢谢!!!
      

  13.   

    Oracle相关书籍:http://www.csdn.net/Expert/TopicView1.asp?id=986172我本人未验证链接正确性~~~~~
      

  14.   

    thanks IronPromises(铁诺) 
    3x everyone above.insert into yourtable select * from t1
    在MSSQL中可用,在ORACLE中行么?好象前面的HTML中说反了?
      

  15.   

    insert into yourtable select * from t1
    是标准的SQL,到处可以用的。
      

  16.   

    如果sql server有类似rowid的伪列,就可以容易解决那个计算歌手平均分的问题,
    (两次avg + 一个group by rowid)。
      

  17.   

    oracle有表分区,实体视图,行级触发器等,还有数组,sql没有。
    其它明显的如IronPromises(铁诺) -》 数据库基础版的zhuzhichao(竹之草)大哥写过一篇这方面的文章:http://www.itpub.net/showthread.php?s=&threadid=26185
    http://www.itpub.net/showthread.php?s=&threadid=26184
    只有两者都用了,才能体会到实在有太多的不同了。
    -----------------------------------------------------
    好象去年讨论过这个话题,当时弱水兄正在研读sql,也发了些高论。
    现今几乎不见他了。
    惆怅。
      

  18.   

    新装了一个ORACLE8i,它要求的密码竟然有N多个,而且有的工具密码输错几次后就不能打开了,那位仁兄能帮忙列举一下ORACLE8i的初始用户名/密码?
      

  19.   

    system manager
    sys change_on_install
      

  20.   

    select * from t_tree
    start with jgbh='...'
    connect by sjjgbh='...'
    and ....
    能得到机构树
    这样的语句sql server里面好像没有
      

  21.   

    SQL SERVER 的树 ?CREATE TABLE #Data
    (
    DataID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    ParentID INT
    )CREATE TABLE #temp1
    (
    LID INT
    ,Distance INT
    ,RID INT
    )CREATE TABLE #temp2
    (
    LID INT
    ,Distance INT
    ,RID INT
    )GO
    SET NOCOUNT ONINSERT #Data(ParentID)VALUES(NULL)
    DECLARE @I INT
    SET @I=1
    WHILE @I<4
    BEGIN
    INSERT #Data(ParentID)VALUES(@I)
    SET @I=@I+1
    ENDGO
    SET NOCOUNT ONINSERT INTO #temp2
    Select #Data.DataID,0,#Data.DataID
    From #DataINSERT INTO #temp1
    Select DL.DataID,1,DR.DataID
    From #Data AS DL
    JOIN #Data AS DR
    ON DL.DataID=DR.ParentIDDECLARE @RowCount INT,@RowCount2 INT,@Distance INT,@Distance2 INTSET @Distance=-1
    SET @RowCount2=0
    SELECT @RowCount=COUNT(*) FROM #temp2WHILE(@RowCount<>@RowCount2)
    BEGIN SET @Distance=@Distance+1
    SET @Distance2=@Distance+1 INSERT INTO #temp2
    SELECT #temp1.LID,@Distance2,#temp2.RID
    FROM #temp1
    JOIN #temp2
    ON #temp1.RID=#temp2.LID
    WHERE #temp2.Distance=@Distance SET @RowCount2=@RowCount
    SELECT @RowCount=COUNT(*) FROM #temp2
    END
    SET NOCOUNT OFFSELECT * FROM #temp2
    ORDER BY LID,Distance,RIDGODROP TABLE #temp1DROP TABLE #temp2DROP TABLE #Data
    GO
      

  22.   

    mmzxg兄:
    弱水兄没有用过SQL Server!
      

  23.   

    我的语句写错了,应该是:
    select * from t_jg
    start with jgbh='1070000000'
    connect by sjjgbh=prior jgbh
    jgbh:  机构编号
    sjjgbh: 上级机构编号
      

  24.   

    jiezhi(相逢何必曾相识) :你要是沒有prior的话,那么你的语句就只能找出一条纪录,哈哈。
      

  25.   

    ORACLE 的pl-sql借鉴了ada语言的很多思想和特点,如包
    但二者的SQL标准是一样的,
    我也有很多问题,请楼上的朋友们多赐教
      

  26.   

    太多了
    我刚从TSQL向PL/SQL转
    很不适应
    朋友们多鼓励我
      

  27.   

    下面,是通过应用程序调用数据库中的过程和函数的前提,没有比较2者在语法上的不同。
    区别1:sql server的存储过程可以有返回值。比方说
    create proc ttt 
    as
    select * from table
    这样,这个结果集就作为返回值返回了。
    在oracle中呢,过程就是过程,没有也不能有返回值的。要想返回,就用函数。
    说到函数,就有第二个区别了,
    sql server中的函数,几乎就可以用过程来代替,当然实现的写法上有不同了。但是,作用上是可以达到的。
    oracle中,函数和过程,1就是1,2就是2。划分得很明显。
    比方说,更新一个表,删除几条数据,就可以用过程来完成。而要从表中select记录出来,就要用函数了。
      

  28.   

    sql server太臭了,连例外处理都没有
      

  29.   

    对于Oracle 8i初学者,很有可能会经常把MS SQL Server中的概念拿来与Oracle对照,
    这种对照,从我个人认为觉得不需要做过多的这种比较,一个如果从来没有学过其他
    数据库管理的人,可能更容易学习Oracle.现在我来说一下两者的区别和联系1、关于数据库的概念 
    我怎么找到或者创建自己的数据库
    Oracle的数据库的概念已经完全不同于MS SQLOracle的服务和数据库,相当于MS SQL的数据库服务
    Oracle的服务=后台进程+相关内存数据库=数据文件的集合 
    而且Oracle的服务是完全可以与数据文件脱离开来的
    那么MS SQL的数据库,在Oracle哪儿能找到呢,
    Oracle的Schema,Schema的中文意思:方案,意思是一个用户所拥有所有对象的集合
    这里的对象包括表、视图、实例化视图、序列、过程、函数、程序包、同义词
    (下面我会详细解释这其中的一些陌生的概念)所以我们要建立一个在Oracle中的类似于MS SQL的数据库:大致过程
    ·建立数据表空间(相当于MS SQL的数据库的数据文件)
    ·建立临时表空间(相当于MS SQL的数据库的事务日志文件)
    ·建立用户,他的却省表空间和临时表空间是刚建立的两个表空间
    ·给用户授权,最起码的角色权限是Connect 的角色
    ·以该用户登陆,创建自己的表、视图、实例化视图、序列、过程、函数、程序包、同义词等2、关于Oracle Manager Server与MS SQL的Enetrprise manager
    应该说这两者有很大的差别,DBA Studio工具提供了与MS SQL的Enetrprise manager同样的功用,
    DBA Studio工具对一般使用来说已经足够了。
    但这里有必要对Oracle Manager Server解释一下
    ·它是Oracle 管理分布式数据库的服务,注意他是服务
    ·它却省并不安装
    ·它需要有自己管理所需要的资料库,在某个数据库中需要建立相应的用户
    ·它的等录需要身份验证,注意这里的身份验证,与管理所需要的资料库的用户是不是一个概念,
    也不是数据库中的Sys和、system用户,它的却省用户是oemtemp
    ·它的功能有
    ·使用它,在管理端要启动Manager Server服务和智能代理服务(OracleAgent),被管理的数据库服务器
    要启动智能代理服务(OracleAgent)3、关于Oracle 的Sys、System的用户与MS SQL的master的比较
    MS SQL的master数据库存储了当前数据库服务的一些配置信息如
    数据库设备(在MS SQL已经弱化)、字符集、数据文件、登陆帐号、拥有的数据库、整个服务参数配制等信息Oracle的Sys存储Oracle服务或者实例的信息及所有用户的数据字典信息
    这一点不同于MS SQL,MS SQL每一个数据库拥有自己的对象的数据字典信息
    System用户拥有数据字典是视图信息,有了这些视图,我们的查询数据库的信息就特别方便
    却省情况下,system用户拥有DBA系统角色权限,而sys不仅拥有DBA 的权限还拥有SysDBA的权限DBA、SysDBA这两个系统角色有什么区别呢在说明这一点之前我需要说一下Oracle服务的创建过程
    ·创建实例
    ·启动实例
    ·创建数据库(system表空间是必须的)
    启动过程
    ·实例启动
    ·装载数据库
    ·打开数据库SysDBA,是管理Oracle实例的,它的存在不依赖于整个数据库完全启动,
    只要实例启动了,他就已经存在,以SysDBA身份登陆,装载数据库、打开数据库
    只有数据库打开了,或者说整个数据库完全启动后,DBA角色才有了存在的基础!
      

  30.   

    Oracle 8i数据库与MS SQL Server的比较(二)
    4、Oracle中新的数据库对象:实例化视图、快照、序列、程序包、同义词、抽象的数据类型·实例化视图又称显形图:实例化说明他有自己的存储空间,视图:说明他的数据来源于其他表数据。
    实例化视图中的数据,设置为隔一段时间更新数据,更新的模式可以定义为完全更新和增量更新
    ·快照基本上同实例化视图,只不过数据来源不同,快照数据来愿于远程数据库,而实例化视图
    则来源于本地数据表
    ·序列,相当于MS SQL中的identity列,他是一个数字顺序列表
    ·程序包:他是过程、函数、全局变量的集合,他封装了私有变量、私有过程和私有函数
     如:dbms_out包
    ·同义词:是对数据库中的对象的别名,同义词可以是全局的也可以是私有的(属于某个用户的)
     如:Tab,col等
    ·抽象的数据类型,类似于C中的结构体或Pascal记录类型
    关于类型,这里还有一个题外话:A Tab%RowType,这是一个特别的抽象的数据类型,该类型的分量就是TAB的字段
    B Tab.TName%Type,这定义了一个和tab的字段TNAME相同的数据类型的变量,
    想想他有什么好处5、Oracle数据库连接和MS SQL远程连接
    两者都是为了实现分布式数据库的操作。
    两者都能实现分布式事务,参见MS SQL的联机帮助6、Oracle回滚段和MS SQL的数据库事务日志文件
      回滚段提供了事物回滚需要使用的数据变化以前的映象.这些映象是按条目存储的,
    如果这些条目过少,一个事务等待另一个事务的几率增大,就会影响数据库的性能
    却省安装时,提供一个系统回滚段他在System表空间.为了提高性能system 表空间
    不应存储有任何数据字典信息以外的信息.MS SQL数据库事务日志文件功能雷同于回滚段,只不过他是同特定的数据库密切相关的7、关于数据表的管理
    ·超大型数据表的管理
      一个数据表,尤其是那种流水帐表,长年累月后急剧膨胀,最后影响查询性能
     怎么办,Oracle和MS SQL都提供了一种方法,把数据文件及其索引存放在一个特定的
     数据文件或表空间里,但这个还是不能解决问题,怎么办,开发人员只能给表添加
     时间的标志:如CWSJ2000(财务数据2000),CWSJ2001,CWSJ2002, 这种命名方式,
     确实能提高查询性能,但是给开发带来了不少的麻烦(浪潮财务就是这样做的),
     而且当你不知道数据在哪个表中的时候,你要联合这么表进行查询,岂不长哉!
     Oracle提供了很好的手段解决了这个问题:表及索引分区存储。按字段值的范围
     进行分区存储.具体做法不在说明。·Oracle索引组织表和MS SQL簇索引表
     两者的数据存放顺序都是按照索引值的顺序存放的。·无事务回滚概念的表,对这种表的操作不村在事务的概念
    记得以前MySQL是不提供事务的回滚(不知现在有否变化)
    而Oracle提供了建表参数nologging,使对该表的操作不参与事物的回滚·索引
    Oracle提供了多种MS SQL没有的索引类型
    ··位图索引,
    比方说性别:仅有男女
    第1条记录:男
      第2条记录:男
    第3条记录:女
      第4条记录:男
      第5条记录:女
      第6条记录:男
      .........
    那它的索引:110101............看这种索引多节省空间,它适用于字段值是的已知几个中的一个··基于函数或者说表达式的索引,这个功能可谓强大
      

  31.   

    thanks  xxj() ,总结的好!
      

  32.   

    我这里还有呢8、外连接
       ·MS SQL SERVER 支持两种形式表间连接
         ①从Sybase继承来的形式:
              字段1 *= 字段2 (左连接)
              字段1 =* 字段2 (右连接)
              没有这种形式的全外连接语法
         ②标准的外连接语法
              left [outer] join on 逻辑表达式
      right [outer] join on 逻辑表达式
              full [outer] join (全外连接) on 逻辑表达式
              这里的逻辑表达式 可以是很复杂的表达式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
         
         需要提醒大家的是:你写的查询语句报告过这样的错误 
    Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables
          这句话告诉你,你查询语句引用的视图或者子查询也用到了外连接,但是引用视图或者子查询外连接语法与你的外连接语法不一直导致的
    例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO
    from dbo.VU_CAF_BILLS A,TU_Flag
    where A.CAF_NO*=TU_Flag.ObjNo
    视图dbo.VU_CAF_BILLS的外连接语法是标准的SQL语法,而本语句中的外连接语法却是Sybase式的外连接语法。   ·Oracle不支持标准的外连接语法,也没有全外连接,这是它的缺陷
    字段1 = 字段2(+) (左连接)
            字段1(+) = 字段2 (右连接)   ·使用外连接语句的用处
         ①不想因为表连接而使主表数据行丢失,这一点毋庸多说
         ①找某条记录在A表存在,而在B表不存在,按常规做法使用not in (select 查询子句)语法,
           使用not in 最大的缺点速度慢,原因是每个数据行都去做:select 查询子句
           而使用下面的语法:
    select TU_COMPANY.*
    from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode
    where TU_Comp_Agent.Id is null
             
    9、触发器
      ·从我了解到的,MS SQL SERVER,仅有表的触发器,而且触发时机不够丰富
        如插入触发在子,不区分单条插入还是多条插入,也不区分插入前触发还是插入后触发
        碰到多条数据的插入,需要使用游标处理每条插入的数据  ·Oracle提供的触发器不仅有基于表的触发器,而且其他类型的,例如数据库级的触发器:数据库启动、数据库关闭
        对于表级的触发器,区分单条插入还是多条插入,也区分插入前触发还是插入后触发

    10、表数据复制
        ·库内数据复制
    ·MS SQL Server 
              Insert into 复制表名称 select 语句 (复制表已经存在)
      select 字段列表 into 复制表名称 from 表   (复制表不存在)
    ·Oracle
              Insert into 复制表名称 select 语句 (复制表已经存在)
      create table 复制表名称 as select 语句   (复制表不存在)

        ·文本文件转入、转出的批量处理
            ·MS SQL Server 
              BCP命令行程序
            ·Oracle
      SQLLDR命令行程序
    11、多表更新、删除
        一条更新语句是不能更新多张表的,除非使用触发器隐含更新,我这里说的意思是:根据其他表数据更新你要更新的表
        一般形式:
        ·MS SQL Server 
    update A
    SET 字段1=B表字段表达式,
        字段2=B表字段表达式
            from B 
            WHERE 逻辑表达式
         ·Oracle
    update A
    SET 字段1=(select 字段表达式 from B WHERE ...),
        字段2=(select 字段表达式 from B WHERE ...)
            WHERE 逻辑表达式

          从以上来看,感觉oracle没有ms sql好,主要原因:假如A需要多个字段更新,MS_SQL语句更简练       你知道刚学数据库的人怎么做上面这件事情吗,他们使用游标一条一条的处理

      

  33.   

    thanks  xxj() again,any more?
      

  34.   

    xxj寫的很好。只是有些知識點寫的不夠詳細。
      

  35.   

    to air_line(永恒的心) :
    目前市面上是很難找到這樣的書。
    就算有,也是寫的很膚淺的,很多實際的問題都沒有談到。
    看上去好像是對SQL Server和Oracle分別只學了一個月的人寫的。
      

  36.   

    关于limit的不同
    在oracle中可以
    select * from table where... limit int,int
    limit直接挂在后面很方便,但是SQLSERVER不支持LIMIT,很是郁闷

    select top 3 * from tablename where key not in (select top 10 key from tablename)这种代替,实在是不方便