顯示具有 My Oracle DB Package 標籤的文章。 顯示所有文章
顯示具有 My Oracle DB Package 標籤的文章。 顯示所有文章

Oracle PL/SQL "N 進位" 與 "十進位" 的互轉 (如: 36 進位的 000Z 下一個數值為 0010)


在 Oracle PL/SQL 中, 如何實現 "N 進位" 與 "10 進位" 的互轉呢 ?

如: 16 進位與 10 進位互轉,

如: 36 進位與 10 進位互轉,

首先, 先建立一個轉換函數, 程式碼如下:
 程式碼
create or replace function tomkuoConvertNumber( p_original_str varchar2     -- N 進位資料 (N 進位與十進位, 兩者資料擇一)
, p_original_num number -- 十進位資料 (N 進位與十進位, 兩者資料擇一)
, p_num_digital number := 16 -- 多少進位
, p_code_len number := 5 -- 資料長度 (資料不足時, 前面自動補 0)
, p_num_type number := 1 -- 1: N 進位轉 10 進位
-- 2: N 進位轉 N 進位
-- 3: 10 進位轉 N 進位

, p_add_value number := 0 -- 加多少值
) return varchar2
is
v_original_str varchar2(10) := p_original_str; -- N 進位資料
v_original_num number := p_original_num; -- 十進位資料
v_code_len number := p_code_len; -- 資料長度
v_num_digital number := p_num_digital; -- 多少進位

v_original_str_len number;
v_new_data_m number;
v_new_data_d number;
v_chr varchar2(1);
v_new_data varchar2(10) := '';
v_run boolean := true;
begin

-- "N 進位資料" 與 "十進位資料" 不能同時沒有
IF p_original_str is null AND p_original_num is null THEN
return 'Error: N 進位與十進位, 兩者資料擇一';
END IF;

-- "N 進位資料" 與 "十進位資料" 不能同時有
IF p_original_str is not null AND p_original_num is not null THEN
return 'Error: N 進位與十進位, 兩者資料擇一';
END IF;

-- "N 進位資料" 若要轉換, 則必須提供 "N 進位資料"
IF (p_num_type = 1 or p_num_type = 2) AND p_original_str is null THEN
return 'Error: 請提供 N 進位資料';
END IF;

-- "10 進位資料" 若要轉換, 則必須提供 "10 進位資料"
IF p_num_type = 3 AND p_original_num is null THEN
return 'Error: 請提供 10 進位資料';
END IF;

-- 將 N 進位轉換成 10 進位
IF p_num_type = 1 or p_num_type = 2 THEN

-- 原資料長度
v_original_str_len := lengthb(p_original_str);

-- 十進位值先歸零
v_original_num := 0;

-- 轉換
v_run := true;
for i in 1..v_original_str_len loop
v_chr := substr( v_original_str, i, 1 );

if ASCII(v_chr) > 55 then
v_original_num := v_original_num + (ASCII(v_chr) - 55) * power( v_num_digital, v_original_str_len - i);
else
v_original_num := v_original_num + to_number(v_chr) * power( v_num_digital, v_original_str_len - i);
end if;
end loop;

dbms_output.put_line( 'v_original_num 十進位 = ' || v_original_num );
END IF;

-- 加多少值
v_original_num := v_original_num + p_add_value;

-- 將 10 進位轉換成 N 進位
IF p_num_type = 2 or p_num_type = 3 THEN
v_run := true;
while v_run loop

-- 取得分母與分子
v_new_data_m := floor(v_original_num / v_num_digital);
v_new_data_d := mod( v_original_num, v_num_digital );

-- 若分子 >= 10, 則轉換成 A
-- 串接前面資料

if v_new_data_d < 10 then
v_new_data := v_new_data_d || v_new_data;
else
v_new_data := chr( v_new_data_d + 55 ) || v_new_data;
end if;

-- 若分母 = 0, 則表示轉換完成, 否則繼續轉換之
if v_new_data_m = 0 then
v_run := false;
else
v_original_num := v_new_data_m;
end if;
end loop;

-- 不足長度補零
v_new_data := lpad( v_new_data, v_code_len, '0' );
ELSE
v_new_data := v_original_num;
END IF;

-- 顯示結果
dbms_output.put_line( 'v_new_data = ' || v_new_data );

return v_new_data;
end;

然後, 參考下面的應用範例 :
 範例程式碼
select tomkuoConvertNumber( '001F', null, 16, 4, 1, 0 ) from dual;
-- 001F 的 16 進位轉換成 10 進位
-- 結果: 31


select tomkuoConvertNumber( '001F', null, 16, 4, 2, 1 ) from dual;
-- 001F + 1 的 16 進位
-- 結果: 0020


select tomkuoConvertNumber( '001F', null, 36, 4, 1, 0 ) from dual;
-- 001F 的 36 進位轉換成 10 進位
-- 結果: 51


select tomkuoConvertNumber( '001F', null, 36, 4, 2, 1 ) from dual;
-- 001F + 1 的 36 進位
-- 結果: 001G


