﻿# Oracle 開發筆記

**Oracle 物件的命名限制**

> 任何物件的名稱不得超過 30 位元(Bytes)

**Oracle 的 dummy query 寫法**

> SELECT SYSDATE FROM **dual**

**Oracle 選取部分資料的方法**

> SELECT \* FROM table WHERE ROWNUM<10; /\* 取出前 10 筆 \*/
> 
> [實現 Oracle 上的分頁顯示 \[精華\]](http://www.javaworld.com.tw/jute/post/view?bid=21&id=52022&sty=1&tpg=1&age=-1)

**Oracle 轉換成數值的方法**

> to\_number('<string>')
> 
> to\_number(null)  => 0

**Oracle 日期欄位轉字串的方法**

> TO\_CHAR(<date>, '<format>')
> 
> [http://infolab.stanford.edu/~ullman/fcdb/oracle/or-time.html](http://infolab.stanford.edu/~ullman/fcdb/oracle/or-time.html)
> 
> 範例：  
> SELECT TO\_CHAR(b, 'YYYY/MM/DD') AS b FROM x;

**Oracle 字串轉日期欄位的方法 ( Oracle 寫入日期的方法 )**

> TO\_DATE(<string>, '<format>')
> 
> 範例：  
> TO\_DATE('2006/8/29', 'YYYY/MM/DD')

**Oracle 取得目前時間的作法**

> SYSDATE

**Oracle 針對日期操作的方法**

> 比對 DATE 欄位時，可以使用標準的數值比對運算元，例如：=, !=, >, 等等。
> 
> 你可以針對 DATE 欄位直接所相減的動作，結果會回傳 FLOAT 格式，其數值是兩個日期的天數。一般來說，相減後的數值結果會有小數點，因為 DATE 欄位格式包含「時間」的成分。因此，兩個日期欄位的「相加」、「相乘」、「相除」都是不允許的！
> 
> 但是，日期(DATE)欄位可以跟「數值」欄位「相加」或「相減」，其「數值」所代表的意義是「相差的天數」，所以 SYSDATE + 1 的意思就是「明天」的意思。但日期欄位不能跟數值欄位「相乘」或「相除」。
> 
> 日期欄位可以透過 TO\_CHAR 函數的轉換變成「純字串」，這樣一來就可以用「字串函數」比對日期的格式了。例如：to\_char(<date>, 'DD-MON-YY') like '%JUN%' 就可以比對出該日期是否在「六月(JUN)」。
> 
> **2009-10-14 更新**：這裡有一篇完整的日期操作文章: [Oracle時間日期操作](http://blog.udn.com/abnerming/2027299)

**建立 TRIGGER 指令注意事項**

> SQL 語法的最後面一定要加上分號(;)結尾

**ASP 開發注意事項**

>  透過 ASP 執行 SQL 不能有「分號 ( ; )」結尾

**取出所有 Oracle 的 Data Dictionary**

> SELECT \* FROM DICTIONARY
> 
> Select \* From dictionary Where TABLE\_NAME LIKE 'ALL\_%'  
> Select \* From dictionary Where TABLE\_NAME LIKE 'DBA\_%'  
> Select \* From dictionary Where TABLE\_NAME LIKE 'USER\_%'

**取出所有表格的欄位定義 ( Columns of user's tables, views and clusters )**

> SELECT \* FROM ALL\_TAB\_COLUMNS WHERE TABLE\_NAME LIKE '%FORUM%'
> 
> SELECT \* FROM USER\_TAB\_COLUMNS

**取得所有 SEQUENCE**

> select \* from USER\_SEQUENCES

**取得所有 VIEWS**

> select \* from USER\_VIEWS

**取得所有 INDEXES**

> SELECT \* FROM USER\_INDEXES
