go to http://oracle.in.th

Friday, November 13, 2009

[news] ทำไม แลรี่ย์ ถึงโต้ EU บอกให้ข่าวลมๆแล้งๆ

ทำไมแลรี่ย์แห่ง Oracle ถึงโต้ EU บอกให้ข่าวลมๆแล้งๆ

Larry Ellison

แลรี่ย์ ต้องการที่จะต่อสู้อย่างสมบูรณ์แบบกับ IBM ฉะนั้นเขาจำเป็นที่จะต้องได้ Sun เพื่อมาร่วมต่อสู้ในครั้งนี้ แต่ในส่วนทางคณะกรรมการของสหภาพยุโรป ก็ยังยืนกรานในทางของตนที่จะให้ Oracle ถอดถอนการซื้อ Sun

...มันเป็นส่วนหนึ่งเพราะว่าสหภาพยุโรป ไม่รู้เรื่องราวที่แท้จริงและยังมีความทะนงตน
...อีกส่วนนึง เป็นเพราะ แลรี่ย์ ได้ทุ่มไปมากในครั้งนี้ ทั้งเงิน และ ทั้งเวลา
...และยังเป็นเพราะ แลรี่ย์ต้องการที่จะครบครอง Sun ก่อนที่ Sun จะเลิกจ้างพนักงานหลายพันคน เนื่องจากความกดดันของคณะกรรมการของสหภาพยุโรป

แต่ข้อเท็จจริง มาจากคำพูดของแลรี่ย์เอง นั่นคือ เขายอมจะแลกชีวิต เพื่อได้ต่อสู้กับ IBM อย่างถึงที่สุด และการที่จะทำเช่นนั้นได้ เขาจำเป็นต้องมี Sun และคณะกรรมการของสหภาพยุโรปที่เป็นไปตามทางที่เขาต้องการ (ผ่าน EU)

แน่ใจได้เลยว่า Oracle ได้อ้างต่อสาธารณชนว่า เจ้าหน้าที่คณะกรรมการของสหภาพยุโรป ได้แสดงให้เห็นว่า "มีการเข้าใจผิดทั้งทางด้าน การแข่งขันทางด้านฐานข้อมูลและการเปลี่ยนแปลงฐานข้อมูลโอเพ่นซอร์ส" ซึ่งความเข้าใจผิดเหล่านี้ ทำให้แลรี่ย์ยิ่งขุ่นเคืองไปกันใหญ่

และก็เป็นที่แน่นอนเหมือนกันว่า Sun ก็ตกอยู่ในสภาวะขาดแคลน ไม่เพียงแต่ บุคลากรเท่านั้น รวมไปถึง รายได้ที่สูญเสียไป 100 ล้านเหรียญต่อเดือน ซึ่งครั้งนี้ เป็นการท้าทายทางเศรษฐกิจอย่างมาก โดยเฉพาะอย่างยิ่ง การรวมตัวของ Sun และ Oracle ควรได้ได้ผลที่ดีขึ้น เพื่อมาต่อกรกับคู่แข่งที่น่ากลัวอย่าง HP IBM และ Dell แต่ในความจริงที่ว่า แลรี่ย์ ไม่เพียงเป็นผู้ที่มี ผู้แข่งขันมากที่สุดโลกแล้ว แต่ยังเป็นหนึ่งในบริษัทที่ประสบความสำเร็จมากที่สุดอีกด้วย ดังนั้นเขาน่าจะจัดการกับสิ่งเหล่านี้ได้

สี่เรื่องสำคัญที่แลรี่ย์ได้กล่าวไว้...

1) Sun's broad technologies

2) MySQL, a fine intermediate-sized database that the EC sophisticates are absurdly conflating with giant commercial systems;

3) IBM and the one-time reverence Ellison felt for it, which have morphed in his view into the Great White Whale he must conquer; and

4) Ellison's views on competition, and the role that most animating of forces has played in his life.

...เราคงต้องติดตามต่อไปว่า แลรีย์ จะสามารถนำ Oracle ผ่านคณะกรรมการของสหภาพยุโรปได้หรือไม่

