目前分類:PL/SQL (15)

瀏覽方式: 標題列表 簡短摘要

Timestamp 的操作

1. 如果原始欄位只是 DATE 或是 DATETIME, 可手動加上時區, 變成 TIMESTAMP 後, 再轉換成其他 Timezone

SELECT TO_TIMESTAMP_TZ(TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') || ' -08:00', 'YYYY-MM-DD HH24:MI:SS TZH:TZM') AT TIME ZONE 'Asia/Taipei' FROM DUAL;

* -08:00 是手動加上的時區標籤, 就依伺服器的時間自行調整

** Asia/Taipei 是我想要看到的新時區, 這邊也可以放上 +08:00 這樣的表示方式


2. 如果原始欄位已經是 TIMESTAMP

SELECT CAST(CS.DATE_FROM AS TIMESTAMP) AT TIME ZONE 'Asia/Taipei' FROM DUAL

Aloz 發表在 痞客邦 留言(0) 人氣()

今天成本結帳時, 發現有一筆 Transaction 出現在 Uncosted Material/WSM, 因為這個基本上沒出現過, 所以去了 Matelink 研究了一下

Aloz 發表在 痞客邦 留言(0) 人氣()

有時, 在 Toad 跑一些 SQL 要放日期的變數值的時候, 會遇到日期格式的問題. 

比如, 我個人偏愛的格式是 2015-01-14, 這樣的格式在我家的系統是不行的, 所以我 SQL 寫成

DATE = '2015-01-14'

它會報錯 "ORA-01861: Literal Does Not Match Format String". 然後我就必須改寫成

DATE = TO_DATE('2015-01-14', 'YYYY-MM-DD')

今天發現一種作法, "或許" 可以省掉一點麻煩

DATE = FND_DATE.CANONICAL_TO_DATE('2015-01-14')

不過前題是你要記得這一大串 XD

 

Aloz 發表在 痞客邦 留言(0) 人氣()

這幾天在研究是否可以在客製 Table 上利用 DB Trigger 直接呼叫標準 API 來用. 雖然, 可以用 Concurrent Program 來做, 了不起就排個一分鐘一次, 可是呢, 總是覺得 "一分鐘" 還是有個時間差, 而且交易量不大, 用排程的方式會造成很大量的時間都是浪費沒有交易的, 反而變成對 Server 是一個 Loading, 所以, 如果可以在當資料進來時, "馬上" 執行對應的處理程序, 不是很好嗎 :)

Aloz 發表在 痞客邦 留言(2) 人氣()

最近研究了一下 Pick Release 的做法, 總覺得, 標準畫面上有很多設定跟功能可以選擇, 為什麼用 API 就不行呢? 原來有新的做法呢!

Aloz 發表在 痞客邦 留言(0) 人氣()

最近都在做 IR/ISO Automation 的程式, 因為 Pick Release 很難去要求系統 Pick 到指定的 Lot (就目前的了解, 最多就是指定到 Subinv. 與 Locator, 如果裡面有多筆資料, 就沒辦法了), 所以就來做 Item Reservation 吧...

Aloz 發表在 痞客邦 留言(0) 人氣()

如何查詢 DB Object 的使用情況, 也就是 Dependency

1. 進入 SQL*PLUS

2. 先設定 Server Out 為 ON : SET SERVEROUT ON

3. 再輸入

BEGIN

DBMS_UTILITY.GET_DEPENDENCY('TABLE', USER, 'EMP');

END;

/

就可以看到該 DB Object 被哪些其他的 DB Object 所使用

第一個參數為該 DB Object 的類型, 例 : TABLE, VIEW, PROCEDURE

第二個參數為該 DB Object 的 Schema

第三個參數為該 DB Object 的名稱

Aloz 發表在 痞客邦 留言(0) 人氣()

有時, 我們會需要在 PL/SQL 寫一些訊息或長字串, 但是如果用到特殊字元, 就必須要做處理 (前面加上 Escape), 如果訊息長, 特殊字元又多, 那就真的很麻煩了, 這時候就可以使用 Quote Operator 了

範例 : SELECT q'#Oracle's quote operator#' FROM DUAL

q 就表示是 Quote Operator

' 就是字串範圍囉....

特別的是 ' 之後接了一個字元, 不見得要使用 #, 使用任一字元都可以, 寫成 SELECT q'COracle's quote operatorC' FROM DUAL 或 SELECT q'!Oracle's quote operator!' FROM DUAL 得到的結果都一樣

Aloz 發表在 痞客邦 留言(2) 人氣()

Oracle 9i 之後, 有一個功能叫做 Pipelined, 它是一個 Function, 可是用法與 Table 相同, 優點有 :

- 快速, 不需等查詢執行完畢,每一筆 row 直接回傳結果

- 執行效率好

- 可輕易達成複雜的邏輯需求

- 將程式 keep 在資料庫

- 可輸入變數

- 可達成 Transformation ( 行列轉置 )

簡單的範例如下 : 

Aloz 發表在 痞客邦 留言(0) 人氣()

如何將 Timestamp 格式資料, 轉換為一般常用的 Date 格式

CAST(SYSTIMESTAMP AS DATE)

Aloz 發表在 痞客邦 留言(0) 人氣()

列出比較常用的 Exception

Aloz 發表在 痞客邦 留言(1) 人氣()

123.23 => ONE HUNDRED AND TWENTY-THREE DOLLARS AND TWENTY-THREE

 

SELECT TO_CHAR(TO_DATE(TRUNC(123.23), 'J'), 'JSP') || ' DOLLARS AND ' || TO_CHAR(TO_DATE(TO_NUMBER(SUBSTR (123.23, INSTR (123.23, '.') + 1)), 'J'),'JSP')||' CENTS'
  FROM DUAL;

 

但是, 如果小數位數大於兩位, 結果會回傳阿拉伯數字....


@20160913

有朋友發現太大的數字會出現錯誤訊息:

ORA-01830: date format picture ends before converting entire input string

參考下方的連結, 其中說明到這個方式只能處理到 5373484.

http://viralpatel.net/blogs/convert-number-into-words-oracle-sql-query/

如果需要處理更大的數字, 就必須使用 Function 來處理, 一樣可參考連結中的做法 :)

 

Aloz 發表在 痞客邦 留言(1) 人氣()

每次突然要用什麼函數, 都要上 Google 去找, 乾脆整理起來

不然每次都忘記要重找

 

Aloz 發表在 痞客邦 留言(1) 人氣()

DENSE_RANK() OVER(PARTITION BY XXX, YYY ORDER BY ZZZ )

RANK() OVER(PARTITION BY XXX, YYY ORDER BY ZZZ )

 

如果資料有 10, 10, 10, 20, 20, 30, 40...

用 DENSE_RANK() 會排出:1, 1, 1, 2, 2, 3, 4

用 RANK() 會排出:1, 1, 1, 4, 4, 6, 7

 

Aloz 發表在 痞客邦 留言(0) 人氣()

原本只知道 NVL 這個 Function, 可是當我有三個欄位需要判斷時就會很麻煩

NVL ( NVL ( A, B ), C )

上網 Google 了一下, 找到了 Coalesce

Coalesce ( A, B, C )

http://www.1keydata.com/sql/sql-coalesce.html

Aloz 發表在 痞客邦 留言(1) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