go to http://oracle.in.th

Friday, November 27, 2009

Oracle Apps บน iPhone

"ให้โทรศัพท์มือถือของคุณเข้าถึงข้อมูลทางธุรกิจอย่างมืออาชีพ กับ ออราเคิลแอปพลิเคชั่น บน iPhone"

หลังจากที่ Oracle ได้เปิดตัว Oracle Application บน iPhone เมื่อต้นเดือนกุมภาพันธ์ผ่านมา กระแสงานของผู้ใช้ iPhone ให้การต้อนรับเป็นอย่างดี ซึ่งในตอนนี้ มีผู้ดาวน์โหลด Application นี้ไปใช้งาน มากกว่า 23,000 ครั้ง (ผลสำรวจเมื่อเดือนสิงหาคม 2552)

ใครที่สนใจ สามารถดูรายละเอียดและดาวโหลดของแต่ล่ะ Application ได้จากข้อมูลด้านล่าง

Oracle Apps ใน iPhone

  • Oracle Business Indicators is a business intelligence application that provides real-time, secure access to business performance information on the mobile device.
  • Oracle Business Approvals for Managers enables managers and executives to review key targeted tasks, access relevant business intelligence reports, make informed decisions and take immediate actions easily and securely while on-the-go.
  • Oracle iReceipts is an enterprise application that is part of Oracle PeopleSoft Expenses, which allows users to create and submit expense lines for cash transactions in real-time.
  • Oracle Mobile Sales Assistant is a CRM application that provides real-time, secure access to the information your sales organization needs on the mobile device. Complete frequent tasks, collaborate with colleagues and customers, and close deals more quickly while on the road.
  • Oracle Mobile Sales Forecast is an easy-to-use application that provides real-time visibility into an individual or organization's opportunity pipeline.
  • Oracle Enterprise Asset Maintenance Workbench is an application available to help maintenance department to increase their productivity and effectiveness. The application will help field workers/maintenance engineers to take advantage of iPhone GPS capabilities to be location aware and respond to maintenance requirements in a more effective manner.
  • Oracle Business Approvals for Sales Managers enables sales executives to review key targeted tasks, access relevant business intelligence reports, make informed decisions and take immediate actions easily and securely while on-the-go.

Jim Van Heel ได้เขียนอธิบายในบางแอปพลิเคชั่น ถ้าสนใจสามารถเข้าไปอ่านได้จาก ที่นี่.

หรือถ้าคุณสนใจที่จะพัฒนา iPhone Application โดยใช้ JDeveloper ของ Oracle สามารถดูรายละเอียดได้จาก บทความนี้.


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

Wednesday, November 25, 2009

Profit Magazine หนังสือดีๆ แจกฟรีๆ จาก Oracle

หลังจากที่เราได้เชยชม Oracle Magazine ไปแล้วในตอนที่แล้ว คราวนี้ถึงตา หนังสืออีกเล่มนึง ซึ่งน่าสนใจไม่แพ้กันกับ Oracle Magazine เลยค่ะ
ส่วนใครที่พลาดตอนที่แล้ว และอยากได้ Oracle Magazine มาครอบครอง คลิกที่นี่เพื่อไปสมัคร Oracle Magazine กันก่อนก็ได้คะ
เรามาเข้าเรื่องกันดีกว่า...
Profit Magazine หนังสือสำหรับการบริหาร Oracle Application อย่างมืออาชีพ!
ซึ่งนิตยสารเล่มนี้ จะออกทุกๆ 4 เดือน โดยผู้บริหารหรือผู้นำธุรกิจจะได้รับความรู้ต่างๆ ที่ช่วยในการบริหาร หรือช่วยในการตัดสินใจ ในการลงทุนทางด้านเทคโนโลยี, บทความ, กลยุทธ์, และ เทคโนโลยีต่างๆ ที่น่าสนใจก็รวมอยู่ในนิตสารเล่มนี้ด้วย ถือได้ว่าเป็นหนังสือที่น่าสนใจไม่ใช่น้อยเลยทีเดียว

ดูรายละเอียดเพิ่มเติมได้ที่นี่ Profit Magazine

ขั้นตอนการสมัคร Profit Magazine

1. เข้าไปที่เว็บ Profit Magazine เพื่อสมัครสมาชิก

Go to Subscribe
1.1 คลิกเลือกที่ "I want a new subcription" เพื่อสมัครใหม่
1.2 กดปุ่ม Continue เพื่อไปหน้าต่อไป