อ้างอิง
ข้อเขียนนี้ช่วยฉัน:  

Thursday, November 12, 2009

5 วิธีที่ทำให้ Javascript เร็วขึ้น

ไม่พูดพร่ำทำเพลงไปดู 5 วิธีนี้เลยครับ

1. ใช้วิธีบีบอัด file ด้วย compressor

การใช้ composser ในที่นี้คือการนำ file javascript ที่มีอยู่ ไปให้ "JS Compressor" กรองคำต่าง ๆ เหล่านี้ออกไปเช่น white space, comment หรืออื่น ๆ การบีบอัดนี้จะทำให้ขนาด file ของ javascript ลดลงได้มากถึง 50% ผลที่ตามมาคือช่วยให้การโหลด javascipt เร็วขึ้น "ตัว JS Compresor" ที่แนะนำคือ JSMin จะให้ดูการทำงานของ compressor คร่าว ๆ ดังนี้

source code ที่ยังไม่บีบอัด
// is.js

// (c) 2001 Douglas Crockford
// 2001 June 3

// is

// The -is- object is used to identify the browser.  Every browser edition
// identifies itself, but there is no standard way of doing it, and some of
// the identification is deceptive. This is because the authors of web
// browsers are liars. For example, Microsoft's IE browsers claim to be
// Mozilla 4. Netscape 6 claims to be version 5.

var is = {
ie:      navigator.appName == 'Microsoft Internet Explorer',
java:    navigator.javaEnabled(),
ns:      navigator.appName == 'Netscape',
ua:      navigator.userAgent.toLowerCase(),
version: parseFloat(navigator.appVersion.substr(21)) ||
parseFloat(navigator.appVersion),
win:     navigator.platform == 'Win32'
}
is.mac = is.ua.indexOf('mac') >= 0;
if (is.ua.indexOf('opera') >= 0) {
is.ie = is.ns = false;
is.opera = true;
}
if (is.ua.indexOf('gecko') >= 0) {
is.ie = is.ns = false;
is.gecko = true;
}
source code ที่ผ่านการบีบอัดแล้ว
var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}
2. พยายามที่จะลด file .js ลง อันไหนรวมกันได้ก็รวมกันไป

การเรียก file .js หนึ่ง file เข้ามาในหน้า web page จะเกิด http request ขึ้นหนึ่งครั้งต่อหนึ่ง file ลองคิดดูว่าถ้าในหน้า web page นั้นมีการอ้างถึง file .js หลายๆ file แสดงว่าต้องเกิด http request ขึ้นอีกหลายอัน ดังนั้น file .js ตัวไหนนั้น สามารถรวมกันเป็น file เดียวได้ก็ให้รวมกัน แต่ไม่ใช่ว่าจะเอาทุก .js ไปรวมกันเป็น file เดียวเพราะว่าอาจจะทำให้ file ตัวนั้นใหญ่เกินไปทำให้การเรียกนั้นก็ช้าลง

3. ลองใช้ tool พวก profiler และ tool ที่ใช้วัดเวลาการทำงานของ java script เรา

tool พวกนี้ที่จะแนะนำคือ Firebug ซึ่งเป็น plugin เสริมของ filefox นั้นเองผมว่า web developer ทุกคนคงมีกันอยู่แล้ว เจ้าตัวนี้สามารถ debug javascript ได้ด้วย ให้ลองตรวจดูว่า script ที่เราเขียนบางที่อาจจะรันได้จริง แต่ว่าทำงานช้าไปหรือเปล่า ลองให้ Firebug ตรวจดูว่ามันเป็นที่ตรงไหน แล้วเราจึงไปปรับปรุงแก้ไข code ตรงนั้น

4. การทำ asynchronize ให้กับ code javascript

ปกติแล้ว browser นั้น run javascript เป็นแบบ synchronously ในที่นี้คือหมายถึงว่า เมื่อ browser เจอ tag <script> การทำงานทุกๆสิ่งใน web page นั้นจะถูกหยุดไป จนกระทั่ง browser นั้นทำงาน tag <script> เสร็จ