select tomkuoConvertNumber( '001Z', null, 36, 4, 1, 0 ) from dual;
-- 001Z 的 36 進位轉換成 10 進位
-- 結果: 71


select tomkuoConvertNumber( '001Z', null, 36, 4, 2, 1 ) from dual;
-- 001Z + 1 的 36 進位
-- 結果: 0020


select tomkuoConvertNumber( null, 12345, 16, 4, 3, 0 ) from dual;
-- 12345 的 10 進位轉換成 16 進位
-- 結果: 3039


select tomkuoConvertNumber( null, 12345, 16, 4, 3, 1 ) from dual;
-- 12345 + 1 的 10 進位轉換成 16 進位
-- 結果: 303A


select tomkuoConvertNumber( null, 12345, 36, 4, 3, 0 ) from dual;
-- 12345 的 10 進位轉換成 36 進位
-- 結果: 09IX


select tomkuoConvertNumber( null, 12345, 36, 4, 3, 1 ) from dual;
-- 12345 + 1 的 10 進位轉換成 36 進位
-- 結果: 09IY


Oracle ERP 電子表單 (eForm 無紙化 & 線上簽核)

對於 Oracle ERP 如何實現 eForm 線上簽核無紙化作業,

主要有以下幾個重點事項 :

1) 整體流程介紹

2) Mail 介紹

3) 簽核介紹

4) 使用者管理介面介紹

5) 一般簽核流程的設定

6) 流向內的申請者

7) 申請者與最後簽核者

8) 申請者重複的設定

9) 流程載入 Employee 架構

10) Copy 某個簽核流程的資料

11) 簽核項目的設定

12) Timeout 設定

13) 附檔的設定

14) 會簽的設定

15) Treeview 簽核結構的展示

16) 快速更換使用者

17) 報表 FTP 到 File Server

18) 電子簽章與報表轉 PDF

19) 每階段與結案的處理設定

20) 批次簽核 (整批簽核)

21) 批次列印 (整批列印)

22) Oracle ERP 報表的客制處理

23) Oracle ERP 報表針對廠別 / 事業處 / 帳本導入電子表單

24) 由分到合的簽核流程

25) 電子表單與系統的整合

26) 電子表單與 Web 的整合

27) 電子表單與外部系統的整合

28) 電子表單的效益估算

29) Oracle ERP Standard Flow 的功能擴充

Oracle ERP Standard Alert 改良版 - Graphic Alert


針對 Oracle ERP Alert 設定不夠快速, 功能不足與不美觀的部份, 進行改良, 如下 :

. Alert 發送 HTML Mail, 整齊規則美觀

. Alert HTML Mail 完全不用編排

. Alert HTML Mail 沒有亂碼問題

. Alert HTML Mail 也可有 Excel 附檔

. Alert 可以將 Excel 檔案上傳到 FTP Server

. Alert 會回傳 Excel 檔案名稱, 以利做後續處理

. Alert 可以有多段 Select SQL 語法, 輸出多段結果

. Alert 可以判斷不同條件, 產生不同的結果, 來發送給不同收件者

. 只需設定好資料 (含 Select SQL), 其餘工作交由 DB Package 實現:發送 Email, 產生 Excel, 透過 FTP 傳送檔案到 File Server

. 核心是一個 DB Package, 所以除前端設定作業外, 不限 Oracle ERP, 任何系統皆可搭配使用

Oracle ERP 資料與 File Server 檔案的關聯 (with FTP)

投影片, 目前只限站長瀏覽, Sorry :
. 支援中文檔名與路徑
. FTP Server 目錄若不存在, 則自動建立之
. Oracle ERP 顯示 FTP Server 檔案列表, 且可下載之

最新版 (2010-01-13):


最初版 (2009-08-06)

Oracle Select SQL to Excel, Mail, FTP

投影片, 目前只限站長瀏覽, Sorry :

Oracle Send Mail

投影片, 目前只限站長瀏覽, Sorry :
. 支援 中文
. 支援 HTML 語法
. 支援 優先權
. 支援 多人收件者, Cc, Bcc
. 支援 超過 32k 的 Mail 內容
. 支援 多個檔案附檔
. 支援 多個 DB LOB 附檔
. 支援 Mail 備援機制
. 支援 Outlook, Thunderbird, Yahoo Kimo 等可正常顯示

最新版 (2010-03-04):


最初版 (2002-10-12):

Oracle ERP 萬用編碼原則

投影片, 目前只限站長瀏覽, Sorry :

Single Sign On 單一帳密, 單次登入機制

投影片, 目前只限站長瀏覽, Sorry :

Send Mail on Oracle PL/SQL - 最終 Final 版

這次是 Send Mail on Oracle PL/SQL - 最終 Final 版

Send Mail 第一期 : 點選此處.

Send Mail 第二期 : 點選此處.

Send Mail 第三期 : 點選此處.

集合前三期, 這次不再講如何撰寫程式碼,

而是直接說明有哪些功能可用, 如下 :

1) 最基本功能


 範例