Click to subscribe
2. หน้านี้จะให้กรอกข้อมูลเกี่ยวกับ ประวัติส่วนตัว , ที่อยู่, และข้อมูลของบริษัท
แต่ในการกรอกเอกสารนี้ ต้องกรอกที่อยู่จริง เพื่อที่ทาง Oracle จะได้ส่งเอกสารให้คุณได้ถูกต้อง และอย่าลืมใส่ Email ที่ถูกต้อง

2.1 คลิกเลือกที่ "Yes! I wish to receive/continue to receive PROFIT MAGAZINE FREE!"

2.2 ใส่ข้อมูลต่างๆให้ครบถ้วน อย่าลืม ใส่ที่อยู่จริงนะคะ


2.3 ในช่องนี้ ถ้าคุณต้องการรับข่าวสารเกี่ยวกับ Oracle หรือ โปรโมชั่นต่างๆ ให้ ติ๊กถูกที่ช่องนี้ แต่ถ้าไม่ต้องการรับ ไม่ต้องติ๊กค่ะ

2.4 ถ้าคุณไม่ต้องการแชร์รายชื่ออีเมลล์ กับทาง Oracle ให้ติ๊กถูกค่ะ


2.5 ใส่ข้อมูลต่างๆ เกี่ยวกับความสนใจของเรา และ ข้อมูลของบริษัท เมื่อใส่เสร็จ ให้ลงมากดปุ่ม Submit ด้านล่างเลยค่ะ


3. ถึงตอนนี้ ถือว่าคุณได้สมัคร Profit Magazine เป็นที่เรียบร้อย แล้วอีกซัก 6-8 อาทิตย์ Profit Magazine ก็จะส่งตรงมาถึงบ้านคุณเลยค่ะ



หรือ ถ้าไม่อยากรอนาน ลองเข้ามาอ่านแบบ Online กันก่อน ที่นี่เลยค่ะ Profit Magazine Online

ขอให้สนุกกับการอ่าน Profit Magazine นะคะ
ข้อเขียนนี้ช่วยฉัน:  

Tuesday, November 24, 2009

Oracle Enterprise Manager Widgets บน Desktop

Monitor Enterprise Manager ได้อย่างรวดเร็ว กับ Oracle Enterprise Manager Widgets บน Desktop



Enterprise Manager Desktop Widgets คือ แอพพลิเคชันขนาดเล็กที่ทำงานบนหน้าเดสก์ทอปโดยเจ้าตัว widgets นี้ จะช่วยให้ผู้ใช้สามารถติดตามและวิเคราะผลของโปรแกรม Enterprise Manager ได้บนหน้าเดสก์ทอปของผู้ใช้งาน เพียงแค่ผู้ใช้งานดูเจ้า widgets ตัวนี้ แค่นี้ ก็สามารถเช็คและจัดการ eco-system ของผู้ใช้งานได้อย่างง่ายดาย และรวดเร็ว

widgets นี้ยังให้เข้าถึงฟังก์ชันการทำงานของ Enterprise Manager ได้โดยตรง ซึ่งเราสามารถพบปัญหาและยังแก้ปัญหาได้อย่างรวดเร็วอีกด้วย

โดย Oracle Enterprise Manager Widgets บน Desktop นี้ มี 3 ตัว ให้เลือกใช้งานกัน
  1. Target Search & Monitoring - Dowload Now







  2. High-Load Databases - Dowload Now







  3. Service Level & Monitoring - Dowload Now





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

Thursday, November 19, 2009

Oracle เปิดรับสมัครพนักงาน ตำแหน่ง Oracle Functional Financials Lead และ Sr. Project Manager

Oracle เปิดรับสมัครพนักงานในตำแหน่ง Oracle Functional Financials Lead และ Sr. Project Manager

ผู้ใดสนใจเข้าสมัครงานในบริษัท Oracle ตำแหน่ง Oracle Functional Financials Lead และ Sr. Project Manager สามารถดูรายละเอียดได้จากด้านล่างนี้
ถ้าสนใจ กรุณาส่ง Resume ไปที่ คุณ Sam sam.abraham@oracle.com


we have 2 positions in Thailand for Senior Project Manager and Principal Consultant, attached detailed JD for both the roles. Please send me your resume.

Title: Oracle Functional Financials Lead
Job Description: This candidate need to be a seasoned Oracle Applications Financials Lead with proven track of record of successful implementations. We (and client) will look for an accounting practitioner background, preferably CPA certified and working experience in multinational environment. In addition, candidate need to have 6+ years exposure in Oracle Financials implementations with 2-3 years in a Lead role. Automotive and/or Manufacturing will be a definite plus.
For more details contact sam.abraham@oracle.com


