oracle サンプル!

   
 



1. サンプルSQL                                       
 
・セレクト文の説明
・DECODE関数の使用例
・インラインビューの使用例
・SELECT、INSERT
・SELCT,UPDATE
・日付の差分
・排他処理

・SELECT文(基本です。)  ・IF文の実現する(DECODE関数)  
・インラインビュー実現する(FROM句にSELECT)
・SELECT、INSERTの実現(SELECT結果をINSERTする)  
・SELECT、UPDATE(SELECT結果をUPDATE)

・日付の差分をとる(interval型)  
・排他制御の説明
   
・Sysdate型を文字列で取得する。
・外部結合(FULL OUTER JOIN)        
・外部結合、内部結合(LEFT OUTER JOIN、INNER JOIN)
・テーブルにあればSELECTする(EXISTS)1  
・テーブルにあればDELETEする(EXISTS)
・テーブルになければインサートする(EXISTS)
・Blob型をSELECTする(Blob)    
・Blob型をUPDATEする(Blob)

・必要ない結合をやめて、EXISTSをしよう。
・日付取得する。
・最小値を取得する。
・テーブルLOCKの方法(行ロック方法)
・重複行を取得
・oracleに接続
・exp,impの例
・spoolでテキストファイルに結果を格納!!
SI Oject Browser ダウンロード
isqlplus起動
・主キー名から、テーブルを検索
・主キーを検索
・外部結合の説明
・テーブルバックアップ
・テーブル名変更
・主キー削除
・主キー追加
・カラム削除


util関係                                          
・SQLの実行時間を表示する。(1回のSQLの場合)
・ SQL文を再実行するには
・ バインド変数を使用するには
・ バインド変数を使用するには(SQL PULS)
・ 現在時刻の表示
・ edit

 



セレクト文の説明                                                           

SELECT
   a.カラム1,
   b.カラム1,
   c.カラム1
FROM
   テーブルA a
   テーブルB b
   テーブルC c
WHERE
   a.カラム2=b.カラム2
   b.カラム2=c.カラム2
------------------------
SELECT
   なし
FROM
   テーブルA a
   テーブルB b
   テーブルC c

の時点で、テーブルA 、テーブルB、 テーブルCのカラムすべて取得できている。
(なぜなら、SELECTに記述されていないカラムでも、内部的には取得しているからWHEREで比較できている。例、WHERE句を参照)


DECODE関数の使用例                                                    

SELECT
   a.カラム1,
   b.カラム1,
   DECODE(c.カラム1,'5555','五が4っつ','6666',a.カラム10)
FROM
   テーブルA a
   テーブルB b
   テーブルC c


テーブルCのカラム1が'5555'であれば'五が4つ'と表示される。
テーブルCのカラム1が'6666'であればテーブルAのカラム10の内容が表示される。

インラインビューの使用例                                                     

SELECT
   a.カラム1,
   a.カラム2,
   TB.カラム1,
   TB.カラム2
FROM
   テーブルA b
   テーブル(SELECT b.カラム1 b.カラム2 FROM テーブルB b WHERE b.カラム1='3333') TB
WHERE
   a.カラム1='1111' AND
   a.カラム2='2222'

 

SELECT,INSERTの使用例                                             


INSERT INTO テーブルA a (
a.カラム1
a.カラム2
a.カラム3
a.カラム4
)
SELECT
   b.カラム1,
   b.カラム2,
   b.カラム3,
   b.カラム4
FROM
   テーブルA b
WHERE
   b.カラム1='1111' AND
   b.カラム2='2222' AND
   b.カラム3='3333' AND
   b.カラム4='4444'

SELECT,UPDATEの使用例                                                   


UPDATE テーブルA a
a.カラム1='1111'
a.カラム2='2222'
a.カラム3='3333'
a.カラム4=(SELECT b.カラム4 FROM テーブルB WHERE b.カラム4='b4b4')

WHERE
a.カラム1=b.カラム1

これは、エラーがある。なぜなら、外のUPDATE文のWHERE句では、テーブルBは指定できない。
(SELECT、INSERTで重要なのは、外のUPDATEの件数と、中のSELECT文の件数を意識することが必要)


日付の差分のサンプル                                                    


INSERT INTO テーブル1 a
(
a.カラム1
a.カラム2
a.カラム3 ・・・これはsysdate型です。
)

SELECT
   b.カラム1,
   b.カラム2,
   b.カラム3 + to_dsinterval(DIFF.カラム3)