DECLARE
V_MESSAGE VARCHAR2(1000);
BEGIN
v_message := 'Hello 歡迎光臨';

XXFND_MAIL.SEND ( 'tomkuo139@yahoo.com.tw'
, ''
, ''
, 'Send 中文 Mail on PL/SQL'
, V_MESSAGE
);
END;


2) Mail Address 換成別名


 範例
DECLARE
V_MESSAGE VARCHAR2(1000);
BEGIN
v_message := 'Hello 歡迎光臨';

XXFND_MAIL.SEND ( 'abc <tomkuo139@yahoo.com.tw>'
, ''
, ''
, 'Send 中文 Mail on PL/SQL'
, V_MESSAGE
);
END;


3) 發送 Mail 給多人


 範例
DECLARE
V_MESSAGE VARCHAR2(1000);
BEGIN
v_message := 'Hello 歡迎光臨';

XXFND_MAIL.SEND ( 'tomkuo139@yahoo.com.tw, tom<tomkuo139@yahoo.com.tw>, aaa<tomkuo139@yahoo.com.tw>'
, ''
, ''
, 'Send 中文 Mail on PL/SQL'
, V_MESSAGE
);
END;


4) 具有 Cc, Bcc


 範例
DECLARE
V_MESSAGE VARCHAR2(1000);
BEGIN
v_message := 'Hello 歡迎光臨';

XXFND_MAIL.SEND ( 'tomkuo139@yahoo.com.tw'
, 'tom<tomkuo139@yahoo.com.tw>'
, ''
, 'Send 中文 Mail on PL/SQL'
, V_MESSAGE
);
END;


5) Mail Body 顯示 HTML


 範例
DECLARE
V_MESSAGE VARCHAR2(1000);
BEGIN
v_message := 'HTML 語法';

-- 若要給別名, 則規則如右 : Alias , 否則 Alias = Mail-Address
XXFND_MAIL.SEND ( 'tom <tomkuo139@yahoo.com.tw>'
, 'chris <tomkuo139@yahoo.com.tw>'
, ''
, 'Send 中文 Mail on PL/SQL'
, V_MESSAGE
);
END;


6) Mail 將 "實際檔案" 當作附檔


 範例
DECLARE
File_id UTL_FILE.FILE_TYPE;
v_attach_file XXFND_MAIL.GF_FILE;
BEGIN
v_attach_file(1).file_path := '/usr/tmp';
v_attach_file(1).file_name := 'aaa.txt';

-- 建立 File Object
File_id := UTL_FILE.FOPEN(v_attach_file(1).file_path
, v_attach_file(1).file_name
, 'W'
);

-- 寫入資料並換行
UTL_FILE.PUT_LINE(File_id, '哈囉 Oracle ERP 1 !!');
UTL_FILE.PUT_LINE(File_id, '哈囉 Oracle ERP 2 !!');
UTL_FILE.PUT_LINE(File_id, '哈囉 Oracle ERP 3 !!');

-- 寫入資料但不換行
for i in 0..9 loop
UTL_FILE.PUT( File_id, to_char(i) );
end loop;

-- 釋放物件
UTL_FILE.FCLOSE(File_id);

-- Send Mail
XXFND_MAIL.SEND( 'tom <tomkuo139@yahoo.com.tw>'
, ''
, ''
, 'Send 中文 Mail on PL/SQL with Attachment'
, '可以有附檔功能喔 !!'
, true
, v_attach_file
);
END;


7) Mail 將 "Blob 資料" 當作附檔


 範例
DECLARE
v_attach_blob XXFND_MAIL.GB_BLOB;
BEGIN
-- 抓取 Blob 資料
SELECT 'aaa.txt'
, blob_col
INTO v_attach_blob(1).blob_name
, v_attach_blob(1).blob_body
FROM TOM1
WHERE num_col = 1;

-- Send Mail
XXFND_MAIL.SEND( 'tom <tomkuo139@yahoo.com.tw>'
, ''
, ''
, 'Send 中文 Mail on PL/SQL with Attachment'
, '可以有附檔功能喔 !!'
, true
, v_attach_blob
);
END;


完整敘述如下 :

1) 收件者可以有多個, 用 "逗號" or "分號" 區隔

2) 收件者可以有中文顯示, 用 名稱 表示 (請見 Example 範例)

3) 可以指定 Cc, Bcc

4) 可以指定 郵件的優先權

5) Mail Body 可以有圖片顯示

6) Mail Body 可以顯示 HTML

7) Mail Body 可以超過 32k 限制

8) Mail 可有附檔, 多個附檔用 "Array" 區隔

9) Mail 也可將 Blob 資料當作附檔, 多個 Blob 附檔用 "Array" 區隔

10) 跨 Mail 收件軟體, Outlook / Outlook Express / ThunderBird / Yahoo Mail 都可正常收信

當然, 也感謝眾多朋友不斷告知需求與功能改善, 才會讓 Send Mail 愈來愈完善.
Related Posts Plugin for WordPress, Blogger...