แต่ถ้าหากว่าใน tag <script> เกิดมี code javascript ที่มีการทำงานที่นานขึ้นมา แสดงว่าส่วนอื่นนั้นจะไม่มีทางโหลดขึ้นมาได้เลย ดังนั้นเราควรที่จะเขียนให้ javascript เราเป็นแบบ asynchronize เพื่อที่จะไม่จำเป็นต้องรอให้ code javascript นั้นทำงานเสร็จก่อน ก็ให้ไปทำงานส่วนอื่น ๆ พร้อมกันเลย

การเขียนอย่างนี้เราจะใช้ function setTimeout() เข้ามาช่วย คือ setTimeout จะเรียก function ของ javascript ขึ้นมาทำงานในตามเวลาที่กำหนด และถ้ามีส่วนอื่นที่ทำงานอยู่ เมื่อถึงเวลามันก็จะทำงานไปพร้อมกับส่วนนั้นไป ซึ่งจะเห็นได้ว่าถ้าเราเอา setTimeout() เข้ามาช่วย browser ก็จะได้ไม่ต้องรอให้ function ที่ถูกเรียกธรรมดาทำเสร็จ ก็สามารถทำงานในส่วนต่อได้

ตัวอย่างการเรียก function แบบ asynchronize
function testfunc()
{
var x1="test1";
var x2="test2";

alert(x1+x2);
}
testfunc(); //normal way to execute the function
window.setTimeout(testfunc,0); //asynchronous execution of testfunc()

5. ควรระวังในการอ้างถึง DOM variable

เป็นที่รู้กันอยู่แล้วว่าการ binding ใน javascript มันช้า ดังนั้นการเขียน code ที่จะเข้าไป access ถึง IE DOM เมื่อเราเรียกในแต่ละครั้ง มันจะไป search เข้าไปในแต่ละ element ว่าเจอ DOM ที่เราต้องการเรียกหรือเปล่า ซึ่งถ้าใน element นั้นมี sub element ก็จะเข้าไปเรื่อย ๆ จนครบทุกส่วนใน element จึงไปยัง element ต่อไป ถ้า element เยอะก็จะช้าด้วย ดังนั้นการอ้างถึง DOM variable แต่ละครั้งนั้น ควรที่จะเรียกใช้อยากระมัดระวัง จะยกตัวอย่างที่เรียกใช้ DOM variable ที่ไม่ดีและที่ดีให้ดู

การเรียกใช้ DOM variable ที่ไม่ดี
function buildString()
{
var newElement = document.getElementById("myitem");
newElement.innerHTML = ""; // Clear out the previous
newElement.innerHTML += addHeader();
newElement.innerHTML += addBody();
}
การเรียกใช้ DOM variable ที่่ดี
function buildString()
{
var newText = addHeader() + addBody();
document.getElementById(”myitem”).innerHTML = newText;
}

อ้่างอิง
ข้อเขียนนี้ช่วยฉัน:  

Wednesday, November 11, 2009

Google App Engine บน iPhone