Title: Sr. Project Manager
Job Description: Candidate should have an ERP package project management background with proven success with large projects in multinational environments. Preferably including Oracle Financials implementations, team size 15+ with a budget of 2 M US$++, familiar with concepts of Program Management. Candidate must be fluent in English and excellent communication skills. Project Management experience minimum years of experience 10+
For more details contact sam.abraham@oracle.com


Credit by: Surachart - http://surachartopun.com
ข้อเขียนนี้ช่วยฉัน:  

การใช้งาน Google Contact Data API

Google มี API ให้เราสามารถนำมาใช้ในการติดต่อกับ Application ต่างๆของ Google ได้ เช่น Google Contact, Google Calendar การใช้ Contact Data API ทำได้ไม่อยาก โดยสามารถทำตามได้จากวิธีการดังนี้

1. ตรวจสอบว่าในเครื่องมีการติดตั้ง Eclipse และ Java Compiler ไว้เรียบร้อยแล้ว

2. Google Contact จะสามารถดึงข้อมูลจาก Google Account โดยที่จะต้องมี Account ของ Google ก่อน

3. จากนั้นให้ดาวน์โหลด Java Client Library จาก http://code.google.com/p/gdata-java-client/ ให้ดาวน์โหลดไฟล์ ชื่อ "gdata-samples.java-1.39.0.zip" มาทำการแตกไฟล์ไว้ใน "/eclipse/gdata"

4. จากนั้นให้ทดสอบการใช้ API โดยการทดลองรันโปรแกรมตัวอย่าง จาก "data/java/sample/contacts/ContactsExample.java"

5. โดยการ Compile โปรแกรมตัวอย่างจำเป็นต้อง import library ที่จำเป็นดังต่อไปนี้
import com.google.gdata.client.*;

import com.google.gdata.client.contacts.*;

import com.google.gdata.data.*;

import com.google.gdata.data.contacts.*;

import com.google.gdata.data.extensions.*;

import com.google.gdata.util.*;

import java.io.IOException;

import java.net.URL;
6. หลังจากทดสอบด้วยโปรแกรมตัวอย่างแล้ว ต่อไปจะเป็นขั้นตอนการใช้ Contact API ในขั้นตอนแรกเราจะต้องทำการเซ็ต
ContactsService myService = new ContactsService("exampleCo-exampleApp-1");

myService.setUserCredentials("your_account@gmail.com", "password");
7. ต่อไปเป็นการจัดการกับ Google Contact ที่สามารถทำได้ คือ Add New Contact, Update Contact และการ Delete Contact อันดับแรกคือ การ Add new Contact สามารถทำตามจาก source code ต่อไปนี้
public static ContactEntry createContact(ContactsService myService,

String fullName, String givenName, String familyName, String notes)

throws ServiceException, IOException {

// Create the entry to insert

ContactEntry contact = new ContactEntry();

Name name = new Name();

final String NO_YOMI = null;

 name.setFullName(new FullName(fullName, NO_YOMI));

 name.setGivenName(new GivenName(givenName, NO_YOMI));

name.setFamilyName(new FamilyName(familyName, NO_YOMI))

contact.setName(name);

contact.setContent(new PlainTextConstruct(notes));

 

Email primaryMail = new Email();

primaryMail.setAddress("liz@gmail.com");

primaryMail.setRel("http://schemas.google.com/g/2005#home");

 primaryMail.setPrimary(true);

contact.addEmailAddress(primaryMail);

 

Email secondaryMail = new Email();

secondaryMail.setAddress("liz@example.com");

 secondaryMail.setRel("http://schemas.google.com/g/2005#work");

secondaryMail.setPrimary(false);

contact.addEmailAddress(secondaryMail);

 

ExtendedProperty favouriteFlower = new ExtendedProperty();

favouriteFlower.setName("favourite flower");

favouriteFlower.setValue("daisy");

 contact.addExtendedProperty(favouriteFlower);

 

ExtendedProperty sportsProperty = new ExtendedProperty();

sportsProperty.setName("sports");

XmlBlob sportKinds = new XmlBlob();

sportKinds.setBlob(new String(""));

sportsProperty.setXmlBlob(sportKinds);

contact.addExtendedProperty(sportsProperty);

 

// Ask the service to insert the new entry

URL postUrl = new URL("http://www.google.com/m8/feeds/contacts/liz@gmail.com/full");

return myService.insert(postUrl, contact);

}
8. ต่อไปคือการ Update Contact โดยการที่จะ Update Contact นั้นจำเป็นที่จะต้องเรียก Contact ทั้งหมดออกมาเพื่อนที่จะรู้ว่าจะสามารถ Update Contact ใดได้บ้าง โดยการเรียก Contact ทั้งหมดออกมาสามารถทำได้จากการใช้ source code ดังต่อไปนี้
public static void printAllContacts(ContactsService myService)

