免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7589 | 回复: 9
打印 上一主题 下一主题

面试问题:PL-SQL与T-SQL的最大差异是什么 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-30 16:37 |只看该作者 |倒序浏览
PL-SQL与T-SQL的最大差异是什么? 谢谢啦。
另外, 能否比较一下他们的 锁机制有什么区别?

论坛徽章:
0
2 [报告]
发表于 2007-10-31 19:19 |只看该作者
不懂ORACLE,也想了解一下

论坛徽章:
0
3 [报告]
发表于 2007-11-01 10:41 |只看该作者

是PL和T的差异

面向过程的PL/SQL 和面向事务处理的T-SQL

论坛徽章:
0
4 [报告]
发表于 2007-11-06 20:38 |只看该作者
1、外连接   
  ·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   
   
  2、触发器   
  ·从我了解到的,MS   SQL   SERVER,仅有表的触发器,而且触发时机不够丰富   
  如插入触发在子,不区分单条插入还是多条插入,也不区分插入前触发还是插入后触发   
  碰到多条数据的插入,需要使用游标处理每条插入的数据   
   
  ·Oracle提供的触发器不仅有基于表的触发器,而且其他类型的,例如数据库级的触发器:数据库启动、数据库关闭   
  对于表级的触发器,区分单条插入还是多条插入,也区分插入前触发还是插入后触发   
      
  3、表数据复制   
  ·库内数据复制   
    ·MS   SQL   Server     
  Insert   into   复制表名称   select   语句   (复制表已经存在)   
      select   字段列表   into   复制表名称   from   表   (复制表不存在)   
    ·Oracle   
      Insert   into   复制表名称   select   语句   (复制表已经存在)   
      create   table   复制表名称   as   select   语句   (复制表不存在)   
      
  ·文本文件转入、转出的批量处理   
  ·MS   SQL   Server     
  BCP命令行程序   
  ·Oracle   
      SQLLDR命令行程序   
  4、多表更新、删除   
  一条更新语句是不能更新多张表的,除非使用触发器隐含更新,我这里说的意思是:根据其他表数据更新你要更新的表   
  一般形式:   
  ·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语句更简练   
   
  你知道刚学数据库的人怎么做上面这件事情吗,他们使用游标一条一条的处理   
   
   
  5、关于存储过程或函数中使用的临时表,两者都提供了这个功能   
  临时表,最主要的好处是,操作不留任何痕迹、不产生日志,   
  所以速度快   
    ·MS   SQL   SERVER   
      CREATE   TABLE   #表名称(........)   或者   SELECT   字段表达式列表   INTO   #表名称   FROM   
      表名称前加#即可,这些临时表都是只在一个数据库连接会话期间有效   
        
  ·Oracle     
      create   [Global]   Temporary   Table   ,加上[Global]就是全局的临时表(所有数据库连接会话都是可见的),   
      不则为私有的(在一个数据库连接会话期间有效)     
   
   
  6、动态执行SQL语句   
    ·MS   SQL   SERVER   7.0好象没有这个功能,MS   SQL   SERVER   2000已经这个功能。   
      你是不是想在存储过程的参数中传递一个表名或者在过程体里动态   
      生成一个SQL语句,你会发现很难办到。看了下面的例子:你以前的问题全解决了   
      declare   @count   int   
      declare   @SQL   nvarchar(200)   
      set   @SQL   =   N\'select   count(*)   from   sysobjects\'   
      exec   sp_executesql   @SQL,N\'@i   int   output\',@count   output   
      
      
  ·Oracle提供了两种方法实现这个功能   
      ①程序包DBMS_SQL,执行一个语句的过程:   
        打开游标(open_cursor,对于非查询语句,无此过程)   
        分析语句(Parse)   
        绑定变量(bind_variable)   
        执行语句(execute)   
        关闭游标(close_cursor,对于非查询语句,无此过程)   
      ②execute   immediate   ls_SQL

论坛徽章:
0
5 [报告]
发表于 2007-11-07 09:37 |只看该作者
挺好的信息,学习了,谢谢

论坛徽章:
0
6 [报告]
发表于 2010-05-16 21:06 |只看该作者
和                就

论坛徽章:
0
7 [报告]
发表于 2011-05-30 21:45 |只看该作者
做下记号,以后需要

论坛徽章:
0
8 [报告]
发表于 2011-06-15 12:09 |只看该作者
学习了 记录下来

论坛徽章:
0
9 [报告]
发表于 2011-06-17 08:39 |只看该作者
介个  板凳说的是

论坛徽章:
0
10 [报告]
发表于 2012-05-23 10:03 |只看该作者
累到我再顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP