DB2中如何實現Oracle的相關功能

DB2中如何實現Oracle的相關功能

    在現實的應用中大家可能經常會遇到在DB2中如何實現Oracle的某些功能﹐
在此我簡單地總結一下﹐實現某一功能可能會有很多種方法﹐在此就沒有全部列出﹐
歡迎大家繼續﹐以便和大家共享﹐共同探討﹐共同近步﹗(以下主要以Oracle
8I和DB2 7.X為例)。

1.如何取一表前n筆記錄的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
           Select * from user.bsempms where rownum<=n;
  DB2 可以這樣實現﹕
           Select * from db2admin.bsempms fetch  first n rows only;
           另外也可以用 row_number() over() 去實現的;
2.如何取得當前日期的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
           Select  sysdate  from  dual;
  DB2 可以這樣實現﹕
           Select current timestamp from sysibm.sysdummy1;
3.如何連接字段的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
           Select  emp_no||emp_nam  from  bsempms;
           Select  concat(emp_no,emp_nam) from bsempms;
  DB2 可以這樣實現﹕
           Select emp_no||emp_nam from db2admin.bsempms;
           select emp_no concat emp_nam from db2admin.bsempms;
4.如何查詢表的結構的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
           describe tablename;
  DB2 可以這樣實現﹕
           describe table tablename
5.內連接INNER JOIN的Oracle和DB2的寫法
  Oracle可以這樣實現﹕
           Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no;
  DB2 可以這樣實現﹕
           Select * from db2admin.bsempms inner join db2admin.bsdptms
           on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;
6.外連接的Oracle和DB2的寫法(右外連接,左外連接,完全外連接,組合外連接)
  Oracle可以這樣實現﹕
           Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no(+);
           Select a.* from bsempms a,bsdptms b wherea.dpt_no(+)=b.dpt_no;
  DB2 可以這樣實現﹕
   Select * from db2admin.bsempms right outer join db2admin.bsdptms
   on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;
   Select * from db2admin.bsempms left outer join db2admin.bsdptms
   on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;
   Select * from db2admin.bsempms full outer join db2admin.bsdptms
   on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;
7.如何執行腳本SQL文件的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
           SQL> @$PATH/filename.sql;
  DB2 可以這樣實現﹕
           db2 -tvf $PATH/filename 文件中每行以 ; ?尾

在DB2中如何實現Oracle的相關功能(二)
1.如何查看數据庫的版本的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
      SQL> connect system/manager124@test;
      已連線.
      SQL> select * from v$version;

  BANNER
  ----------------------------------------------------------------
  Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
  PL/SQL Release 9.2.0.1.0 - Production
  CORE    9.2.0.1.0       Production
  TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
  NLSRTL Version 9.2.0.1.0 - Production

  DB2 可以這樣實現﹕
  在命令窗口執行 db2level
      D:/SQLLIB/BIN> db2level
  DB210851 Instance "DB2" uses DB2 code release "SQL07020" with level identifier
  "03010105" and informational tokens "DB2 v7.1.0.40","n010415" and "WR21254".

2.如何快速清空一個大表的Oracle和DB2的寫法

  Oracle 可以這樣實現﹕
          SQL> truncate table table_name;

  DB2 可以這樣實現﹕
          alter table table_name activate not logged initially with empty table;

《如何快速清空一個大表的Oracle和DB2的寫法》
 即便是这样,还是出错:"SQL1749N不能为表“table_name”激活not logged initially属性,因为创建该表时未用not logged initially属性。SQLSTATE=429AA。"
没有truncate命令
如果表上没有trigger,也没有视图基于它,可以
create table temp like your_table;
drop table your_table;
rename table temp to your_table;

也可以 import/load from a_null_file of del replace into <tabname>
        import from /dev/null of del replace into <tabname>


3.如何查看表空間的使用狀況的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
  SELECT tablespace_name, max_m, count_blocks free_blk_cnt, sum_free_m,
             to_char(100*sum_free_m/sum_m, '99.99') || '%' AS  pct_free
  FROM ( SELECT tablespace_name,sum(bytes)/1024/1024 AS sum_m FROM dba_data_files GROUP BY   tablespace_name),
  ( SELECT tablespace_name AS fs_ts_name, max(bytes)/1024/1024 AS max_m, count(blocks) AS    count_blocks,
    sum(bytes/1024/1024) AS sum_free_m FROM dba_free_space GROUP BY  tablespace_name )
  WHERE tablespace_name = fs_ts_name
  DB2 可以這樣實現﹕
  list tablespace containers for 你的表空間號 show detail;