throws ServiceException, IOException {

// Request the feed

URL feedUrl = new URL("http://www.google.com/m8/feeds/contacts/liz@gmail.com/full");

ContactFeed resultFeed = myService.getFeed(feedUrl, ContactFeed.class);

// Print the results

System.out.println(resultFeed.getTitle().getPlainText());

for (int i = 0; i < resultFeed.getEntries().size(); i++) {

ContactEntry entry = resultFeed.getEntries().get(i);

if (entry.hasName()) {

Name name = entry.getName();

if (name.hasFullName()) {

String fullNameToDisplay = name.getFullName().getValue();

        if (name.getFullName().hasYomi()) {

          fullNameToDisplay += " (" + name.getFullName().getYomi() + ")";

        }

        System.out.println("\t\t" + fullNameToDisplay);

      } else {

        System.out.println("\t\t (no full name found)");

      }

      if (name.hasNamePrefix()) {

        System.out.println("\t\t" + name.getNamePrefix().getValue());

      } else {

        System.out.println("\t\t (no name prefix found)");

      }

      if (name.hasGivenName()) {

        String givenNameToDisplay = name.getGivenName().getValue();

        if (name.getGivenName().hasYomi()) {

          givenNameToDisplay += " (" + name.getGivenName().getYomi() + ")";

        }

        System.out.println("\t\t" + givenNameToDisplay);

      } else {

        System.out.println("\t\t (no given name found)");

      }

      if (name.hasAdditionalName()) {

        String additionalNameToDisplay = name.getAdditionalName().getValue();

        if (name.getAdditionalName().hasYomi()) {

          additionalNameToDisplay += " (" + name.getAdditionalName().getYomi() + ")";

        }

        System.out.println("\t\t" + additionalNameToDisplay);

      } else {

        System.out.println("\t\t (no additional name found)");

      }

      if (name.hasFamilyName()) {

        String familyNameToDisplay = name.getFamilyName().getValue();

        if (name.getFamilyName().hasYomi()) {

         familyNameToDisplay += " (" + name.getFamilyName().getYomi() + ")";

        }

        System.out.println("\t\t" + familyNameToDisplay);

      } else {

        System.out.println("\t\t (no family name found)");

      }

      if (name.hasNameSuffix()) {

        System.out.println("\t\t" + name.getNameSuffix().getValue());

      } else {

        System.out.println("\t\t (no name suffix found)");

      }

    } else {

      System.out.println("\t (no name found)");

    }

 

    System.out.println("Email addresses:");

    for (Email email : entry.getEmailAddresses()) {

      System.out.print(" " + email.getAddress());

      if (email.getRel() != null) {

        System.out.print(" rel:" + email.getRel());

      }

      if (email.getLabel() != null) {

        System.out.print(" label:" + email.getLabel());

      }

      if (email.getPrimary()) {

        System.out.print(" (primary) ");

      }

      System.out.print("\n");

    }

 

    System.out.println("IM addresses:");

    for (Im im : entry.getImAddresses()) {

      System.out.print(" " + im.getAddress());

      if (im.getLabel() != null) {

        System.out.print(" label:" + im.getLabel());

      }

      if (im.getRel() != null) {

        System.out.print(" rel:" + im.getRel());

      }

      if (im.getProtocol() != null) {

        System.out.print(" protocol:" + im.getProtocol());

      }

      if (im.getPrimary()) {

        System.out.print(" (primary) ");

      }

      System.out.print("\n");

    }

 

    System.out.println("Groups:");

    for (GroupMembershipInfo group : entry.getGroupMembershipInfos()) {      

      String groupHref = group.getHref();

      System.out.println("  Id: " + groupHref);

    }

 

    System.out.println("Extended Properties:");

    for (ExtendedProperty property : entry.getExtendedProperties()) {

      if (property.getValue() != null) {

        System.out.println("  " + property.getName() + "(value) = " + 

            property.getValue());

      } else if (property.getXmlBlob() != null) {

        System.out.println("  " + property.getName() + "(xmlBlob)= " + 

            property.getXmlBlob().getBlob());

     }

    }

 

    String photoLink = entry.getContactPhotoLink().getHref();

    System.out.println("Photo Link: " + photoLink);

 

    if (photoLink.getEtag() != null) {

      System.out.println("Contact Photo's ETag: " + photoLink.getEtag());

    }

 

    System.out.println("Contact's ETag: " + entry.getEtag());

  }

}
9. หลังจากที่รับทุก Contact มาแล้วจากนั้นจำเป็นการ Update Contact ที่ต้องการโดยใช้ Source code ต่อไปนี้ โดยในตัวอย่างนี้จะเป็นการ Update เฉพาะ ชื่อของ Contact นั้นเท่านั้น
public static ContactEntry updateContactName(

    ContactsService myService, ContactEntry entryToUpdate, String newName)

    throws ServiceException, IOException {

  entryToUpdate.setTitle(new PlainTextConstruct(newName));

  URL editUrl = new URL(entryToUpdate.getEditLink().getHref());

  return myService.update(editUrl, entryToUpdate);

}
10. และสุดท้ายคือการลบ Contact ซึ่งการจะลบ Contact จะต้องรู้ว่าต้องการลบ Contact ใด แล้วจึงทำการลบ Contact ออกจาก Account โดยใช้ Source Code ดังต่อไปนี้
public static void deleteContact(ContactEntry entryToDelete)

    throws ServiceException, IOException {

 entryToDelete.delete();

}
ข้อเขียนนี้ช่วยฉัน:  