FROM
   テーブル2 b,
   (SELECT substr(numtodsinterval(TO_DATE('20050101150000','yyyymmddhh24MISS') - TEST.カラム3,'day'),8.12)AS カラム3
      FROM
      (SELECT 5.カラム3 FROM テーブル5 WHERE 条件・・・) TEST

   FROM テーブル4
   WHERE ROWNUM<=1
   )DIFF

WHERE
条件・・・・

まとめ
カラム+to_dsinterval(substr(numtodsinterval(TO_DATE('20050927151500','yyyymmddhh24MISS')-カラム'day'),8,12)) AS NAME
(stsdate)                                                       (sysdate)


(日付の差分では、端数が出る時があるので、その可能性がある箇所にROUND関数を使用する。)TRUNCは切り捨てです。
例・・・TRUNC(TO_DATE('2001/12/23','YYYY/MM/DD'),'YEAR')・・・・・・・2001/01/01が返ります(切捨て)
例・・・TRUNC(TO_DATE('20010202153515','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時35分がかえるはず(切捨て)

例・・・ROUND(TO_DATE('2001/02/03','YYYY/MM/DD'),'YEAR') ・・・2001/01/01が返ります(繰り下げ)
例・・・ROUND(TO_DATE('2001/12/23','YYYY/MM/DD'),'YEAR') ・・・2002/01/01が返ります (繰上げ)
例・・・ROUND(TO_DATE('20010202153515','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時35分がかえるはず(繰り下げ)
例・・・ROUND(TO_DATE('20010202153530','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時36分がかえるはず(繰り上げ)


ボックス情報(entity)クラスです。                                                


単体排他・・・レコード単位でブロック(DELETEとUPDATEで必要)

共通排他(テーブル排他)・・・テーブル単位でチェック(処理中などがFlag=1などを立ててチェック


削除(DELETE)・・・単体排他をかけて削除
更新(UPDATE)・・・単体排他をかけて更新
登録(INSERT)・・・排他の必要なし。だが、相関チェックが必要。
(相関チェックとは、キー検索によりINSERT するレコードが存在するかのチェックを行う)



EXISTS  (EXISTSがTRUEなら 外のセレクトを実行します)                                

SELECT
   *
FROM
  TABLE a
WHERE
  EXISTS(SELECT 1 FROM TABLE b WHERE b.TABLE b='5555' )

 

EXISTS  (EXISTSがTRUEなら 外のインサート文を実行します)                             

INSERT INTO テーブルA a (
a.カラム1
a.カラム2
a.カラム3
a.カラム4
)

SELECT
  b.カラム1,
  固定値,
  b.カラム3,
  b.カラム4
FROM
  TABLEA b
WHERE
  EXISTS(SELECT 1 FROM TABLE b WHERE b.TABLE b='5555' )

 

EXISTS  (EXISTSがTRUEなら 外のDELETE文を実行します)                              

DELETE
FROM テーブルA 
WHERE
  EXISTS(SELECT 1 FROM TABLE b WHERE b.TABLE b='5555' )

LEFT OUTER JOIN()  、INNER JOIN                                             

INSERT INTO ()
   SELECT
    A.ZZZ
    B.YYY
  FROM
    TBKIKI a

     INNER JOIN YOKIKI b ON(a.ZZZ=B.ZZZ)
    LEFT OUTER JOIN YOKIKI c ON(B.ZZZ=C.ZZZ)

  WHERE
    A=ZZZ
    B=YYY
    C IS NULL

外部結合                                                           

SELECT
   *
FROM
    (SELECT aa.YYY FROM TABLE aa WHERE aa.KARAMU1='5555') AA

  FULL OUTER JOIN

    (SELECT bb.YYY FROM TABLE bb WHERE bb.KARAMU='5555') EE

  ON(AA.ZZZ = EE.ZZZ)
GROUP BY
  *
ORDER BY
  *

 

セレクト文の説明                                                           

SELECT
   a.カラム1,
   b.カラム1,
   c.カラム1
FROM
   テーブルA a
   テーブルB b
   テーブルC c
WHERE
   a.カラム2=b.カラム2
   b.カラム2=c.カラム2
------------------------
SELECT
   なし
FROM
   テーブルA a
   テーブルB b
   テーブルC c

の時点で、テーブルA 、テーブルB、 テーブルCのカラムすべて取得できている。
(なぜなら、SELECTに記述されていないカラムでも、内部的には取得しているからWHEREで比較できている。例、WHERE句を参照)

Sysdate型を2006010101019999で取得する                                          

SELECT
   NVL( TO_CHAR(a.sysdate, 'yyyymmddhh24MISS ) , '' ) AS karam);
 FROM
   テーブルA a


DECODE関数の使用例                                                 
SELECT
   a.カラム1,
   b.カラム1,
   DECODE(c.カラム1,'5555','五が4っつ','6666',a.カラム10)
FROM
   テーブルA a
   テーブルB b
   テーブルC c


テーブルCのカラム1が'5555'であれば'五が4つ'と表示される。
テーブルCのカラム1が'6666'であればテーブルAのカラム10の内容が表示される。

インラインビューの使用例                                                     

SELECT
   a.カラム1,
   a.カラム2,
   TB.カラム1,
   TB.カラム2
FROM
   テーブルA b
   テーブル(SELECT b.カラム1 b.カラム2 FROM テーブルB b WHERE b.カラム1='3333') TB
WHERE
   a.カラム1='1111' AND
   a.カラム2='2222'

 

SELECT,INSERTの使用例                                             


INSERT INTO テーブルA a (
a.カラム1
a.カラム2
a.カラム3
a.カラム4
)
SELECT
   b.カラム1,
   b.カラム2,
   b.カラム3,
   b.カラム4
FROM
   テーブルA b
WHERE
   b.カラム1='1111' AND
   b.カラム2='2222' AND
   b.カラム3='3333' AND
   b.カラム4='4444'

SELECT,UPDATEの使用例                                                   


UPDATE テーブルA a
a.カラム1='1111'
a.カラム2='2222'
a.カラム3='3333'
a.カラム4=(SELECT b.カラム4 FROM テーブルB WHERE b.カラム4='b4b4')

WHERE
a.カラム1=b.カラム1

これは、エラーがある。なぜなら、外のUPDATE文のWHERE句では、テーブルBは指定できない。
(SELECT、INSERTで重要なのは、外のUPDATEの件数と、中のSELECT文の件数を意識することが必要)


日付の差分のサンプル                                                    


INSERT INTO テーブル1 a
(
a.カラム1
a.カラム2
a.カラム3 ・・・これはsysdate型です。
)

SELECT
   b.カラム1,
   b.カラム2,
   b.カラム3 + to_dsinterval(DIFF.カラム3)

FROM
   テーブル2 b,
   (SELECT substr(numtodsinterval(TO_DATE('20050101150000','yyyymmddhh24MISS') - TEST.カラム3,'day'),8.12)AS カラム3
      FROM
      (SELECT 5.カラム3 FROM テーブル5 WHERE 条件・・・) TEST

   FROM テーブル4
   WHERE ROWNUM<=1
   )DIFF

WHERE
条件・・・・

まとめ
カラム+to_dsinterval(substr(numtodsinterval(TO_DATE('20050927151500','yyyymmddhh24MISS')-カラム'day'),8,12)) AS NAME
(stsdate)                                                       (sysdate)


(日付の差分では、端数が出る時があるので、その可能性がある箇所にROUND関数を使用する。)TRUNCは切り捨てです。
例・・・TRUNC(TO_DATE('2001/12/23','YYYY/MM/DD'),'YEAR')・・・・・・・2001/01/01が返ります(切捨て)
例・・・TRUNC(TO_DATE('20010202153515','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時35分がかえるはず(切捨て)

例・・・ROUND(TO_DATE('2001/02/03','YYYY/MM/DD'),'YEAR') ・・・2001/01/01が返ります(繰り下げ)
例・・・ROUND(TO_DATE('2001/12/23','YYYY/MM/DD'),'YEAR') ・・・2002/01/01が返ります (繰上げ)
例・・・ROUND(TO_DATE('20010202153515','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時35分がかえるはず(繰り下げ)
例・・・ROUND(TO_DATE('20010202153530','YYYY/MM/DD HH24:MI'),'MI')・・・・・2001年02月02日15時36分がかえるはず(繰り上げ)

Blob型をSELECTする                                                 
SELECT
   a.カラム1,・・・Blob型
FROM
   テーブルA a
WHERE
   a.id='1111'

Blob型をUPDATEする                                                

SELECTしてロックをかけて、UPDATEをかける。(インサートされている(レコードが存在するので、CSEなどであらかじめ作成しておく。)必要がある。)

排他制御とは?                                               


単体排他・・・レコード単位でブロック(DELETEとUPDATEで必要)

共通排他(テーブル排他)・・・テーブル単位でチェック(処理中などがFlag=1などを立ててチェック


削除(DELETE)・・・単体排他をかけて削除
更新(UPDATE)・・・単体排他をかけて更新
登録(INSERT)・・・排他の必要なし。だが、相関チェックが必要。
(相関チェックとは、キー検索によりINSERT するレコードが存在するかのチェックを行う)

・必要ない結合をやめて、EXISTSをしよう。

  


ORACLEレスポンス                                                                        

悪い例                                                 
SELECT
   FF.カラム1 カラム1
   DECODE(FF.カラム2,'0','明日','あさって') カラム2
   TO_CHAR(FF.カラム3,'YYYY/MM/DD HH24:MISS')' カラム3
   MIN(FF.カラム4) カラム4
   MAX(FF.カラム5) カラム5
FROM
   (SELET
      A.カラム1
   RROM
       テーブル A 
   WHERE
       A.カラム1='9'
   ) EE
   FULL OUTER JOIN
   (SELECT
       C.カラム2
       D.カラム3
   FROM
       テーブル B,
       テーブル C,
       テーブル D
    WHERE
        B.カラム = C.カラム AND
        B.カラム2 = D.カラム AND
        C.カラム = D.カラム AND
        C.カラム2 = D.カラム
    ) FF
    ON (EE.TEST_ID = FF.TEST_ID)
GROUP BY
   FF.カラム1
   FF.カラム2
   FF.カラム3
   FF.カラム4
   FF.カラム5
ORDER BY
   FF.TEST.ID
   

よい例(修正後)      EXISTSを使用するとかなり動作が速くなる。                        
SELECT
   FF.カラム1 カラム1
   DECODE(FF.カラム2,'0','明日','あさって') カラム2
   TO_CHAR(FF.カラム3,'YYYY/MM/DD HH24:MISS')' カラム3
   MIN(FF.カラム4) カラム4
   MAX(FF.カラム5) カラム5
FROM
   (SELET
      A.カラム1
   RROM
       テーブル A 
   WHERE
       A.カラム1='9'
   ) EE
   FULL OUTER JOIN
   (SELECT
       C.カラム2
       D.カラム3
   FROM
       テーブル C,
       テーブル D
    WHERE
        EXISTS(SELECT 1 FROM テーブル B WHERE B.カラム = C.カラム AND B.カラム2 = D.カラム)
        C.カラム = D.カラム AND
        C.カラム2 = D.カラム
    ) FF
    ON (EE.TEST_ID = FF.TEST_ID)
GROUP BY
   FF.カラム1
   FF.カラム2
   FF.カラム3
   FF.カラム4
   FF.カラム5
ORDER BY
   FF.TEST.ID



日付を取得                                                                                                           

SELECT
 SYSDATE
FROM
 DUAL

最小値を取得(1が返る)                                                                                                    

SELECT
 LEAST('1','5','10')
FROM
 DUAL 

SQLの実行時間を表示する。(1回のSQLの場合)                                    

set timing on

複数の場合は、TIMING START
          TIMING SHOW
          TIMING STOP

SQL文を再実行するには                                                         

 /を使用する・・・・バッファの内容を表示しない

 runを使用する・・・・バッファの内容を表示する

バインド変数を使用するには                                                              
SELECT
  *
FROM
 EMP
WHERE
 EMPNO = :baind

バインド変数を使用するには(SQL PULS)                                                     
SELECT
  *
FROM
 EMP
WHERE
 EMPNO = '&1'

現在時刻の表示                                                            
set time on

edit使用例                                                        

ed

edit

バッファを編集できる。そして/で再実行

C:\Oracle\Ora81\BINにある、afiedt.bufを編集している。

また、

SELECT * FROM DUAL
/
としても実行できる。

テーブルをLOCK                                                                       

LOCK TABLE "テーブル名" IN EXCLUSIVE MODE NOWAIT

行ロック                                                 

SELECT '1' FROM "テーブル名" FOR UPDATE NOWAIT

oracleで重複を取得する場合は、having句を使用する。

SELECT
  顧客番号, count(*)
FROM
 テーブル
GROUP BY
 顧客番号
HAVING count(*) > 1

.oracleに接続                                    


TNS名(SQL*Plusで指定する名称) =             ← ここに書かれている名前がネットサービス名

   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ホスト名)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SID識別子)           ← ここがサービス名
    )
  )


TNS名(SQL*Plusで指定する名称) がsqlplusのホスト文字列に当たります。


exp、impの例

expユーティリティとimpユーティリティを使用することで、表を別のORACLEへ持っていくことができます。 expユーティリティでは、表単位、ユーザ単位でデータを移動できます。ユーザ名が異なる場合は、imp時に、fromuserオプションとtouserオプションを使用します。 expするときのユーザがDBA権限を持っているとDBA権限のないユーザではimpできない場合があります。

unix# exp "user/passwd file=exp01.dmp tables=(JOB, TOKUIDB, TOUR_JOHO)"
unix# imp "user/passwd file=exp01.dmp tables=(JOB, TOKUIDB, TOUR_JOHO)"

exp "scott/tiger file=/home/exp01.dmp tables=emp"

imp "scott/tiger file=/home/exp01.dmp tables=emp"

ただし、すでに表が存在している場合には、impエラーとなる。

細く

●表の一覧
SQL# select * from tab;

●表の項目一覧
SQL# desc 表名;(;は省略可)

●インデックスの一覧
SQL# select * from user_ind_columns;
※指定した表のインデックスのみ、表示することもできます。
SQL# select column_name from user_ind_columns where table_name = '表名';

●ユーザ一覧
SQL# select username from user_users;

●データベースの文字コード
SQL# select * from NLS_DATABASE_PARAMETERS where PARAMETER = 'NLS_NCHAR_CHARACTERSET';

spoolでテキストファイルに結果を格納!!

1.sqlplus xxx/xxxで接続
2.spool aaa.txt
3.select table_name from user_tables;
4.spool off

SI Oject Browser ダウンロード

『http://www.sint.co.jp/siob/download.asp』からobt900104.EXEをダウンロード。

isqlplus起動

isqlplusctl start            →DOSで


http://localhost:5560/isqlplus/ →IEでポートが違う

 

主キー名から、テーブルを検索
1.
select table_name AS テーブル名, constraint_name from user_cons_columns where constraint_name='PK_EMP'

2.
select table_name AS テーブル名, constraint_name from user_constraints where constraint_name='PK_EMP'

主キーを検索


select * from user_cons_columns

select * from user_constraints

この二つを結合して、主キーを検索する。

@ 2つのテーブルの共通カラム   constraint_name(属性名)
Aconstraintのカラム          const.constraint_type='P'  (PKEY)
Bconstraintのカラム         const.table_name = 'EMP' (テーブル名)

SELECT
-- cons.table_name,
-- cons.constraint_name,
cons.column_name
FROM
user_cons_columns cons,
user_constraints const
WHERE
cons.constraint_name=const.constraint_name AND  @
const.constraint_type='P'                        A
AND const.table_name = 'EMP'           B


C(表でのチェック制約)
P(主キー)
U(一意のキー)
R(参照整合性)
V(ビューでのチェック・オプション付き)
O(ビューで読取り専用)

 

テーブルバックアップ

create teble A_bk as select * from A

 

 

テーブル名変更

rename A to A_bk

主キー削除

alter table テーブル名 drop constraints  主キー名

主キー追加

ALTER TABLE テーブル名
  ADD(
    CONSTRAINT 主キー名(属性名)
    PRIMARY KEY (1、2、3)
    TABLESPACE 表領域名
    STORAGE(
      INITIAL 40M
      MAXEXTENTS 120
      PCTINCREASE 0
    )
    PCTFREE 10
  )

 

表領域については、『http://cyberam.dip.jp/database/oracle/oracle.html』を参照

カラム削除

alter table テーブル名 drop column カラム名


外部結合                                                 


----------------------------------------------------
例1 図参照

SELECT
 A.コード
 C.コード
FROM 
  (TBL1 ALEFT JOIN TBL2 B ON A.コード=B.コード)    △テーブル1と2の外部結合
  RIHGT JOIN TBL3 C ON A.コード=C.コード        テーブル3と△の結果の外部結合

----------------------------------------------------

例1と同じ 図参照

SELECT
 A.コード
 C.コード
FROM 
  TBL1 A,
  TBL2 B,
  TBL3 C
  A.コード=B.コード(+)
  C.コード=A.コード(+)

----------------------------------------------------

 

 

 

 

----------------------------------------------------

2つの結合の場合

SELECT
 A.コード
 B.コード
FROM 
  TBL1 ALEFT JOIN TBL2 B ON A.コード=B.コード    テーブル1と2の外部結合

----------------------------------------------------

4つの場合

SELECT
 A.コード
 D.コード
FROM 
 ((TBL1 ALEFT JOIN TBL2 B ON A.コード=B.コード)    △テーブル1と2の外部結合
  RIHGT JOIN TBL3 C ON A.コード=C.コード)        テーブル3と△の結果の外部結合
  RIHGT JOIN TBL4 C ON D.コード=C.コード

----------------------------------------------------


 

 


                                              Topへ