4.如何從一時間點取出日期的各部分的常用的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
  1>.取時間點的年份的寫法:
     SELECT TO_CHAR(SYSDATE,'YYYY') FROM DUAL;
  2>.取時間點的月份的寫法:
     SELECT TO_CHAR(SYSDATE,'MM') FROM DUAL;
  3>.取時間點的日的寫法:
     SELECT TO_CHAR(SYSDATE,'DD') FROM DUAL;
  4>.取時間點的時的寫法:
     SELECT TO_CHAR(SYSDATE,'HH24') FROM DUAL;
  5>.取時間點的分的寫法:
     SELECT TO_CHAR(SYSDATE,'MI') FROM DUAL;
  6>.取時間點的秒的寫法:
     SELECT TO_CHAR(SYSDATE,'SS') FROM DUAL;
  7>.取時間點的毫秒的寫法:(9I以上)
     select SUBSTR(systimestamp,20,6) from DUAL;
  8>.取時間點的日期的寫法:
     SELECT TRUNC(SYSDATE) FROM DUAL;
  9>.取時間點的時間的寫法:
     SELECT TO_CHAR(SYSDATE,'HH24:MI:SS') FROM DUAL;
  10>.日期,時間形態變為字符形態
     SELECT TO_CHAR(SYSDATE) FROM DUAL;
  11>.將字符串轉換成日期或時間形態:
     SELECT TO_DATE('2003/08/01') FROM DUAL;
  12>.返回參數的星期几的寫法:
     SELECT TO_CHAR(SYSDATE,'D') FROM DUAL;
  13>.返回參數一年中的第几天的寫法:
     SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;
  14>.返回午夜和參數中指定的時間值之間的秒數的寫法:
     SELECT TO_CHAR(SYSDATE,'SSSSS') FROM DUAL;
  15>.返回參數中一年的第几周的寫法:
     SELECT TO_CHAR(SYSDATE,'WW') FROM DUAL;
 
  DB2 可以這樣實現﹕
  1>.取時間點的年份的寫法:
     SELECT YEAR(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  2>.取時間點的月份的寫法:
     SELECT MONTH(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  3>.取時間點的日的寫法:
     SELECT DAY(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  4>.取時間點的時的寫法:
     SELECT HOUR(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  5>.取時間點的分的寫法:
     SELECT MINUTE(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  6>.取時間點的秒的寫法:
     SELECT SECOND(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  7>.取時間點的毫秒的寫法:
     SELECT MICROSECOND(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  8>.取時間點的日期的寫法:
     SELECT DATE(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  9>.取時間點的時間的寫法:
     SELECT TIME(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  10>.日期,時間形態變為字符形態:
     SELECT char(current date) FROM SYSIBM.SYSDUMMY1;
     SELECT char(current time) FROM SYSIBM.SYSDUMMY1;
     SELECT char(current date+12 hours) FROM SYSIBM.SYSDUMMY1;
  11>.將字符串轉換成日期或時間形態:
     SELECT TIMESTAMP('2002-10-20-12.00.00.000000') FROM SYSIBM.SYSDUMMY1;
     SELECT TIMESTAMP('2002-10-20 12:00:00') FROM SYSIBM.SYSDUMMY1;
     SELECT DATE('2002-10-20') FROM SYSIBM.SYSDUMMY1;
     SELECT DATE('10/20/2002') FROM SYSIBM.SYSDUMMY1;
     SELECT TIME('12:00:00') FROM SYSIBM.SYSDUMMY1;
     SELECT TIME ('12.00.00') FROM SYSIBM.SYSDUMMY1;
  12>.返回參數的星期几的寫法:
     SELECT DAYNAME(current timestamp)  FROM SYSIBM.SYSDUMMY1;
     SELECT DAYOFWEEK(current timestamp)  FROM SYSIBM.SYSDUMMY1;
     SELECT DAYOFWEEK_ISO(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  13>.返回參數一年中的第几天的寫法:
     SELECT DAYOFYEAR(current timestamp)  FROM SYSIBM.SYSDUMMY1;
  14>.返回午夜和參數中指定的時間值之間的秒數的寫法:
     SELECT MIDNIGHT_SECONDS(current timestamp) FORM SYSIBM.SYSDUMMY1;
  15>.返回參數中一年的第几周的寫法:
     SELECT WEEK(current timestamp) FORM SYSIBM.SYSDUMMY1;

在DB2中如何實現Oracle的相關功能(三)

1.如何查有多少個數据庫實例的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
          SQL> SELECT * FROM V$INSTANCE;
  DB2 可以這樣實現﹕
          在命令窗口執行 db2ilist
2.如何查詢數据庫有多少表的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
          SQL> select * from all_tables;
  DB2 可以這樣實現﹕
  在命令中心執行
          select  *   from syscat.tables;
3.如何知道表鎖的情況的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
  SQL>SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMODE, 0,  'None', 1, 'Null', 2, 'Row-S   (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(LMODE))   MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4,   'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(REQUEST)) MODE_REQUESTED,   O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')', S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1,   L.ID2 LOCK_ID2 FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S WHERE L.SID = S.SID AND   L.ID1 = O.OBJECT_ID
  DB2 可以這樣實現﹕
  在你执行你的存储过程之前,执行命令打开锁的监视开光
  db2 update monisor switches using lock on ;
  然后执行你的存储过程,在执行存储过程期间的时候使用命令
  db2 get snapshot for locks on yourdatdabasename ;
  就可以看见了你锁情况了
4. 如何對鎖住的表進行解鎖的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
          SQL>alter system kill session 'sid,service#';
  DB2 可以這樣實現﹕
         db2 force application all ;
         db2 terminate ;
5. 測試SQL語句執行所用的時間的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
          SQL> set timing on ;
          SQL> select * from tablename;
  DB2 可以這樣實現﹕
         db2batch -d 库名 -f 含有SQL语句的文件名 ;
6. 如何配置Sequence的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
  建sequence seq_custid
         create sequence seq_custid start 1 incrememt by 1;
  建表时:
         create table cust
         { cust_id smallint not null,
         ...}
  insert 时:
         insert into table cust
         values( seq_cust.nextval, ...)
  DB2 可以這樣實現﹕
  identity字段属性用法:
          create table时
          cust_id smallint not null generated always as indentity (start with  1 increment by 1)
  insert 时:
          insert into table cust (cust_id, ... )  values ( default, ...)

 在DB2中如何實現Oracle的相關功能(四)

1. 如何實現分頁顯示的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
          SQL> select rownum,* from BSEMPMS where rownum >=5 and rownum <=100;
  DB2 可以這樣實現﹕
        select * from (
                             select ROW_NUMBER() over() as a, db2admin.bsempms.*
                             from
db2admin.bsempms
                           )  as temp
                    where a>=5 and a<=100 ;

2.利用別的表創建表的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
          SQL> create table a as select * from b ;
  DB2 可以這樣實現﹕
           create table a like b ;
3.如何更改用戶密碼的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
          SQL>alter user user123 identified by password_new;
  DB2 可以這樣實現﹕
          connect to dbname user db2admin using oldpassw new newpassw confirm newpassw ;
4.如何增加用戶的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
         SQL>create user user123 identified by password_new;
  DB2 可以這樣實現﹕
        添加用户:
       “开始/设置/控制面板/用户”添加一个用户名(例:db2admin)
  分配权限:
        grant dbadm on database to user 用户名
5.兩個結果集互減的函數的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
             SQL>SELECT * FROM BSEMPMS_OLD MINUS SELECT * FROM BSEMPMS_NEW;
  DB2 可以這樣實現﹕
          SELECT * FROM BSEMPMS_OLD EXCEPT SELECT * FROM BSEMPMS_NEW;
          SELECT * FROM BSEMPMS_OLD EXCEPT ALL SELECT * FROM BSEMPMS_NEW;
6.兩個結果集互加的函數的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
          SQL>SELECT * FROM BSEMPMS_OLD INTERSECT SELECT * FROM BSEMPMS_NEW;
          SQL>SELECT * FROM BSEMPMS_OLD UNION SELECT * FROM BSEMPMS_NEW;
          SQL>SELECT * FROM BSEMPMS_OLD UNION ALL SELECT * FROM BSEMPMS_NEW;
  DB2 可以這樣實現﹕
          SELECT * FROM  DB2ADMIN.BSEMPMS
          UNION
          SELECT * FROM  DB2ADMIN.BSEMPMS ;
          SELECT * FROM  DB2ADMIN.BSEMPMS
          UNION  ALL
          SELECT * FROM  DB2ADMIN.BSEMPMS ;
7.如何找数据库表的主键字段的名称的Oracle和DB2的寫法
  Oracle 可以這樣實現﹕
          SQL>SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and   table_name='TABLE_NAME';
  DB2 可以這樣實現﹕
          select colnames from syscat.indexes where tabname='TABLE_NAME' ;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值