Wednesday, November 18, 2009

JDeveloper 11.1.1.2 ออกมาให้ลองเล่นแล้ว!!



JDeveloper 11.1.1.2 ออกมาให้ลองเล่นแล้ว!!

Oracle ได้ออก JDeveloper 11.1.1.2 เวอร์ชั่นใหม่ให้ได้มาลองเล่นกันแล้วบน OTN

ถ้าคุณสังเกตดูจาก Release Number ก็นึกว่า เป็นแค่การ Update patch ซึ่งมาพร้อมกับพวก bug fix ต่างๆ ซึ่งไม่น่าจะต่างอะไรจากเดิมเท่าไหร่นัก...แต่สำหรับครั้งนี้ JDeveloper 11.1.1.2 มีการเปลี่ยนแปลงเยอะมากพอสมควรเลยทีเดียว

คุณสามารถดู Feature ใหม่ๆ ที่ออกมาพร้อมกับ JDeveloper 11.1.1.2 นี้ ได้จาก ที่นี่

ซึ่ง Feature ใหม่ๆ ที่น่าสนใจ ของ JDeveloper 11.1.1.2 ที่เราอยากจะแนะนำให้คุณ คือ
  • New Maven extension
  • More functionality in the data control for EJBs (query and range fetching support)
  • New skin for ADF Faces (Fusion skin) which also adds a bunch of animation to things
  • New ADF Faces components - carousel, sparkel graph, autosuggest behavior, emailable pages and more
  • Improvement in the JSF visual editor
  • Better debugger and logging for ADF
  • Bugzilla integration in TPC
  • New features in the database designer
  • UML 2.0 support
....นี่เป็นเพียงส่วนนึงเท่านั้น ของ Feature ใหม่ของ JDeveloper 11.1.1.2

ถ้าคุณสนใจ และอยากจะทดสอบ JDeveloper 11.1.1.2 ตัวใหม่นี้ คุณสามารถ Download JDeveloper 11.1.1.2 สำหรับ Window ได้จาก Link ข้างล่างนี้
Download Oracle JDeveloper Studio Edition for Windows


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

Tuesday, November 17, 2009

Oracle Database 11g Release 2 สำหรับ Solaris ออกแล้ว

Oracle Database 11g Release 2 (11.2.0.1.0) สำหรับ Solaris (SPARC) (64-bit) ออกแล้ว

racle Database 11g Release 2 for Solaris


Oracle เพิ่งออก Oracle Database 11g Release 2 (11.2.0.1.0) สำหรับ Solaris (SPARC) (64-bit)
โดยสามารถไปดาวน์โหลดได้ตาม link นี้เลย

ถ้าอยากทราบ กำหนดการของ Oracle สามารถดูได้ที่นี่

Oracle Database 11g Release 2
Standard Edition, Standard Edition One, and Enterprise Edition


(11.2.0.1.0)

  • Disk 1, Disk 2 (2.1 GB)
  • Disk 1, Disk 2 (2.2 GB)
  • Disk 1, Disk 2 (2.3 GB)



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

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;
    ข้อเขียนนี้ช่วยฉัน: