asoka.hang's oracle/java blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            4 隨筆 :: 0 文章 :: 0 評論 :: 0 Trackbacks

          2006年4月19日 #

          大家知道,oracle中沒有提供修改約束條件的命令,如果要用到修改約束條件時,常規做法就是先drop掉當前約束再重新創建一個新約束條件,從應用層次而言,這樣做是不妥的。

          常規做法如下:
          SQL > ? create ? table ?test_constraint
          ??
          2
          ??(
          ??
          3 ??id? number
          ,
          ??
          4 ??name? varchar ( 25
          ),
          ??
          5 ??age? number ? constraint ?age_ct? check (age? between ? 0 ? and ? 99
          )
          ??
          6
          ??);

          表已創建。

          SQL
          > ? alter ? table ?test_constraint? drop ? constraint
          ?age_ct;

          表已更改。

          SQL
          > ? alter ? table ?test_constraint? add ? constraint ?age_ct? check (age? between ? 18 ? and ? 99
          );

          表已更改。

          tom在一篇文章中這樣講: “我會用兩條命令:一條增加一個新的約束,另一條刪除舊的約束。”,仔細理解也就是說他會先將新的約束條件進行添加以達到新的要求需求,而事后再對舊的約束條件予以drop,這種做法通過sqlplus表現如下:
          SQL > ? drop ? table ?test_constraint;

          表已丟棄。

          SQL
          > ? create ? table
          ?test_constraint
          ??
          2
          ??(
          ??
          3 ??id? number
          ,
          ??
          4 ??name? varchar ( 25
          ),
          ??
          5 ??age? number ? constraint ?age_ct? check (age? between ? 0 ? and ? 99
          )
          ??
          6
          ??);

          表已創建。

          SQL
          > ? alter ? table ?test_constraint? add ? constraint ?agenew_ct? check (age? between ? 18 ? and ? 99
          );

          表已更改。

          SQL
          > ? alter ? table ?test_constraint? drop ? constraint
          ?age_ct;

          表已更改。

          從應用層面上而言,更改一個約束名稱并不會受到影響,通過上面方法既將新的約束條件增加進去了又沒有影響到應用(先drop后add的做法在這里顯得是一種錯誤的做法)。
          posted @ 2006-04-19 17:30 asoka的oracle/java博客 閱讀(267) | 評論 (0)編輯 收藏

          2006年4月13日 #

          case:要求在一張銷售信息表中查詢每件產品的最近銷售日期(不用PL/SQL實現)。

          創建test_purchase表:
          SQL > ? create ? table ?test_purchase(
          ??
          2 ??product_name? varchar2 ( 25
          ),
          ??
          3 ??salesperson? varchar2 ( 3
          ),
          ??
          4
          ??purchase_date?date,
          ??
          5 ??quantity? number ( 4 , 2
          )
          ??
          6
          ??);

          表已創建。

          往test_purchase表中插入數據:
          SQL > ? insert ? into ?test_purchase? values ( ' small?widget ' , ' ca ' ,to_date( ' 2003-7-14 ' , ' YYYY-MM-DD ' ), 1 );

          已創建?
          1
          ?行。

          SQL
          > ? insert ? into ?test_purchase? values ( ' medium?wodget ' , ' bb ' ,to_date( ' 2003-7-14 ' , ' YYYY-MM-DD ' ), 75
          );

          已創建?
          1
          ?行。

          SQL
          > ? insert ? into ?test_purchase? values ( ' chrome?phoobar ' , ' ga ' ,to_date( ' 2003-7-14 ' , ' YYYY-MM-DD ' ), 2
          );

          已創建?
          1
          ?行。

          SQL
          > ? insert ? into ?test_purchase? values ( ' small?widget ' , ' ga ' ,to_date( ' 2003-7-15 ' , ' YYYY-MM-DD ' ), 8
          );

          已創建?
          1
          ?行。

          SQL
          > ? insert ? into ?test_purchase? values ( ' medium?wodget ' , ' lb ' ,to_date( ' 2003-7-15 ' , ' YYYY-MM-DD ' ), 20
          );

          已創建?
          1
          ?行。

          SQL
          > ? insert ? into ?test_purchase? values ( ' round?snaphoo ' , ' ca ' ,to_date( ' 2003-7-16 ' , ' YYYY-MM-DD ' ), 5
          );

          已創建?
          1 ?行。

          關鍵的select 子查詢語句來了,呵呵

          SQL > ? select ? * ? from ?test_purchase? where (product_name,purchase_date)
          ??
          2 ?? in

          ??
          3 ??( select ?product_name, max (purchase_date)? from ?test_purchase? group ? by ?product_name);

          PRODUCT_NAME??????????????SAL?PURCHASE_D???QUANTITY
          -- -----------------------?---?----------?----------

          chrome?phoobar????????????ga?? 2003 - 07 - 14 ?????????? 2
          medium?wodget?????????????lb??
          2003 - 07 - 15 ????????? 20
          round ?snaphoo?????????????ca?? 2003 - 07 - 16 ?????????? 5
          small?widget??????????????ga??
          2003 - 07 - 15 ?????????? 8

          其實仔細想一想也不是很復雜,不過這條語句乍一想來如何寫還真有點困難,所以用了個妙字,:p

          posted @ 2006-04-13 23:04 asoka的oracle/java博客 閱讀(295) | 評論 (0)編輯 收藏

          case:在scott.emp中有一個字段為deptno用來存儲部門編號,在關系型數據庫中一個字段只能夠存儲一列值(像ENAME列只能夠存儲員工姓名的值),要想查詢emp與dept兩表間的關聯值還得運用主從表間的關系,查詢效率不高,在emp表中deptno字段并不是很復雜(因為dept表中僅三個字段)的情況下,oracle允許在emp表中的deptno字段里存儲一個表,這雖然違反關系型數據庫的規則,但是提高了性能。

          我們將舉一個入庫明細的例子來說明可變數組在上面類似情況的應用。

          創建一個入庫的明細類型mingxitype:
          SQL > ? create ? or ? replace ?type?mingxitype? as ?object
          ??
          2
          ??(
          ??
          3 ?????goodsid? varchar ( 15
          ),
          ??
          4 ?????incount? int
          ,
          ??
          5 ?????providerid? varchar ( 10
          )
          ??
          6
          ??);
          ??
          7 ?? /

          創建一個基于mingxitype類型的可變數組:
          SQL > ? create ? or ? replace ?type?arrmingxitype? as ?varray( 100 )? of ?mingxitype;
          ??
          2 ?? /

          創建一個產品入庫主表:
          SQL > ? create ? table ?instock
          ??
          2
          ??(
          ??
          3 ?????orderid? int ? primary ? key
          ,
          ??
          4
          ?????indate?date,
          ??
          5
          ?????mingxi?arrmingxitype
          ??
          6 ??);

          向主表中插入數據:
          SQL > ? insert ? into ?instock? values ( 1001 ,to_date( ' 2006-1-1 ' , ' YYYY-MM-DD ' ),arrmingxitype
          ??
          2 ??(mingxitype( ' 101 ' , 10 , ' S01 ' ),mingxitype( ' 102 ' , 30 , ' S05 ' )));

          通過查詢可以查出主表instock中的字段mingxi中其實包括了一張表的內容,因為顯示出來的arrmingxitype可變數組內容比較零亂,降低了可讀性,運用PL/SQL可以讀出,但是這里我們用table()函數即可完成這個輸出修改,SQL語句如下:
          SQL > ? select ? * ? from ? table ( select ?s.mingxi? from ?instock?s? where ?orderid = 1001 );

          GOODSID????????????INCOUNT?PROVIDERID
          -- -------------?----------?----------

          101 ????????????????????? 10 ?S01
          102 ????????????????????? 30 ?S05

          這樣,通過在表中插入一個可變數組就將文中case里的問題給解決了。

          可變數組也有一定的缺陷,比如更新起來比較麻煩,因為不能更新varray中的單個元素,也就意味著,如果要去更新varray中的某個字段,需得將整個varray中的數據全部重新輸入一次,所以,可變數組在應用過程中需得慎重選擇,可以將其應用于一些平常不需要去修改數據的環境中,比如醫院里醫生開的處方歸檔資料庫等case中。
          posted @ 2006-04-13 16:18 asoka的oracle/java博客 閱讀(648) | 評論 (0)編輯 收藏

          2006年4月12日 #

          先提一下抽象數據類型的的概念,然后我們用抽象數據類型的擴展性來講述繼承在oracle中應用。

          抽象數據類型:包含一個或多個子類型的數據類型,不局限于oracle的標準數據類型,可以用于其他數據類型中
          語法:create?type?type_name?as?object(columns..)
          not?final關鍵字限制派生子類型

          先創建一個抽象數據類型對象:

          SQL > ? create ? or ? replace ?type?person? as ?object
          ??
          2
          ??(
          ??
          3 ?????personname? varchar ( 10
          ),
          ??
          4 ?????personsex? varchar ( 2
          ),
          ??
          5
          ?????personbirth?date
          ??
          6 ??)? not
          ?final;
          ??
          7 ?? /

          后面的not final表示該類型不是最終類型,是可以進行擴展的,就是后面我們繼承所需要用到的功能。

          再創建一個類型,并通過under關鍵字來對上面的類型進行擴展,也就是繼承。

          SQL > ? create ? or ? replace ?type?employeetype?under?person
          ??
          2
          ??(
          ??
          3 ?????empid? int
          ,
          ??
          4 ?????empsalary? int

          ??
          5 ??);
          ??
          6 ?? /

          通過desc employeetype查看表結構時發現,后面創建的employeetype類型已經默認繼承了person類型的屬性。

          SQL>?desc?employeetype;
          ?studenttype?extends?SCOTT.PERSON
          ?名稱??????????????????????????????????????????????????是否為空??類型
          ?
          -----------------------------------------------------?--------?-------------
          ?PERSONNAME?????????????????????????????????????????????????????VARCHAR2(10)
          ?PERSONSEX??????????????????????????????????????????????????????
          VARCHAR2(2)
          ?PERSONBIRTH????????????????????????????????????????????????????DATE
          ?EMPID?????????????????????????????????????????????????????????
          NUMBER(38)
          ?EMPSALARY?????????????????????????????????????????????????????
          NUMBER(38)

          類似的,可以將該類型應用到學生信息表、員工信息表中等類似的環境中去。

          待續....
          posted @ 2006-04-12 14:37 asoka的oracle/java博客 閱讀(453) | 評論 (0)編輯 收藏

          僅列出標題  
          主站蜘蛛池模板: 泽州县| 东丰县| 喀喇沁旗| 营山县| 延安市| 浏阳市| 湘潭市| 平昌县| 裕民县| 满洲里市| 凤翔县| 博野县| 梁山县| 神农架林区| 利辛县| 襄樊市| 景洪市| 雷山县| 锡林浩特市| 南召县| 诸暨市| 镇坪县| 遂川县| 通山县| 梁山县| 长阳| 绩溪县| 绥滨县| 深水埗区| 竹溪县| 晋州市| 开阳县| 平凉市| 襄垣县| 尉氏县| 秭归县| 凤山县| 四会市| 宾阳县| 福贡县| 彩票|