มีเครื่องมือหนึ่งที่ช่วยให้เราพัฒนา Application ของเราให้แสดงบน iPhone ได้ในรูปแบบที่สวยงาม ชื่อว่า iWebkit โดยมีวิธีการง่ายๆดังนี้
  1. สร้างโปรเจค Web Application Project บน Eclipse ขึ้นมาใหม่ ถ้าหากมีโปรเจคอยู่แล้วก็ให้เปิดโปรเจคที่ต้องการให้แสดงผลบน iPhone ได้ ขึ้นมา

  2. ดาวโหลด iWebKit เวอร์ชั่นล่าสุดจาก http://iwebkit.net/download
  3. จะได้ไฟล์ที่ชื่อ iwebkit x.x.x (x คือเลขเวอร์ชั่น) มา ให้แตกไฟล์แล้วจะเห็นไฟล์ดังรูป
  4. ทำการคัดลอกโฟลเดอร์ css, images, javascript, และ thumbs ที่อยู่ใน iWebKit_x.x.x/Framework ไปใส่ในโปรเจคของเราที่ war/. ดังรูป
    1. ทำการแก้ไขโค๊ด html ของเรา (war/index.html) ให้เป็นรูปแบบ html ของ iWebKit ซึ่งดูรูปแบบคำสั่งได้จากไฟล์ iWebKit_x.x.x/UserGuide.pdf และดูตัวอย่างได้จาก iWebKit_x.x.x/Demo/index.html
    2. หากต้องการดูผลรันApplication ให้ดูผ่าน Web Browser ที่ชื่อ Safari ซึ่งดาวโหลดได้จาก http://www.apple.com/safari/download/ ซึ่งจะแสดงผลคล้าย iPhone มากกว่า Web Browser ตัวอื่น หรือจะทำการ Deploy ไปที่ Google แล้วค่อยดูผ่านเครื่อง iPhone จริงๆก็ได้
    ข้อเขียนนี้ช่วยฉัน:  

    Tuesday, November 10, 2009

    [Event] ภาพบรรยากาศ "Turbo Charge for Your Database Environment" By Sun Microsoft

    เมื่อวันศุกร์ที่ 6 พฤศจิกายน ที่ผ่านมา ทาง ซัน ไมโครซิสเต็มส์ ได้มีการจัดสัมมนาในหัวข้อเรื่อง "Turbo Charge for Your Database Environment" ที่โรงแรมอินเตอร์คอนติเนนตัล ในสัมมนาครั้งนี้ ทาง Sun ได้เปิดตัวผลิตภัณฑ์ใหม่ นั่นคือ Sun Storage F5100 Flash Array ระบบแรกของโลกที่ใช้งานแฟลชสตอเรจอย่างสมบูรณ์แบบ เพื่อการใช้งานที่มั่นคงในระดับองค์กร นวัตกรรมแห่งอนาคตที่จะเข้ามาปฏิวัติวงการเซิร์ฟเวอร์ ด้วยระบบหน่วยความจำแฟลชแบบมาตราฐานเปิดแบบแรกของโลก ซึ่งมาพร้อมกับประสิทธิภาพ ทั้งในด้านความเร็วในการตอบสนองของแอพลิเคชันที่เหนือกว่าทุกเทคโนโลยี และการออกแบบที่เน้นความเรียบง่าย ตลอดจนการประหยัดค่าใช้จ่ายอีกด้วย


    ในการสัมมนาครั้งนี้ิ Sun ได้แบ่งเป็น 5 sessions ด้วยกัน นั่นคือ
    • Unveiling Sun Flash - Enabled Storage
    • Latest Sun Storage F5100 - The World's Fastest Solid State Flash Array
    • Flash Cache in Oracle Database
    • Enhanced Your Data Protection with SSD Technology
    • Open Storage Momentum
    Sun Storage F5100 Flash Array เป็นระบบที่ใช้งานแฟลชสตอเรจอย่างสมบูรณ์แบบ ภายใต้การออกแบบเป็นพิเศษ สำหรับการใช้งานเต็มความสามารถกับระบบฐานข้อมูล Oracle และ MySQL ด้วยความเร็วกว่า 10 เท่า พร้อมประหยัดค่าใช้จ่ายกว่าฮาร์ดดิสก์กว่า 80% นอกจากนี้ Sun F5100 Flash Array ยังมาพร้อมหน่วยความจำแบบแฟลชถึง 2 เทราไบต์ จึงสามารถสร้างความเร็วด้วยการอ่าน 1.6 ล้านครั้ง และเขียน 1.2 ล้านครั้ง แบบ IOPS ด้วยขนาดแร็คยูนิตเดียว (1.75 นิ้ว) แต่ใช้พลังงานเพียง 300 วัตต์ ด้วยประสิทธิภาพเทียบเท่าฮาร์ดดิสก์ระดับองค์กรถึง 3,000 ลูก ที่ติดตั้งกินเนื้อที่ 14 แร็คในศูนย์ข้อมูล


    โดยทาง Sun ได้เชิญวิทยากร ของ Oracle มาพูดเรื่อง Flash Cache in Oracle ซึ่งบรรยายเกี่ยวกับ Sun Storage F5100 Flash Array ตัวนี้ มีส่วนช่วยใน Oracle ด้านใดบ้าง และช่วยทำ Tuning ได้มากแค่ไหน นอกจากนี้ วิทยากร ยังบรรยายถึงการใช้งาน Flash Array อย่างละเอียด


    ในตอนท้ายของการสัมมนา Sun ได้เชิญวิทยากรของ Symantec มาบรรยายถึงการทำ Backup Recovery บน Virtual Machine ด้วยการใช้ Deduplication อีกด้วย

    อ้างอิง
    ข้อเขียนนี้ช่วยฉัน:  

    Friday, November 6, 2009

    การติดตั้ง Google App Engine และ Google Plugin สำหรับ Eclipse

    1. เริ่มต้นด้วยการดาวน์โหลด "Java SE Development Kit (JDK)" และติดตั้งลงในเครื่อง โดย Google App Engine จะรองรับกับ Java 5 และ Java 6 เท่านั้น

    2. จากนั้นให้ทำการดาวน์โหลดโปรแกรม Eclipse จาก "http://www.eclipse.org/" และติดตั้งลงในเครื่อง

    3. ดาวน์โหลด Google Plugin for Eclipse โดยจะมี Plugin สำหรับ Eclipse อยู่ 3 เวอร์ชั่น คือ 3.3, 3.4 และ 3.5 โดยสามารถดาวน์โหลด Plugin สำหรับเวอร์ชั่นต่างๆ จากลิงค์ด้วยล่าง

    - The Google Plugin for Eclipse, for Eclipse 3.3 (Europa):

    http://dl.google.com/eclipse/plugin/3.3

    - The Google Plugin for Eclipse, for Eclipse 3.4 (Ganymade):

    http://dl.google.com/eclipse/plugin/3.4

    - The Google Plugin for Eclipse, for Eclipse 3.5 (Galileo):

    http://dl.google.com/eclipse/plugin/3.5

    4. ทำการติดตั้ง App Engine Java SDK โดยใช้ โปรแกรม Eclipse โดยไปที่ เมนู Help > Install New Software
    Step 4 - Install

    5. ในช่อง Work with ให้ใส่ location สำหรับเวอร์ชั่น 3.5 ให้ใส่ “http://dl.google.com/eclipse/plugin/3.5” ดังรูป

    Step 5 - Add location

    6. จากนั้นให้ Enable Check Box ที่ Plugin และ SDKs จากนั้น Click Next รอจนโปรแกรมทำการดาวน์โหลดและติดตั้งจนเสร็จแล้ว Click Finish

    Step 6 - Enable Plugin Check Box

    อ้างอิง
    ข้อเขียนนี้ช่วยฉัน:  

    Wednesday, November 4, 2009

    การแก้ปัญหา Oracle Reports ให้ใช้งาน PDF ภาษาไทยได้

    ปัญหานึงที่ผมมักจะเจอจากลูกค้าและ partner ออราเคิลบ่อย ๆ
    ก็คือเรื่องการแสดงผลภาษาไทยบน Oracle Reports แบบ PDF

    วันนี้ผมจะสรุปวิธีการ ขั้นตอน และการแก้ปัญหาให้ครับ

    แต่สำหรับตอนนี้ ผมจะให้วิธีการของ Windows Platform ก่อนครับ
    ขั้นตอนน้อยกว่าและง่ายกว่าการทำบนตระกูล UNIX
    และที่สำคัญ มีเพื่อนร่วมงานผม ที่อยู่ต่างบริษัทกัน กำลังจำเป็นต้องใช้แก้ปัญหานี้บน Windows ครับ

    1. ผมจะถือว่าขั้นตอนการติดตั้ง Oracle Application Server เสร็จสมบูรณ์แล้ว และไม่มีปัญหาใด ๆ


    2. เพิ่มตัวแปร NLS_LANG เข้าไปในระบบครับ

    ผมจะใช้วิธีเพิ่มที่ System Variable ครับ เพราะว่าวิธีนี้จะดีกว่าการเพิ่มใน regedit ครับ เพราะทำที่เดียว ครั้งเดียว
    2.1 ไปที่ System Properties ครับ


    2.2 ไปที่ Environment Variables


    2.3 เพิ่ม System variables เพิ่ม New ครับ
    2.4 ใส่ตัวแปร

    Variable Name: NLS_LANG
    Variable Value: AMERICAN_AMERICA.TH8TISASCII



    หมายเหต: ควรตั้งค่า Variable Value ให้ตรงกับ database character set
    และค่า NLS_LANG ของเครื่องที่สร้าง file .rdf



    3. แก้ไข file uifont.ali
    3.1 ไปที่ folder ORACLE_HOME\tools\common จะเจอ file uifont.ali
    3.2 เปิด file นี้ หาย่อหน้าที่ว่า

    [ PDF:Subset ] #
    This example shows how to subset Arial True Type font into the PDF file # Arial = "Arial.ttf" # The True Type font files must exist in any one of the folders specified in # REPORTS_PATH.

    3.3 เพิ่ม fonts ที่ต้องการใช้ลงไป ตัวอย่าง

    AngsanaUPC = "ANGSAU.ttf"
    CordiaUPC = "CORDIAU.ttf"
    "Angsana New" = "ANGSA.ttf"
    "Cordia New" = "CORDIA.ttf"



    3.4 copy fonts ที่ได้ระบุในข้อ 3.3 ลงไปใน folder ORACLE_HOME\reports\samples\demo

    4. Restart Oracle Services ที่เกี่ยวข้อง

    5. สำเร็จครับ



    ส่วนการแก้ปัญหานี้บน UNIX ไว้จะเอามาลงใน blog อีกทีครับ
    ข้อเขียนนี้ช่วยฉัน:  

    Monday, November 2, 2009

    ส่งเมล์ง่าย ๆ ด้วย PL/SQL โดยใช้ UTL_MAIL

    utl_mail package เป็น feature ที่มีเพิ่มเข้ามาตั้งแต่ oracle database version 10g เป็นต้นไป
    จุดเด่นที่สำคัญของมัน คือ ทำให้การส่ง email สะดวกและง่ายมากขึ้น จาก version ก่อนที่ใช้ utl_smtp และ utl_tcp ซึ่งการเรียกใช้ค่อนข้างยุ่งยาก

    โดยปกติ utl_mail package ยังไม่สามารถใช้งานได้ทันที หลังจากการติดตั้ง oracle database จำเป็นที่จะต้องติดตั้งเพิ่ม โดยมีขั้นตอน ดังต่อไปนี้
    • ติดต่อเชื่อมต่อ oracle database ด้วย sys
    • $ sqlplus sys/manager1@db as sysdba
    • run ORACLE_HOME/rdbms/admin/utlmail.sql
    • SQL>@ORACLE_HOME/rdbms/admin/utlmail.sql
    • grant สิทธิ์ให้กับ user ที่จะใช้ utl_mail package
    • SQL>grant execute to test_app;
    เท่านี้ ก็จะสามารถใช้งาน utl_mail package ได้แล้ว ต่อไปเราจะมาดูรายละเอียดของ utl_mail กัน

    ภายใน utl_mail package จะประกอบไปด้วย 3 procedure ดังนี้

    1. send ใช้สำหรับส่ง email ทั่วไป โดยไม่ได้มีการแนบไฟล์
    utl_mail.send(
    sender        IN    VARCHAR2 CHARACTER SET ANY_CS,
    recipients    IN    VARCHAR2 CHARACTER SET ANY_CS,
    cc            IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
    bcc           IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
    subject       IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
    message       IN    VARCHAR2 CHARACTER SET ANY_CS,
    mime_type     IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain;charset=us-ascii',
    priority      IN    PLS_INTEGER DEFAULT 3);
    ตัวอย่าง
    begin
    execute immediate 'ALTER SESSION SET smtp_out_server = 'localhost';';
    UTL_MAIL.send('test1@test.com',
    'test2@test.com',
    null,
    null,
    'Hello Send',
    'Hello,How are you?',
    'text; charset=us-ascii',
    null);
    end;
    
    ใีนการอ้างอิง File ใน utl_file package เราจะต้องสร้าง
    directory เพื่อ อ้างอิง location หรือ path ดังนี้
    SQL>CREATE DIRECTORY d_file_path AS '/file/';
    
    SQL>GRANT READ,WRITE ON DIRECTORY d_file_path TO test_app;

    2. send_attach_raw ใช้สำหรับส่ง email ที่มีการแนบไฟล์
    utl_mail.send_attach_raw (
    sender  IN    VARCHAR2 CHARACTER SET ANY_CS,
    recipients      IN    VARCHAR2 CHARACTER SET ANY_CS,
    cc              IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
    bcc             IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
    subject         IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
    message         IN    VARCHAR2 CHARACTER SET       ANY_CS DEFAULT NULL,
    mime_type       IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain;charset=us-ascii',
    priority        IN    PLS_INTEGER DEFAULT 3,
    attachment      IN    RAW,
    att_inline      IN    BOOLEAN DEFAULT TRUE,
    att_mime_type   IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii',
    att_filename    IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);
    ตัวอย่าง
    declare
    v_file  utl_file.file_type;
    v_raw_file RAW(32767);
    v_file_length NUMBER;
    v_block_size NUMBER;
    v_exist  BOOLEAN;
    v_location VARCHAR2(50):='d_file_path';
    v_file_name VARCHAR2(50):='test.pdf';
    begin
    execute immediate 'ALTER SESSION SET smtp_out_server = 'localhost';';
    
    utl_file.fgetattr(v_location,v_file_name,v_exist,v_file_length,v_block_size);
    v_file:=utl_file.fopen(v_location,v_file_name,'R');
    utl_file.get_raw(v_file,v_raw_file,v_file_length);
    utl_file.fclose(v_file);
    
    utl_mail.send_attach_raw('test1@test.com',
    'test2@test.com',
    null,
    null,
    'Hello Send Attach Raw',
    'Hello,How are you?',
    'text; charset=us-ascii',
    null,
    v_raw_file,
    FALSE,
    'text; charset=us-ascii',
    v_file_name);
    end;
    
    3. send_attach_varchar2 ใช้สำหรับส่ง email ที่มีการแนบไฟล์ที่เป็น text
    
    utl_mail.send_attach_varchar2(
    sender         IN    VARCHAR2 CHARACTER SET ANY_CS,
    recipients     IN    VARCHAR2 CHARACTER SET ANY_CS,
    cc             IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
    bcc            IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
    subject        IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
    message        IN    VARCHAR2 CHARACTER SET       ANY_CS DEFAULT NULL,
    mime_type      IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain;charset=us-ascii',
    priority       IN    PLS_INTEGER DEFAULT 3,
    attachment     IN    VARCHAR2 CHARACTER SET ANY_CS,
    att_inline     IN    BOOLEAN DEFAULT TRUE,
    att_mime_type   IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii,
    att_filename    IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);
    ตัวอย่าง
    declare
    v_file  utl_file.file_type;
    v_raw_file RAW(32767);
    v_file_length NUMBER;
    v_block_size NUMBER;
    v_exist  BOOLEAN;
    v_location VARCHAR2(50):='d_file_path';
    v_file_name VARCHAR2(50):='test.txt';
    begin
    execute immediate 'ALTER SESSION SET smtp_out_server = 'localhost';';
    
    utl_file.fgetattr(v_location,v_file_name,v_exist,v_file_length,v_block_size);
    v_file:=utl_file.fopen(v_location,v_file_name,'R');
    utl_file.get_raw(v_file,v_raw_file,v_file_length);
    utl_file.fclose(v_file);
    
    utl_mail.send_attach_varchar2('test1@test.com',
    'test2@test.com',
    null,
    null,
    'Hello Send Attach Varchar2',
    'Hello,How are you?',
    'text; charset=us-ascii',
    null,
    v_raw_file,
    FALSE,
    'text; charset=us-ascii',
    v_file_name);
    end;
    ข้อเขียนนี้ช่วยฉัน: