Friday, 7 July 2000

ถามต้อม?

ใครมีข้อสงสัยเกี่ยว​กับ​ Oracle ​หรือ​ Java ​สามารถ​ตั้งคำถามโดยการ post comment ไว้ข้างล่างเลยครับ ...
(ถามต้อมคืออะไร?)

194 comments:

Kim said...

ขอเจิมคำถามแรกครับ,

ผมใช้งาน Oracle BI Publisher Desktop Edition เวอร์ชั่น 10.1.3.3.1
เมื่อเริ่มใช้งาน ก็เปิด MS Word 2007 ขึ้นมา
ปรากฎว่าพบ error ดังนี้ครับ

Run-time error '429':
ActiveX component can't create object

มีวิธีแก้ปัญหาอย่างไรบ้างครับ?

toncrub said...

สวัสดีครับ
ขอรบกวนถามเรื่องการ install oracle database 11g นะครับ
พอดีลงแล้วมีการแจ้ง error ดังรูปครับ

http://i22.photobucket.com/albums/b332/toncrub/error.jpg

ในเครื่องผมลง jdk6 update3 ไว้แล้วครับ
เลยงงๆ ไม่รู้ว่าต้องแก้ตรงไหน

ผมเพิ่งหันมาศึกษา java และ oracle ครับ
คงต้องขอฝากเนื้อฝากตัวด้วยนะครับ
ขอบคุณมากครับ

ปล.ความเห็นข้างบน ผมพยายามแก้ลิ้งค์ของรูปครับ แต่หาทางแก้ไม่เจอ เลยต้องกดลบไป ขอโทษด้วยครับ

wii said...

ลองดูครับ คุณ toncrub
http://blog.middleware.co.th/2007/11/1-oui-error-java-runtime-environment.html

Anonymous said...

มีเรื่องรบกวนถามเกี่ยวกับการเก็บ Event Log ของ oracle น่ะคะ ที่หน่วยงานใช้ oracle ในการเก็บข้อมูลทางด้าน GIS ซึ่งบ่อยครั้งที่ application ทำงานช้ามาก user บ่นเยอะจึงแจ้งไปทางเจ้าของ application ซึ่งเค้าก็มาดูแล้วบอกว่าเป็นที่ database มี redo log ของ database มันไม่ทำงานซึ่งเค้าบอกว่าไปดูจาก log ของdatabase มันฟ้องว่า redo log ไม่ทำงาน ถามเค้าว่าดูได้จากไหน เค้าก็ไม่ยอมตอบ เลยอยากทราบว่าโดยปกติแล้ว oracle จะเก็บ log การทำงานของ database ไว้ที่ไหนคะ เครื่องเป็นเครื่อง SUN คะ

รบกวนด้วยนะคะ
ขอบคุณมากคะ

cherrymckwai said...

ตอบคุณ Anonymous

ปรกติแล้ว Oracle จะมี Alert log ที่ไว้เก็บรายละเอียดการทำงานของ Database ค่ะ ซึ่งส่วนมากจะเก็บไว้ที่
Path ==> $ORACLE_HOME/admin/<SID>/bdump
โดยจะมีชื่อไฟล์ว่า alert_<SID>.log

Anonymous said...

ฝากถามคุณ kim เรื่องการแก้ปัญหา Oracle Reports ให้ใช้งาน PDF ภาษาไทยได้ บน UNIX Platform น่ะค่ะ เนื่องจากทำแล้วติดปัญหาคือแสดงภาษาไทยได้ แต่แสดงข้อความไม่พอ และจัดตำแหน่งไม่ตรงตามต้องการค่ะ แต่ถ้ารันบน Windows โอเคค่ะ แต่บน Unix ไม่เวิร์คค่ะ
รบกวนด้วยค่ะ
Pra

Anonymous said...

ส่ง email ไปให้แล้วครับคุณ pra

Anonymous said...

รบกวนสอบถามค่ะ คือสงสัยว่า hit rate ของ database นี่มันคืออะไรเหรอคะมีผลอะไรกับ DB บ้างรบกวนท่านผู้รู้หน่อยค่ะ

cherrymckwai said...

โดยหลักการทำงานของ Oracle Database นั้น จะมีส่วนที่เรียกว่า Database Buffer Cache โดยส่วนนี้จะทำหน้าที่ Cache เหล่า Data Block ที่ถูก Query ไว้ ซึ่งทุกครั้งที่มีการ Query ข้อมูลต่างๆ Oracle ก็จะทำการค้นหาที่ Buffer Cache ก่อน และแสดงผลทันทีเมื่อพบ Data Block ที่ต้องการ (cache hit) ทำให้การค้นหาข้อมูลเร็วขึ้น และช่วยลดการอ่าน Disk โดยตรงอีกด้วย อย่างไรก็ดี ถ้า Query แล้วไม่เจอ Data Block ที่ต้องการใน Buffer Cache (cache miss) ตัว Oracle ก็จะทำการค้นหาใน Disk แล้ว Copy Data Block ดังกล่าวมาเก็บไว้ที่ Cache ทีนี้จะเก็บได้มากน้อยแค่ไหน ก็ขึ้นกับขนาดของ Cache ที่กำหนด ถ้า Cache เต็ม Oracle ก็จะทำการ move block ที่มีการใช้งานน้อยที่สุด ออกไปก่อน (LRU) อย่างไรก็ดี Cache ที่มีขนาดใหญ่ไม่ได้ช่วยให้ Performance ของ Database ดีขึ้นเสมอไป การกำหนดขนาดของ Cache ให้เหมาะสมจะช่วยเพิ่ม Performance ของ Database ได้ โดยอาศัยการ monitor ค่า Hit Rate หรือที่ Oracle เรียกว่า Buffer Cache Hit Ratio ซึ่งเป็นการหาอัตราส่วนของ ความถี่ที่ cache hit ต่อด้วยจำนวน total request ถ้าค่า Buffer Cache Hit Ratio มีค่ามาก แสดงถึงว่ามีการเข้าถึงข้อมูลผ่านทาง Buffer Cache มากกว่าการ read จาก disk โดยตรง อย่างไรก็ดี การ tuning database นั้น ขึ้นกับองค์ประกอบหลายส่วน การ tuning โดยไม่คำนึงถึงส่วนประกอบอื่นๆ อาจส่งผลให้ Performance ของ Database แย่ลงได้ค่ะ

Anonymous said...

ขอบคุณคุณ cherrymckwai ค่ะ อธิบายชัดเจนตรงประเด็นค่ะ ไว้มีปัญหาจะมารบกวนใหม่นะคะ :)

Anonymous said...

เวลาเข้าใช้ Internet จะปรากฏหน้าต่างขึ้นมาทุกครั้ง
โดยในหน้าต่างมีข้อความดังนี้

Error
A Runtime Error has occurred.
Do you wist to Debug?

Line: 14
Error: Object doesn’t support this property or method

แล้วมีให้เลือกกด
Yes No

เลยลองกดตอบ ทั้งYes หรือ No แล้วหน้าต่างก็ยังไม่หายไป
และต้องกดตอบอย่างน้อย3ครั้งต่อ1หน้าเวปค่ะ
ทำไงดีคะ???????

ทำการดาวน์โหลด Java Runtime แล้ว
แต่ก็ยังเกิดปัญหานี้อยู่
อยากทราบว่าจะมีวิธีแก้ไขไหมค่ะ
หรือว่าต้องตรวจสอบอะไรบ้าง
แล้วจะดูคำตอบที่หนูถามพี่ได้ที่ไหนค่ะ

รบกวนด้วยนะค่ะ
ขอบคุณล่วงหน้าค่ะ

Anonymous said...

อยากทราบวิธีการ Select ข้อมูลให้ได้ Record เป็นวันที่ 1 ถึง วันที่สุดท้ายของเดือนที่ต้องการนะครับ
เช่น อยากได้วันที่เดือน 10 ก็แสดง Record เป็น
Day Of Month
01/10/2007
02/10/2007
03/10/2007
.....
31/10/2007

โดยที่ไม่ต้องใช้ PL ช่วยนะครับ
ขอบคุณล่วงหน้าครับ

khun said...

SELECT to_char(to_date('2 2008','MM YYYY')-1 + level,'DD/MM/YYYY')
FROM DUAL
CONNECT BY level<=to_number(to_char(last_day(to_date('2 2008','MM YYYY')),'DD'))

ลองดูครับ

Anonymous said...

มีเรื่องรบกวนถามด้วยค่ะ

ต้องการให้มีการแจ้งเตือนเมื่อ tablespace ถูกใช้ไป 95% ซึ่งตอนนี้เก็บข้อมูลเกี่ยวกับ tablespace ไว้ใน table 'temp_ts'
(จาก http://www.remote-dba.cc/oracle_tips_tablespace_full.htm )
แต่ไม่ทราบวิธีการเขียนscript ที่จะส่งเมลล์น่ะค่ะ
มีตัวอย่างการเขียน script ในกรณีนี้รึเปล่าคะ

khun said...

Oracle Database จะมี package ที่ใช้สำหรับการจัดการส่งเมล์มาให้อยู่ 3 ตัว ตั้งแต่ version 8.1.6 เป็นต้นไป คือ
1. UTL_SMTP
2. UTL_TCP
3. UTL_MAIL (มีใน version 10g และจะต้อง enable ก่อนถึงจะสามารถใช้งานได้)
จากคำถามนะครับ ผมจะสร้าง job ที่ทำหน้าที่คอยตรวจสอบ table space ที่ใช้เกิน 95% แล้วจะส่งเมล์แจ้งเตือน โดยสามารถทำได้ดังนี้
1. สร้าง SEND_MAIL PROCEDURE ใช้สำหรับการส่ง email โดยใช้ PACKAGE UTL_SMTP
CREATE OR REPLACE PROCEDURE SEND_MAIL(v_from VARCHAR2,
v_recipient VARCHAR2,
v_subject VARCHAR2,
v_body VARCHAR2,
v_mail_host VARCHAR2)
IS
v_mail_conn UTL_SMTP.connection;
crlf VARCHAR2(2) := chr(13)||chr(10);
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE=English';
v_mail_conn := UTL_SMTP.open_connection(v_mail_host, 25);
UTL_SMTP.helo(v_mail_conn, v_mail_host);
UTL_SMTP.mail(v_mail_conn, v_from);
UTL_SMTP.rcpt(v_mail_conn, v_recipient);
UTL_SMTP.data(v_mail_conn,
'Date: ' || TO_CHAR(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf ||
'From: ' || v_from || crlf ||
'Subject: '|| v_subject || crlf ||
'To: ' || v_recipient || crlf ||
'MIME-Version: 1.0'|| crlf ||
'Content-Type: multipart/mixed;'|| crlf ||
' boundary="-----SECBOUND"'|| crlf ||
crlf ||

'-------SECBOUND'|| crlf ||
'Content-Type: text/plain;'|| crlf ||
'Content-Transfer_Encoding: 7bit'|| crlf ||
crlf ||
v_body|| crlf || -- Message body
crlf);

UTL_SMTP.quit(v_mail_conn);
EXCEPTION
WHEN UTL_SMTP.transient_error or UTL_SMTP.permanent_Error then
raise_application_error(-20000, 'Unable to send mail: '||SQLERRM);
END;
/
2. สร้าง ALERT_TBLS PROCEDURE ใช้สำหรับตรวจสอบ TABLESPACE ที่ใช้เกินกว่า 95% แล้วส่ง email
CREATE OR REPLACE PROCEDURE ALERT_TBLS

IS
TYPE t_char IS TABLE OF VARCHAR2(1000);
v_list t_char;
v_body VARCHAR2(1000);
BEGIN


SELECT d.tablespace_name ||
' is ' ||
TO_CHAR(ROUND(100-(d.free_bytes*100/d.total_bytes), 2)) ||
'% full.' tablespace_list
BULK COLLECT INTO v_list
FROM (SELECT a.tablespace_name tablespace_name,
NVL(SUM(a.bytes), 1) total_bytes,
(SELECT NVL(SUM(b.bytes), 1)
FROM dba_free_space b
WHERE b.tablespace_name = a.tablespace_name) free_bytes,
(SELECT NVL(MAX(c.bytes), 1)
FROM dba_free_space c
WHERE c.tablespace_name = a.tablespace_name) max_chunk

FROM dba_data_files a

GROUP BY a.tablespace_name
) d
WHERE 95 < 100-(d.free_bytes*100/d.total_bytes)
ORDER BY d.tablespace_name;


IF v_list.count>0 THEN
FOR i IN 1..v_list.count LOOP
v_body:=v_body || v_list(i) || CHR(10);

END LOOP;
send_mail('Admin@zzz.com',
'khun@zzz.com',
'Table space Alert',
v_body,
'localhost');
END IF;


END;
/
3. ตั้ง job สำหรับ run alert_tbls procedure
สร้าง scheduler program
EXECUTE DBMS_SCHEDULER.create_program (
program_name => 'ALERT_TBLS_PROGRAM',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN ALERT_TBLS; END;',
enabled => TRUE,
comments => 'Program to alert table space more than 95%.');
สร้าง scheduler job โดยจะ run ทุก 1 นาที
EXECUTE DBMS_SCHEDULER.create_job (
job_name => 'ALERT_TBLS_JOB',
program_name => 'ALERT_TBLS_PROGRAM',
start_date => SYSTIMESTAMP,
repeat_interval => ' sysdate+1/(24*60)',
end_date => NULL,
enabled => TRUE,
comments => 'Job to alert table space more than 95%.');
เท่านี้ก้อจะได้ job ที่ทำหน้าที่คอยตรวจสอบ table space ที่ใช้เกิน 95% แล้วจะส่งเมล์แจ้งเตือน ครับ ^_^

Anonymous said...

ขอบคุณมากๆๆๆๆเลยนะคะ เดี๋ยวจะไปลองทำดูค่ะ

Anonymous said...

เรียน คุณต้อม

อยากทราบวิธี ใช้ sql statement ไป query OID หรือว่าใช้ ldapserch ใน oid มา query ใน database ครับ

มี ฟังก์ชั่นหรือตัวอย่าง source เป็นอย่างไรครับ

Anonymous said...

ถึงคุณ Anonymous ที่ถามเรื่อง OID,

ถามมากว้าง ๆ
ลองดูตัวอย่างต่อไปนี้แล้วประยุกต์ใช้นะครับ

ตัวอย่างที่ 1
ldapsearch -h 192.168.1.1 -p 389 -D "cn=orcladmin" -w password -b "cn=IAS Infrastructure Databases,cn=IAS,cn=Products,cn=OracleContext" -s sub "orclResourceName=orasso" orclpasswordattribute

ตัวอย่างที่ 2
select rdn from ods.ct_dn
where PARENTDN like 'dc=th,dc=co,dc=middleware,cn=users,'

Anonymous said...

เรียนสอบถามเรื่องการติดต่อ oracle

ปัจจุบัน มีเครื่อง server 2 เครื่อง
เครื่องแรกติดตั้ง ฐานข้อมูล PostgreSQL บนRedhat ES4
เครื่องสองติดตั้ง ฐานข้อมูล Oracle บน Redhat ES4

มีความต้องการ ส่งข้อมูลจาก table หนึ่งใน PostgreSQL ไป Oracle (ศร้าง table ที่เหมือนกันไว้)แบบ อัตโนมัติ (ทั้ง insert/update/delete)

สามารถทำวิธีใดได้บ้างครับ
และต้องใช้ Software อะไรบ้าง เช่น ODBC หรือไม่ อย่างไรครับ

ขอบคุณมากๆครับ
ddd

Anonymous said...

ขอถามปัญหาการใช้ Form Dev10g และใช้ Discoverer ออกรายงานค่ะ คือทำ project อยู่ ตอนแรก run form ได้ แต่พอลองทำรายงานด้วย Discoverer ทำไม่กลับมา run form ไม่ได้คะ

Anonymous said...

คุณ anonymous

"ขอถามปัญหาการใช้ Form Dev10g และใช้ Discoverer ออกรายงานค่ะ คือทำ project อยู่ ตอนแรก run form ได้ แต่พอลองทำรายงานด้วย Discoverer ทำไม่กลับมา run form ไม่ได้คะ"

ขอรายละเอียดมากกว่านี้ครับ
ถ้าห่วงเรื่องประเด็น privacy
ก็ให้ mail มาถามที่ tom@middleware.co.th ก็ได้ครับ

Anonymous said...

มีเรื่องรบกวนถามค่ะ (Oracle นะคะ)

คือ ตอนนี้มี view อยู่ 3 view ค่ะ
ต้องการสร้างหน้าเว็บขึ้นมา (php) เพื่อให้เลือกติ๊กว่าจะเลือก query view ไหน แล้วกด submit
แล้ว export ข้อมูลที่ query ได้มาเป็นไฟล์ excel เพื่อให้ download ออกมาน่ะค่ะ
พอมีแนวทางในการทำอย่างไรบ้างคะ

cherrymckwai said...

ตอบเรื่องการ Replicate ระหว่าง PostgreSQL กับ Oracle

Oracle มี Feature ที่ชื่อว่า Oracle Stream อยู่ค่ะ ที่สามารถ Apply change จาก Non-Oracle มายัง Oracle ผ่าน Heterogeneous Services ลองหาข้อมูลเพิ่มเติมดูนะค่ะ

Anonymous said...

ผมอยากได้ปฏิทิน (Calendar) ที่เอาไปใช้กับ Field ที่เป็นวันที่ (Date) กับ Developer 10g นะครับ
อยากรู้ว่ามีวิธีไหนที่จะเอาไปใช้ได้ง่าย ๆ ครับ User เขาต้องการให้สามารถคลิกเลือกได้ แทนการ Key นะครับ

ขอบคุณครับ

Anonymous said...

ขอถามคำถามเกี่ยวกับ Oracle Database ค่ะการ Reorganization DB คืออะไรมีประโยชน์ยังไง เพื่ออะไรคะ แล้วส่งผลอะไรให้กับ DB เราบ้างตรวจสอบยังไงว่ามีการ Reorganization แล้วค่ะ ขอบคุณล่วงหน้าค่ะ

Anonymous said...

สวัสดีค่ะ ขอถามคำถามเกี่ยวกับ Oracle Form ค่ะ คือ ถ้าเราต้องการให้ application อื่น มาเรียกใช้ Oracle Form มีวิธีอย่างไรบ้างคะ ต้องลงอะไร หรือ Config ยังไงคะ รบกวนช่วยตอบด้วยค่ะ ขอยคุณมากต่ะ

Anonymous said...

อยากรู้สายงานด้าน ORACLE ค่ะ?

คือ ตอนนี้เพิ่งเรียนจบมาใหม่ๆ และ เข้าอบรมกับ Oracle Thailand อยู่ โดยส่วนตัวมีความสนใจงานพวก ERP เลยอยากให้พี่ๆ ช่วยแนะนำแนวทางการทำงานด้านนี้ด้วยค่ะ ว่าคารศึกษาอะไรเพิ่มเติม และทำงานที่ไหนดี สายงานเปนอย่างไรบ้างค่ะ


ขอขอบคุนล่วงหน้านะคะ
เข้ามาอ่านบล็กนี้แล้วได้ความรู้เยอะดีอ่า ชอบๆ

แอดเมลมาคุยกันได้นะคะ c_maytita@hotmail.com

Anonymous said...

สวัสดีครับ ขอถาม เรื่อง performance tuning ของ oracle database นะครับ

ถ้าหาก Library Hit Ratio ต่ำ กว่า 95% จะเกิด effect อะไรบ้างครับ

เราสามารถ ignore มันได้ไหม หรือว่า ควรจะต้องให้มากกว่า 95% อยู่ตลอดเวลาครับ

และถ้าหากอยู่ในเคสที่ memory ไม่พอ
จำเป็นต้องเลือก ระหว่าง db_hit_ration กับ library hit ratio อย่างได้แค่อย่างหนึ่ง ให้มากกว่า 95% ควรจะเลือกอะไรครับ เพราะอะไรครับ

ขอบคุณครับ

cherrymckwai said...

ตอบปัญหาเรื่อง Reorg DB

โดยปรกติเมื่อเราต้องการเปลี่ยนแปลงแก้ไขข้อมูลใน DB เราก็เพียงแต่สั่ง Insert, Delete หรือ Update ตามเงื่อนไขที่เราต้องการ โดยไม่ต้องสนใจว่า DB จะมีการจัดการข้อมูลเหล่านั้นอย่างไร เพียงแต่ในความเป็นจริงแล้ว การจัดการข้อมูลเหล่านี้เอง ที่ก่อให้เกิดปัญหาในเรื่องของการใช้พื้นที่ เช่น การ Delete ข้อมูลใน DB นั้น เราอาจจะเห็นข้อมูลใน Table นั้นถูกลบออกไปจากฐานข้อมูลแล้วก็จริง หากแต่ Data Block ที่เคยเก็บข้อมูลดังกล่าวจะไม่ถูก Clear เป็น Free Block เพียงแต่จะถูก Mark เป็น Empty Block เท่านั้น ซึ่ง Empty Block นี้จะไม่สามารถนำกลับมาใช้ใหม่ได้ จนกว่าจะมีการ Clear เป็น Free Block หรือแม้แต่การ Update ข้อมูลใน Record ใดๆ แล้วขนาดของข้อมูลใหญ่ขึ้น ไม่สามารถที่จะเก็บลงใน Data Block เดิมได้ DB จำเป็นต้องหา Free Block เพื่อมาเก็บข้อมูลในส่วนนี้แทน ซึ่งเหตุการณ์ดังกล่าว อาจทำให้เกิด Row Chaining หรือ Row Migration ได้ โดย Row Chaining ก็คือการที่ Oracle จะย้ายเฉพาะส่วนที่ถูก Update ใหม่ของ Row ที่มีขนาดใหญ่ ไปไว้ที่ Data Block อื่นๆ ที่ว่าง ภายใน Tablespace เดียวกัน ในขณะที่ Row Migration นั้น จะทำการย้ายทั้ง Row เลย โดย Block เก่า ก็จะมี Pointer ชี้ไปหา Block ใหม่ นั่นหมายความว่า การ Read Record ใดๆ ที่มี Row Chaining หรือ Row Migration I/O จะถูกทำงานมากกว่า 1 ครั้ง ขึ้นอยู่กับว่าข้อมูลมีการกระจายตัวมากขนาดไหน

ดังนั้น หาก DB เรามีการเปลี่ยนแปลงแก้ไขข้อมูลมากครั้งเท่าไหร่ โอกาสที่จะเกิด Disorganization ก็ยิ่งมีมากขึ้นเท่านั้น และแน่นอนว่า มันจะกระทบกับ Performance ของ Database ด้วย

การ Reorganization DB ก็คือการจัดการแก้ปัญหาในเรื่องของการใช้พื้นที่ อันเกิดจากการใช้งานนั่นเอง พูดง่ายๆ ก็เหมือนกันการทำ Disk Defragment ให้กับ Disk ของเรานะแหละค่ะ แน่นอนว่า การทำ Reorg ก็จะช่วยให้เราสามารถ Maintain Performance ของ Database ได้ด้วยค่ะ

cherrymckwai said...

สำหรับ Oracle Form นะค่ะ ไม่แน่ใจว่าเป็น Oracle Form version ไหนค่ะ แล้ว Application ที่จะมาเรียกใช้เนี่ย เป็น Application แบบไหนค่ะ แล้วมี Form Server อยู่แล้วหรือเปล่าค่ะ พอดีว่ารายละเอียดน้อยไปหน่อย รบกวนขอรายละเอียดเพิ่มอีกนิดนะค่ะ

ขอบคุณค่ะ

cherrymckwai said...

ตอบคุณ Mayreez,

ถ้าพูดถึงสายงาน ERP คงจะเน้นหนักไปในทาง Functional Consult ใช่มั้ยค่ะ ถ้าเป็นอย่างนั้น
ก็ควรจะมีพื้นฐานในสายบัญชี จะได้เปรียบค่ะ
เพราะสามารถทำความเข้าใจกับ User ได้ง่าย

งาน Consult ได้ความรู้เยอะค่ะ ต้องรู้หลายๆ ด้าน แต่ก็เป็นงานที่เหนื่อยพอตัวเลยค่ะ เพราะว่าต้อง deal งานกับคน แถมบางงานต้องทำแข่งกับเวลาด้วย อดหลับอดนอน เป็นเรื่องปรกติค่ะ

ขอให้โชคดีกับงานนะค่ะ

cherrymckwai said...

ตอบเรื่อง Performance Tuning ของ Oracle

Library cache นั้นจะเก็บ SQL หรือ PL/SQL code ที่เคยถูก execute ไปแล้วไว้ โดย Library cache hit จะเกิดขึ้นเมื่อ SQL หรือ PL/SQL code ที่เราต้องการเรียกใช้นั้นมีอยู่ใน Library cache และสามารถที่จะ execute ได้ กล่าวได้ว่า Library cache นั้นช่วยลดขั้นตอนการ parsing นั่นเอง

ในขณะที่ Data buffer hit ratio นั้นเป็นตัววัดประสิทธิผลของการ buffer data block กล่าวคือ ยิ่งโอกาสที่ Oracle สืบค้นเจอ data block ใน memory และหลีกเลี่ยงการอ่านจาก Disk I/O ได้บ่อยครั้งเท่าไหร่ ค่าของ Data buffer hit ratio ก็จะมีค่ามากเท่านั้น

การที่ Library hit ratio มีค่าต่ำนั้น เป็นได้หลายสาเหตุ เช่น shared pool size มีค่าน้อยไป หรืออาจเป็นเพราะ SQL หรือ PL/SQL code ที่มีใช้ในระบบนั้น ไม่สามารถใช้งานร่วมกันได้ เนื่องจาก code ดังกล่าวไม่เคยถูก cache มาก่อน หรืออาจจะเก่าจนไม่อยู่ใน shared pool แล้วก็เป็นได้ค่ะ เพื่อให้การประเมินผลนั้น เชื่อถือได้ ควรจะวัดเป็นเป็นช่วงระยะเวลา แล้วดูแนวโ้น้มของค่า ratio ต่างๆ จะดีกว่าค่ะ

การปรับแต่งค่าเพื่อให้ได้ ratio ที่สูงทั้งสอง ratio นั้น มีทางเป็นไปได้ค่ะ ถ้าใช้ 10g อยู่ ให้ลองใช้ advisory utilities ดูนะค่ะ

IaM said...

อยากให้ช่วยอธิบาย SGA แต่ละส่วนด้วยค่ะ
แล้วอยากจะทราบว่า value ที่ได้ต้องเข้าไปดูที่ table ไหนอย่างไรบ้างคะ

ขอบคุณค่ะ

Anonymous said...

จะเพิ่มข้อมูลลง oracle 10g express edition ใช้ vb.net 2005
เกิด error ORA-12154: TNS:could not resolve the connect identifier specified เป็นเพราะอะไรค่ะ ช่วยหน่อยค่ะ
ขอบคุณค่ะ

cherrymckwai said...

ตอบคุณ iam

SGA หรือ System Global Area เป็นส่วนของ shared memory ที่ใช้งานใน Oracle Instance ประกอบด้วย 6 ส่วน แยกออกเป็น 3 ส่วนที่เป็น Required Component และ 3 ส่วนที่เป็น Optional Component ค่ะ

ส่วน Required Component ได้แก่

- Database Buffer Cache: ใช้ cache ข้อมูล หรือก็คือ Data Block ที่ถูกเรียกโดย database user บ่อยครั้งที่สุด เพื่อลดการเข้าถึงข้อมูลใน database โดยตรง และยังช่วยทำให้ลดการทำงานกับ Disk I/O อีกด้วย

- Redo Log Buffer: ใช้ cache ข้อมูล transaction เพื่อใช้สำหรับการทำ Instance recovery ในกรณีที่ transaction นั้นยังไม่ถูกบันทึกลงใน data block แต่เกิดปัญหากับ database เสียก่อน ทั้งนี้เพื่อให้เกิดความถูกต้องของข้อมูลนั่นเอง

- Shared Pool: ใช้ cache SQL statement ที่ถูกเรียกใช้จาก database users บ่อยครั้งที่สุดไว้ โดยจะทำหน้าที่เหมือนตัว share SQL ซึ่งจะช่วยลดขั้นตอนในการ parsing ในกรณีที่ SQL statement นั้นเคยถูกเรียกใช้มาก่อน และยังคงอยู่ใน shared pool นั่นเอง


ส่วน Optional Component ได้แก่

- Large Pool: ใช้ cache การทำงานขนาดใหญ่ เช่น การ backup และ restore โดยใช้ RMAN (Recovery Manager) หรือใช้รองรับ Component ต่างๆ เช่น User session ในกรณีที่ Database Server เป็น Shared Server (ในกรณีที่ Database Server เป็น Dedicated Server นั้น User session จะอยู่ใน PGA)

- Java Pool: ใช้ cache object ต่างๆ ที่เป็น java ที่มีการเรียกใช้บ่อยครั้งที่สุด โดย Java Pool จะถูกใช้เมื่อมีการใช้ Option ORACLE JVM

- Streams Pool: เป็นส่วนที่เพิ่มขึ้นมาใน oracle 10g โดยจะ cache ข้อมูลต่างๆ ที่เกี่ยวข้องกับการจัดลำดับ message ถูกใช้โดย Oracle Streams จะถูกใช้เมื่อมีการใช้ Option Oracle Advanced Queuing

cherrymckwai said...

เกี่ยวกับ ORA-12154 ขอถามเพิ่มเติมนะค่ะ

1. ลอง connect ด้วย tool อื่นๆ โดยใช้ database connection นี้ผ่านหรือไม่ค่ะ

2. file tns ที่สร้างนี่ สร้างด้วยวิธีไหนค่ะ ได้ใช้ oracle net manager หรือไม่ค่ะ

3. ไม่ทราบว่ามี Oracle home กี่ Home ค่ะ

cherrymckwai said...

ตอบคุณ iam

สำหรับค่าของ sga นั้นสามารถดูได้จาก performance view ดังนี้ค่

v$sga
v$sga_dynamic_components

Anonymous said...

ขอตัวอย่างการเรียกใช้ webservice จาก Oracle 10g ค่ะ ว่าต้องทำยังไงบ้าง ลองทำโดยใช้ตัวอย่างจาก web ของ oracle แต่ว่ามี error ตอนที่ Load Oracle SOAP client
ORA-01775:Looping chain of synonyms.

cherrymckwai said...

สวัสดีค่ะ เกี่ยวกับการเรียกใช้ webservice จาก Oracle 10g ที่บอกว่าลองใช้ตัวอย่างจาก web ของ oracle ไม่ทราบว่า เป็นตัวอย่างไหนค่ะ ลองส่ง URL มาให้ทดลองดูหน่อยได้มั้ยค่ะ เพราะเท่าที่ดูจาก Error ที่เกิดขึ้นเนี่ย เกิดเนื่องจากมีการสร้าง Synonyms ซ้อนกันนะค่ะ เช่น
- CREATE SYNONYM s1 for s2
- CREATE SYNONYM s2 for s3
- CREATE SYNONYM s3 for s1

เลยไม่แน่ใจว่า เกิดจากขั้นตอนไหนนะค่ะ

IaM said...

รบกวนสอบถามและอธิบาย role privilage ซึ่งอยากจะทราบว่าถ้าเราจะ grant ให้ user เป็น connect ,resource แล้วทั้ง connect ,resource สามารถทำอะไรได้บ้างคะ

ขอบคุณค่ะ

IaM said...

เพิ่มเติมค่ะให้อธิบายแต่ละตัวต่อไปนี้อ่ะค่ะ ว่าคืออะไร
พอดีว่ายังไม่ค่อยเข้าใจน่ะค่ะว่าใช้ยังไง

- CONNECT :
ALTER SESSION,
CREATE CLUSTER,
CREATE DATABASE LINK,
CREATE SEQUENCE,
CREATE SESSION,
CREATE SYNONYM,
CREATE TABLE,
CREATE VIEW
- RESOURCE :
CREATE CLUSTER,
CREATE INDEXTYPE,
CREATE OPERATOR,
CREATE PROCEDURE,
CREATE SEQUENCE,
CREATE TABLE,
CREATE TRIGGER,
CREATE TYPE

ขอบคุณค่ะ

cherrymckwai said...

ตอบคุณ iam

ที่ถามมาทั้งหมดคือ System Privilege ค่ะ โดยแต่ละ Privilege จะอนุญาตให้ผู้ได้รับสิทธิสามารถกระทำกับ Database ได้ ซึ่งแต่ละสิทธิที่ถามมามีรายละเอียดดังนี้ค่ะ

- ALTER SESSION เป็นสิทธิที่อนุญาตให้ผู้ได้รับสิทธิ สามารถแก้ไข parameter ต่างๆได้ โดยค่าดังกล่าวจะมีผลกับ session นั้นๆ เท่านั้น และจะสิ้นสุดลงเมื่อออกจาก session เช่นการแก้ DATE FORMAT เป็นต้น

- CREATE CLUSTER เป็นสิทธิที่อนุญาตให้ผู้ได้รับสิทธิ สามารถสร้าง CLUSTER ได้ภายใน schema ของตัวเองเท่านั้น ซึ่ง CLUSTER ก็คือ Object ที่เก็บรวบรวมข้อมูลมาจากหลายๆ Table โดย Oracle จะเก็บ row ของทุก Table ที่มี cluster key เดียวกัน ไว้ด้วยกัน

- CREATE DATABASE LINK อนุญาตให้ผู้ได้รับสิทธิ สามารถสร้าง Private Database Link ไว้ภายใน schema ของตัวเองได้

- CREATE SEQUENCE
อนุญาตให้ผู้ได้รับสิทธิ สามารถสร้าง SEQUENCE ไว้ภายใน schema ของตัวเองได้

- CREATE SESSION อนุญาตให้ผู้ได้รับสิทธิสามารถ connect มาที่ database ได้

- CREATE SYNONYM อนุญาตให้ผู้ได้รับสิทธิ สามารถสร้าง SYNONYM ไว้ภายใน schema ของตัวเองได้

- CREATE TABLE อนุญาตให้ผู้ได้รับสิทธิสามารถสร้าง TABLE ไว้ภายใน schema ของตัวเองได้

- CREATE VIEW อนุญาตให้ผู้ได้รับสิทธิ สามารถสร้าง VIEW ไว้ภายใน schema ของตัวเองได้

- CREATE INDEXTYPE อนุญาตให้ผู้ได้รับสิทธิ สามารถสร้าง INDEXTYPE ไว้ภายใน schema ของตัวเองได้

- CREATE OPERATOR อนุญาตให้ผู้ได้รับสิทธิ สามารถสร้าง OPERATOR และ binding ไว้ภายใน schema ของตัวเองได้

- CREATE PROCEDURE อนุญาตให้ผู้ได้รับสิทธิ สามารถสร้าง PROCEDURE, FUNCTION และ PACKAGE ไว้ภายใน schema ของตัวเองได้

- CREATE TRIGGER อนุญาตให้ผู้ได้รับสิทธิสามารถสร้าง database trigger ภายใน schema ของตัวเองได้

- CREATE TYPE อนุญาตให้ผู้ได้รับสิทธิสามารถสร้าง TYPE ภายใน schema ของตัวเองได้

ปล. การ Grant Role ที่ชื่อว่า RESOURCE ให้กับ User ใดๆ หมายถึงการให้ quota แบบ unlimited ในทุกๆ tablespace กับ user นั้นๆ ด้วยนะค่ะ

IaM said...

ขอบคุณ คุณ cherrymckwai มากค่ะที่ตอบคำถามให้ค่ะ แต่ขอรบกวนอีกนิดค่ะ ว่า

CLUSTER,
INDEXTYPE,
OPERATOR,
PROCEDURE,
SEQUENCE,
TRIGGER,
TYPE คืออะไร แล้วนำไปใช้ยังไง

ขอบคุณค่ะ

Anonymous said...

อยากทราบวิธีการแสดง webpage บน form ครับ
โดยใช้ developer 10g ครับ
มี Item ไหนที่พอจะใช้ไดบ้างครับ

คือเรามี Link webpage ที่เป็นประกาศ แล้วอยากจะนำมาแสดงบน Form นะครับ

ขอบคุณล่วงหน้าครับ

cherrymckwai said...

ตอบคุณ wint.c

ลองใช้ WEB.SHOW_DOCUMENT(URL, Target) ดูนะค่ะ
วิธีใช้ก็
WEB.SHOW_DOCUMENT('http://www.oracle.com','_blank');

สำหรับ Target สามารถกำหนดได้ดังนี้ค่ะ
_blank คือให้เปิด URL นี้ในหน้า Browser ใหม่
_self คือให้เปิด URL นี้ในหน้า Browser เดิม

Anonymous said...

แบบนี้ต้อง คลิ๊ก Link เพื่อเปิดหน้าต่างใหม่ใช่ไหมครับ

คือผมอยากได้แสดงบน Form เลยครับ

พอมีวิธีไหมครับ

cherrymckwai said...

ตอบคุณ winit.c

ลองดูตาม link นี้นะค่ะ ใช้ตัว java bean มาช่วย
ไม่รู้ว่าใช่อย่างที่คุณ winit.c กำลังต้องการรึเปล่า

http://forms.pjc.bean.over-blog.com/article-1890238.html

cherrymckwai said...

ตอบคุณ iam

ก่อนอื่น ต้องขอโทษด้วยนะค่ะ ที่ิทิ้งช่วงไปนาน กว่าจะมาตอบคำถามให้ พอดีว่า ต้องรวบรวมความคิดสักหน่อยนะค่ะ เดี๋ยวจะอธิบายไม่รู้เรื่องเอา มาดูรายละเอียดทีละอันกันเลยนะค่ะ

1. CLUSTER เป็น object นึงใน Oracle Database เป็นทางเลือกหนึ่งในการเก็บข้อมูลค่ะ โดย Cluster จะเก็บ Record จากหลายๆ Table ที่มีการ Share column ร่วมกัน หรือที่เรียกว่า cluster key ไว้ที่ data block เดียวกันค่ะ เช่น table emp กับ dept นั้นจะมี column deptno ที่ใช้ร่วมกันอยู่ เมื่อเราสร้าง Cluster ของ table emp และ dept ขึ้น Oracle Database จะทำการเก็บข้อมูลสำหรับแต่ละ department จาก table emp และ dept ไว้ภายใต้ data block เดียวกันค่ะ

ข้อดี ก็คือ มันลดการใช้ Disk I/O เวลาที่มีการ join กันระหว่าง 2 table ค่ะ ทำให้ query ข้อมูลที่มีการ join ได้เร็วขึ้น พูดง่ายๆ ก็คือ มันทำการ join กันตั้งแต่ก่อนที่จะเก็บข้อมูลลงใน cluster table แล้วนั่นเอง

cherrymckwai said...

2. PROCEDURE เป็น Object ที่ช่วยให้เราสามารถสร้าง Procedural Language มาจัดการกับ Oracle Database หรือที่เรารู้จักกันในชื่อว่า PL/SQL ได้ค่ะ โดยเราสามารถสร้าง Program Unit ในรูป Procedure, Function หรือ Package ได้ค่ะ

3. SEQUENCE เป็น Object ที่ไช้สำหรับสร้าง sequential number ที่ไม่ซ้ำกันค่ะ โดยขั้นตอนการสร้างนั้น ไม่ทำให้เกิด overhead กับ disk I/O และยังไม่ทำให้เกิดการ Locking ด้วยค่ะ กล่าวคือ Sequence จะทำการสร้างตัวเลขใหม่ทุกครั้งที่มีการเรียกใช้ค่ะ ส่วนมากนิยมใช้ใสการสร้าง Primary Key ซึ่งถ้าเราใช้วิธีการสร้าง key ดังกล่าวเอง อาจเสี่ยงต่อการเกิดตัวเลขที่ซ้ำกันได้ หรือเกิดการ lock กันเองระหว่างแต่ละ session ได้ค่ะ


4. TRIGGER เป็น stored procedure แบบหนึ่งค่ะ โดยจะทำงานควบคู่กับ event หรือเหตุการณ์ใดๆ ค่ะ เช่น Trigger สำหรับ before insert บน table emp จะทำงานเมื่อมีการสั่ง insert into emp ค่ะ โดยก่อนที่จะทำการ insert นั้น จะต้องทำในส่วนของ Trigger นี้ก่อน โดยอาจจะให้ใส่ Primary key สำหรับ table emp โดยการไปเรียกใช้ sequence ที่เราสร้างขึ้นมาก็ได้ค่ะ

คราวหน้าจะมาต่อในส่วนที่เหลือนะค่ะ

Unknown said...

มีการบ้านมาแต่ผมไม่เข้าใจโจทย์อาจารย์อะครับเค้าให้ทำพวกนี้ใน 10G ช่วยนิยามให้ผมใหม่หน่อยครับ

-การยกเลิกบริการของระบบฐานข้อมูลที่ไม่จำเป็น
-การยกเลิกสิทธิและฐานข้อมูลตัวอย่างที่ติดตั้งมากับระบบฐานข้อมูล
-การปรับปรุงเวอร์ชั่นของระบบบริการจัดการฐานข้อมูล

Unknown said...

ยกตัวอย่างให้ด้วยก็ดีนะครับ

ขอบคุนน้าครับ T___T

cherrymckwai said...

ตอบคุณ chatchai

ไม่แน่ใจว่าเข้าใจถูกหรือเปล่านะค่ะ

- การยกเลิกบริการของระบบฐานข้อมูลที่ไม่จำเป็น

อันนี้หมายถึงพวก Database Option รึเปล่าค่ะ เช่นพวก Label security, Data Mining, Oracle Text etc

- การยกเลิกสิทธิและฐานข้อมูลตัวอย่างที่ติดตั้งมากับระบบฐานข้อมูล

อันนี้จะหมายถึง Rule กับพวก Sample Schema รึเปล่า ไม่แน่ใจ

สองอันบนนี่ น่าจะเกี่ยวกับ Database Configuration Assistant

- การปรับปรุงเวอร์ชั่นของระบบบริการจัดการฐานข้อมูล

อันนี้ น่าจะเกี่ยวข้องกับการ Upgrade ถ้าเกิดว่าเป็นการ Upgrade ภายใน Version ก็จะเป็นเรื่องของ Patch เช่นจาก 10.2.0.1 เป็น 10.2.0.5 แต่ถ้าเป็นการ Upgrade ข้าม Version ก็จะต้องทำผ่าน Tool อย่าง Database Upgrade Assistant ค่ะ

หวังว่าคงช่วยได้บ้างนะค่ะ

Unknown said...

ขอบคุน คุณ cherrymckwai มากนะครับที่นิยามให้

เด๋วผมลองหาวิธีตามที่คุณบอกก่อนนะครับ ไงก็ขอบคุณมากๆเลยครับ ^^

Anonymous said...

อยากทราบว่า bulk size ที่อยู่ใน configuration ใน runtime parameter ใน oracle warehouse builder คืออะไรคะ แล้วต้องกำหนดขนาดยังไง

ขอบคุณล่วงหน้าคะ

cherrymckwai said...
This comment has been removed by the author.
cherrymckwai said...

เกี่ยวกับ Bulk Size ใน OWB เป็นตัวกำหนดจำนวน row สำหรับแต่ละ BULK ที่ใช้เวลา Process PL/SQL ค่ะ

ปรกติขนาดของ Bulk Size จะต้องสัมพันธ์กับ Commit Frequency ค่ะ โดยจะใช้เมื่อเป็น Operating Mode เป็น Row based ค่ะ

ขนาด ที่ควรกำหนดนั้น ขึ้นอยู่กับขนาดของ Data ที่เรา Load ด้วยค่ะ ถ้ากำหนดน้อยไป ก็จะเกิดการ commit ถี่ขึ้น ซึ่งอาจส่งผลให้เกิดการใช้พื้นที่ใน undo segment ที่ทับซ้อนกันได้ แต่ถ้ากำหนดขนาดใหญ่ไป ก็ส่งผลกับ Performance ได้ค่ะ

Anonymous said...

ขอบคุณนะคะ สำหรับคำตอบของ bulk size

Anonymous said...

แล้วถ้าทำ bulk collect กับการทำเป็น cursor มันต่างกันยังไง และข้อดีข้อเสียมันเป็นยังไงมั้ง ค่ะ

แล้วอีกคำถามนะค่ะ
พวก operation mode พวกนี้อะค่ะ มันคืออะไรแล้วควรจะใช้เมื่อไรค่ะ
- Set based
- Set based fail over to row based (target only)
- Set based fail over to row based
- Row based (target only)
- Row based

ขอบคุณค่ะ

cherrymckwai said...

ก่อนอื่นต้องบอกก่อนว่า Bulk Collect กับ Cursor นั้น ไม่ใช่สิ่งที่ใช้แทนกันนะค่ะ แต่เป็นสิ่งที่ใช้งานร่วมกัน ความหมายของ Bulk Collect คือการเก็บ output เป็น result set แทนที่จะเก็บมาทีละ record ซึ่งจะให้ผลดีในเรื่องของประสิทธิภาพการประมวลผลค่ะ โดยปรกติแล้ว Cursor นั้นจะทำการ Fetch รายการมาประมวลผลทีละ record แต่ถ้าเราระบุ BULK COLLECT ลงไปตอนที่สั่ง Fetch มันจะทำการดึงขึ้นมาหลายๆ row พร้อมๆ กัน แล้วเก็บลงใน memory ค่ะ

สำหรับ Operation Mode มีความหมายดังนี้ค่ะ

Set Based: owb จะทำการสร้าง sql statement มา statement เดียว เพื่อที่จะดึงข้อมูลท้งหมดไปประมวลผลค่ะ ข้อดีคือ เร็ว แต่ข้อเสียคือการทำ audit ค่ะ หมายถึงจะไม่สามารถทราบได้ว่าเกิดปัญหาขึ้นที่ row ไหน

Row Based: owb จะทำการสร้าง sql ที่ process งานทีละ row ปรกติจะทำเป็น cursor ข้อดีคือ เราจะสามารถ audit ข้อมูลในระดับ row ได้เลย (เฉพาะงานที่ทำใน cursor เท่านั้นนะค่ะ ที่ดูระดับ row ได้) แต่ข้อเสียคือ ช้ามากถ้าข้อมูลมีขนาดใหญ่

Row Based (Target Only): จะคล้ายๆ กับ Row Based นะค่ะ แต่จะทำระดับ row เฉพาะการ Load data ไปที่ table ปลายทางเท่านั้น ส่วนก่อนหน้าที่จะมาถึงการ Load เข้า Target Table ก็จะประมวลผลในรูปแบบของ Set Based ซึ่งข้อดีก็คือ เร็วกว่า row based ปรกติ แถมยังได้ audit รายการที่จะลง target table ด้วยค่ะ

ส่วนของ Set Based fail over to row based ก็คือระบบจะประมวลผลในรูปแบบของ Set Based ก่อนค่ะ ถ้าเกิดว่ามี error เกิดขึ้น ก็จะย้ายไปประมวลผลในรูปแบบของ row based แทน

Anonymous said...

ขอบคุณนะคะ สำหรับคำตอบ bulk collect ตอบละเอียดดีมากเลยคะ

Anonymous said...

หวัดดีคะ คุณ cherrymckwai
คือ อยากทราบว่า Partition Exchange Loading(PEL) ตามความเข้าใจ คือ เทคนิคการ load data from source to target partition table คะ
แต่อยากรู้หลักการการทำงานที่มันละเอียดกว่านี้อะคะ

และก็รู้ว่า PEL แบ่งเป็น
1. Direct เร็วกว่า Indirect
2. Indirect
อยากทราบว่าระหว่าง 2 อันนี้ มันต่างกันยังไงหรอคะ แล้วแต่ละอันควรจะใช้เมื่อไหร่

ขอบคุณล่วงหน้านะคะ
itzaa

cherrymckwai said...

ตอบคุณ itzaa

หลักการทำงานของ Partition Exchange Loading ใน OWB นั้น จะทำการ Load ข้อมูลจาก Source table ไปยัง Partition ใดๆ ของ Target table ขั้นตอนในส่วนนี้เป็น DDL (Data Definition Language) ซึ่งจะไม่มีการเคลื่อนย้ายข้อมูลจริง (ไม่มีการ insert data จาก source ไป target นั่นเอง) แต่เหมือนเป็นการแลกเปลี่ยน identities ของ Segment นั้นๆ แทน

มองภาพง่ายๆ ก็เช่น
ถ้าเรามี Source Table กับ Target table ที่มี Partition อยู่ 4 Partitions

(Source) (Target P1, P2, P3, P4)

หากข้อมูลที่เรา Load เข้าไป จะต้อง Load ไปที่ Partition ที่ 3 ของ Target table แล้วนั้น PEL จะทำการแลกเปลี่ยน identity ของ Source Table กับ Partition 3 ของ Target Table ให้ ก็จะกลายเป็น

(Target P3) (Target P1, P2, Source, P4)

ก็คือ ข้อมูล หรือ Segment ที่เดิม เคยเป็นของ Source ก็จะถูกย้ายหรือเปลี่ยนไปเป็นของ Target Table ที่ Partition 3 แทน ในขณะที่ข้อมูล หรือ Segment ที่เป็นของ Target Partition 3 ก็จะถูกเปลี่ยนเป็นของ Source แทนค่ะ

ในส่วนของ Direct กับ Indirect นั้น แตกต่างกันนิดหน่อยค่ะ

สำหรับ Direct นั้น หมายถึงว่า เรามี Source Table ให้กับ OWB แล้ว ดังนั้น OWB จะทำ PEL ระหว่าง Source Table กับ Target Table ที่เรากำหนด

ส่วน Indirect นั้น OWB จะทำการสร้าง Temp table ขึ้นมาค่ะ โดยจะเลียนแบบ Structure ของ Source Table ทั้งหมด ยกเว้นแต่ว่า ไม่ได้กำหนดเป็น Partition Table เท่านั้น แล้วจะทำการ PEL ระหว่าง Temp Source กับ Target Table และเมื่อเสร็จสิ้น Process ก็จะทำการลบ Temp Source นี้ออกไปจาก Database ให้ด้วยค่ะ

ดังนั้น หากพูดถึง Process แล้ว การทำ Direct ก็ควรจะเร็วกว่า Indirect ค่ะ

หวังว่าพอจะได้คำตอบนะค่ะ

Anonymous said...

คำตอบช่วยได้เยอะเลยคะ
จะลองนำ concept ไปทำต่อคะ
ขอบคุณมากคะ

itzaa..(*^_^*)

Anonymous said...

อยากทราบว่าใน Owb สามารถเรียก ชื่อ partition ได้โดยตรงเลยหรือป่าวค่ะ เพราะ ตอนนี้ แบ่ง partition เป็น แบบ range แล้วก้ใช้ where ตามเงื่อนไขที่กำหนดในการแบ่ง partition แล้ว เอาไป join กับ partion อื่นๆ โดยใช้ where ตามเงื่อนไขที่แบ่งเช่นกัน แล้วinsert ลง target แต่ ปรากฎว่า มันช้ามากค่ะ พอมาดูมันไม่ได้เข้า partition เลยค่ะ มันเอาทั้ง table มา join กันเลย ทำให้ช้ามากๆ คือถ้าทำใน toad ใช้เวลาแค่ 10 นาที (ระบุ ชื่อ partition นะค่ะ) แต่มาทำใน owb ใช้เวลาเป็น ชม. เลยค่ะ พอจะมีอะไรแนะนำได้ไหมค่ะ เพราะลอง set ค่าใน owb ทั้ง insert append nologging , audit level เป็น null ,ทำ PEL แต่มันก้ยังช้า อยุ่ดีอะค่ะ

ขอบคุณล่วงหน้านะคะ
itzaa

cherrymckwai said...

ใน owb ระบุ partition ไม่ได้ค่ะ อาจจะใช้วิธี filter ด้วยเงื่อนไขของ Partition key ก่อน แล้วค่อยนำมา join กัน หรือใช้วิธีการสร้าง view โดยกำหนด partition ที่ต้องการเลือก ขึ้นมา ก็ได้ค่ะ

Anonymous said...

อืม ถ้า owb ระบุ partition ไม่ได้
งั้นคงต้องลองวิธีอื่นดูคะ
ขอบคุณคะสำหรับคำแนะนำแล้วจะนำไปใช้ดูค่ะ
itzaa (^,^)

Anonymous said...

รบกวนสอบถามหน่อยคับ ปัจจบัน ผมใช้ Forms 6i ของ oracle แต่เนื่องจาก ต่อไปต้องการเปลี่ยนไปเป็น web app โดยใช้ .net พัฒนา แต่เนื่องจากติดปัญหาว่าตอนนี้ มี forms ที่เขียนขึ้นมา มากกว่า 1000 + เลย อยากสอบถามว่า พอมีวิธีแปลงจาก Oracle 6i ไปเป็น .net ไหมคับ และ ตัว Oracle Releases Developer Tools For Visual Studio .Net 2005 มันทำได้ไหมอ่ะคับ รบกวนด้วยน่ะคับ

cherrymckwai said...

ตอบคุณ chaiclub

เท่าที่ทราบ ก็น่าจะเป็นตัว Forms2Net นะค่ะ เห็นมีตัว Analyzer กับตัว Converter ให้ Load แต่ตัว Converter รู้สึกจะต้องเสียตังค์นะค่ะ เห็นว่าตัวนี้เป็น Microsoft Certified นะค่ะ

ส่วของ Oracle Developer Tools For Visual Studio .Net 2005 เป็น Plug-in ที่ช่วยให้การสร้าง Application .NET ที่ใช้งาน Oracle DB ทำได้ง่ายขึ้นค่ะ ไม่ใช่ Tool สำหรับการ Migrate จาก Form ไปเป็น .NET แน่นอนค่ะ

สำหรับ Oracle คาดว่าคงไม่มี Tool สำหรับ Migrate ไปเป็น .NET แน่นอนค่ะ เพราะว่ามันเป็นการทำให้เสียลูกค้า อันนี้อาจจะลองถามทางฝั่ง Microsoft เพิ่มเติมดูนะค่ะ ว่าพอจะมี Tool ให้หรือเปล่า หรือว่าต้องหาจาก 3rd party เท่านั้น

ขอบคุณค่ะ

GMz said...

ผมใช้ Oracle 10g XE บน Ubuntu กำหนดทุกอย่างตามเว็บนี้ https://help.ubuntu.com/community/Oracle10g

พอใช้คำสั่ง
$ impdp SYSTEM/oracle SCHEMAS=PANIT DIRECTORY=pumpdir DUMPFILE=PANITDUMP.DMP REMAP_SCHEMA=PANIT:ACC EXCLUDE=constraint, ref_constraint, index TABLE_EXISTS_ACTION=replace LOGFILE=impschema.log

ได้ Error แบบนี้ครับ หาวิธีแก้ไขไม่ได้
ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 475
ORA-29283: invalid file operation

ช่วยหน่อยนะครับ

cherrymckwai said...

ตอบคุณ OO

เท่าที่เห็นเป็นคำสั่ง import แล้วตอนที่ export ออกมามีปัญหาอะไรมั้ยค่ะ

จาก Error ที่เกิดขึ้น รบกวนคุณ OO ช่วยตรวจสอบดังนี้นะค่ะ
1. Permission ของ DIRECTORY pumpdir
2. Log file ที่อยู่ภายใต้ DIRECTORY มีอยู่หรือไม่ ถ้ามี ชื่อไฟล์สะกดถูกหรือไม่ (Case sensitive) และมี Permission เป็นอะไร

ถ้าเป็นปัญหาเรื่อง Permission ให้ลอง set เป็น 777 ดูก่อนนะค่ะ

Anonymous said...

รบกวนสอบถามหน่อยน่ะคับ ถ้าผมจะแปลง Forms 6i ไปเป็น web app ผมต้องใช้ tool อารายบ้างอ่ะคับ แล้ว มีขั้นตอนการทำยังงัยบ้างคับ แล้ว อีก 1 คำถามน่ะคับ ตอนนี้ ผมใช้ oracle 10.2.0.1 บน window server2003 คับ ซึ่ง มีจำกัดในเรื่อง memory ที่ เห็น แค่ 2 GB ม่ายทราบว่า มี patch upgrade ไหมคับ ขอบคุณมากน่ะคับ

cherrymckwai said...

ตอบคุณ chaiclub

กรณีแปลง Form 6i ไปเป็น web app จะใช้ tool อะไรนั้น ขออนุญาติตอบบนพื้นฐาน Product ของ Oracle ก่อนนะค่ะ

ถ้า จะทำ web app สำหรับ Form ก็ต้องมี Form Server ค่ะ ซึ่งจะอยู่ในส่วนของ Oracle iAS (Application Server) ซึ่งถ้าจะใช้สำหรับ Form 6i ก็คงต้องเป็น 9iAS Release 1 ค่ะ ส่วนขั้นตอนและวิธีการ จะแบ่งเป็น 2 ส่วนหลักๆ คือส่วนของการ Config Server และส่วนของการ Deploy Form ค่ะ

กรณีที่จะใช้ iAS version ที่ใหม่กว่านี้ จำเป็นต้อง migrate Form จาก version 6i เป็น version ที่ใหม่กว่าตามด้วยค่ะ เนื่องจากบาง feature/function อาจจะ obsolete ไปค่ะ

ส่วนกรณีที่ต้องการ convert Oracle Forms ไปเป็น Web Apps ที่เป็น Java ก็จะมี Third Party Tools เช่น www.ciphersoftinc.com ที่จะ convert Forms เป็น J2EE ค่ะ

ในส่วนของข้อจำกัดเรื่อง memory บน windows นั้น ไม่มี patch upgrade นะค่ะ แต่มีขั้นตอนในการทำให้ process บน windows สามารถมองเห็นได้มากกว่า 2 GB ได้ค่ะ แต่ขึ้นกับ OS ด้วยนะค่ะ เห็นบอกว่าเป็น Windows 2003 ถ้าจะทำตามขั้นตอนนี้ได้ ต้องเป็น Windows 2003 Enterprise Edition นะค่ะ ถ้าเป็น Standard Edition หรือ Web Edition ก็ไม่สามารถปรับค่าให้เกิน 2GB ได้ค่ะ นอกจากนี้ยังขึ้นกับขนาดของ RAM ที่มีอยู่ในเครื่องด้วยค่ะ เพราะการปรับค่าดังกล่าว ก็ต้องคำนึงถึงส่วนของ OS ที่จะใช้งาน Memory ตรงนี้ด้วยค่ะ

ขั้นตอนในส่วนนี้สามารถดูได้จาก เอกสารใน Metalink ตาม document ID ดังนี้ ค่ะ

Note 225349.1 "Using Address Windowing Extensions (AWE) or VLM on Windows"
Note 46001.1 Oracle Database and the Windows NT memory architecture
Note 46053.1 Windows NT Memory Architecture Overview

Anonymous said...

ขอบคุณมากน่ะคับที่ช่วยตอบคำถาม
ขออีก 1 คำม น่ะคับ ถ้าผม ต้องการ export ฐานข้อมูล oracle ออกมาเป็น excel ผมจะต้องใช้คำสั่งอะรัยอ่ะคับ รบกวนด้วยน่ะคับ ขอบคุณมากเลยน่ะคับ

cherrymckwai said...

หมายถึง save output ที่ได้จากการ query ออกมาในรูป excel file รึเปล่าค่ะ โดยปรกติถ้าใช้พวก third party tool หรือแม้แต่ sql developer ก็จะมี menu สำหรับ save output เป็น excel อยู่แล้วค่ะ แต่ถ้าเกิดต้องการจะให้ output ที่ได้จาก sqlplus เป็น excel file ก็สามารถทำได้ โดยการใช้คำสั่ง spool แล้วก็ต้องเขียน query ให้แทรกอักขระประหลาดที่ใช้สำหรับแบ่ง column ค่ะ หรือจะใช้คำสั่ง set colsep ใน sqlplus ก็ได้ค่ะ ปรกติจะทำเป็น csv file ค่ะ (อันนี้อาจจะลำบากนิดหน่อย ถ้า data ที่ query มามี "," รวมอยู่ด้วย)

วิธีที่ 1 เขียน query แทรกอักขระ
SQL> spool file_name.csv
SQL> select c1 || ',' || c2
from t1;
SQL> spool off;


วิธีที่ 2 ใช้คำสั่ง set colsep
SQL> set colsep ,
SQL> spool file_name.csv
SQL> select c1, c2
from t1;
SQL> spool off;

ส่วนการ export ทั้งฐานข้อมูลนั้น Oracle จะสร้างเป็น dmp file ค่ะ

Anonymous said...

ตอบคุณ chaiclub,
เสริมคุณ cherrymckwai เรื่อง export เป็น excel
ลองดูที่
http://oracle.ittoolbox.com/documents/popular-q-and-a/export-data-into-excel-using-plsql-scripts-3805

ส่วน third party ดูที่
http://www.excel-db.net/

Anonymous said...

ขอบคุณมากน่ะคับ สำหรับคำแนะนำ

Anonymous said...

คืออยากจะทราบวิธีการติดต่อ oracle กับ vb.net
2005 ค่ะ ว่าต้อง set อะไรบ้าง และมีการเขียนโค้ดอย่างไร ส่วนใน vb ก็ทำพวก insert update delete และค้นหาค่ะ ช่วยด้วยนะคะ ขอบคุถณค่ะ

cherrymckwai said...

ตอบคุณ fai

ลองไปที่นี่ http://www.oracle.com/technology/sample_code/tech/windows/odpnet/howto/connect/index.html ดูนะค่ะ

cherrymckwai said...

นี่เป็นอีก link นึงที่เกี่ยวกับการ build .net application บน Oracle DB ที่น่าสนใจนะค่ะ

http://www.oracle.com/technology/pub/articles/cook_dotnet.html

Anonymous said...

ถ้าเรา generate script insert ออกมาแล้ว ต้องการให้มันทำ script นั้นเลยพอมัน generate เสร็จหมดทุกอัน โดยที่เราไม่ต้องเอา script insert ที่ได้มาจากการ generate มารันเองอะคะ ต้องใช้วิธีไหนหรอคะ

ใช้ cursor fetch ให้มันมาอยู่ในตัวแปรชื่อ aa แล้วใช้ คำสั่ง execute immediate (aa) มันมะได้อะคะ มันบอกว่า invalid charactor

รบกวนหน่อยนะคะ
ขอบคุณคะ
itzaaa

cherrymckwai said...

คุณ itzaaa ค่ะ

ไม่แน่ใจว่าถ้าเอา output ที่ได้จาก script เปล่าๆ ไป run มันสามารถใช้งานได้หรือเปล่าค่ะ

หรือลองใช้ dbms_output.put_line(aa); เพื่อดูว่าแต่ละ statement นั้นมันถูกต้องหรือเปล่านะค่ะ ส่วนใหญ่ปัญหามันจะเกิดตรงที่เป็นพวกเครื่ืองหมาย เช่น เครื่องหมาย ' เพราะดูจากแนวทางที่ทางคุณ itzaaa ทำมาก็น่าจะใช้ได้แล้วนะค่ะ

Anonymous said...

คือว่า...ต้องออกไปอธิบายการทำงานของ algorithm ค่ะ
เป็นเรื่อง Bucket กับ Radix Sort
..ต้องการเป็น algorithm อ่ะค่ะ
แล้วรบกวนช่วยอธิบายการทำงานด้วยได้มั้ยคะ ?
อาจารย์ให้ออกไปพูด แต่ยังไม่ค่อยเข้าใจเลยอ่ะค่ะ



ขอบคุณมากๆๆๆ นะคะ..
ช่วยหนูด้วยนะคะ T T

cherrymckwai said...

คุณ tangmoez ค่ะ

ลองไปดูที่ web นี้นะค่ะ อธิบายขั้นตอนการทำงานของ Radix Sort ไว้ น่าจะพอช่วยได้ค่ะ

http://www.geocities.com/ybtutorial/radixsort.html

Anonymous said...

สวัสดีครับ
ขอถามว่า ถ้าผมมี Server ที่ติดตั้ง oracle database จำนวน 2 เครื่อง โดยที่ Database ทั้งสองตัวมี charactor set ที่แตกต่างกัน แต่ต้องการติดตั้ง Web Server เพียงเครื่องเดียวเพื่อจะติดต่อฐานข้อมูลทั้งสองโดยผ่าน ODBC จะทำได้อย่างไรครับ

cherrymckwai said...

สวัสดีค่ะ คุณ Job

ไม่แน่ใจในส่วนของคำถามนะค่ะ ขอทราบรายละเอียดเพิ่มเติมนะค่ะ

1. web server ที่ติดตั้ง ใช้ของอะไร
2. ต้องการทราบว่า จะติดตั้ง web server เป็น character set ตัวไหน ใช่หรือไม่
3. Character set ของ DB ที่ว่าต่างกันนั้น เป็น character set อะไร

ขอบคุณค่ะ

Anonymous said...

คุณ cherrymckwai ครับ
ขอตอบคำถามเป็นข้อๆดังนี้ครับ
1. web server ที่ติดตั้ง ใช้ของอะไร
- Web Server เป็น windows2003 + IIS 6 ครับ
- กำหนด environment path ให้ชี้ไปที่ = C:\oracle\product\10.2.0\client_1\bin ( เป็น DB1 )
2. ต้องการทราบว่า จะติดตั้ง web server เป็น character set ตัวไหน ใช่หรือไม่
- ที่ web server ผมทำการติดตั้ง oracle client ไว้ 2 ตัวเพื่อใช้ในการติดต่อฐานข้อมูล Oracle แต่ละตัว โดยมี Oracle home แยกกันดังนี้ครับ
- Default_Home กำหนดค่า NLS_LANG = AMERICAN_AMERICA.WE8DEC
- OraClient10g_home1 กำหนดค่า NLS_LANG = THAI_THAILAND.TH8TISASCII
3. Character set ของ DB ที่ว่าต่างกันนั้น เป็น character set อะไร
- DB1 มี character set เป็น AMERICAN_AMERICA.WE8DEC
- DB2 มี character set เป็น THAI_THAILAND.TH8TISASCII

ตอนนี้ผมเวลาผมทำการ connect ฐานข้อมูลผ่าน ODBC จะเป็นการติดต่อกับ DB1 ตลอด
ซึ่งถ้าผมต้องการจะติดต่อกับ DB2 จะไม่ได้ ( ผมลองทำการเพิ่ม alias ใน tnsname.ora ก็สามารถติดต่อได้ แต่ข้อความภาษาไทย
ไม่สามารถอ่านได้ เพราะว่าจะเป็นอักษร ฟ ทั้งหมด )

ขอบคุณครับ

Anonymous said...

สวัสดีคับ
รบกวนถาม เกี่ยวกับ คำสั่ง sql คับ ถ้าผมจะทำรายงาน 10 อันดับ ผมต้องใช้คำสั่ง อารายในการ Query ข้อมูลคับ ให้ออกมาในการจัดอันดับ เช่น ผมจาทำ 10 อันดับโรค ปามาณนี้อ่ะคับ
ขอบคุณมากคับ

Tangy said...

จากประสบการณ์มันทำได้หลายวิธีครับ

1. เขียนแนว logic หน่อยคับ วิธีนี้ถึกหน่อย
เช่น
SELECT product, descr, email
FROM (select product, descr, email from products order by product )
WHERE ROWNUM <= 10

2. เขียนแนว Hint ของ oracle โดยเฉพาะ
เช่น
SELECT /*+ FIRST_ROWS(10) */ table_name
FROM dba_tables
WHERE owner = 'SYS'
AND table_name LIKE '%$'
ORDER BY 1;


3. เขียนแนว Rank By Parition
เช่น
select val,dt
from (
select val,dt
,rank() over(partition by to_char(dt,'YYYY.MM') order by dt desc) rn
from test_month
)
where rn < 10;

Anonymous said...

รบกวนถามครับ ตอนนี้ผมมีระบบ ที่พัฒนาจะ 6i บน Oracle8 ตอนนี้บริษัทให้เปลี่ยนไปใช้ 10g กับ iAS ครับ
1.ตอนนี้ผมสามารถแสดง Form บน web ได้แล้วครับ แต่หาต้องการพิมพ์ลงบน pre Print form ให้พอดีกับกระดาษต้องทำอย่างไรครับ (เดิมเป็น C/S) มันสามารถกำหนดได้ แต่พอสั่งออก web ทำไม่เป็นครับ
2.เดิมมีการใช้ Package บน Oracle โดยใช้ webdb ครับ หากต้องการให้สามารถใช้งานได้เหมือนเดิมต้องทำยังไงครับ

ขอบคุณครับ

Anonymous said...

Oracle9i RAC(Real Application Clusters)ขอทราบ concept และวิธีการติดตั้งคร่าว ๆ ขอบคุณครับ

cherrymckwai said...

Concept ของ RAC หลักๆ คือเพื่อรองรับในเรื่องของ scalability & performance และ availability ค่ะ กล่าวคือ RAC นั้นจะประกอบด้วย node อย่างน้อย 2 node และ share storage 1 เครื่อง โดยแต่ละ node นั้นสามารถที่จะเข้าใช้งาน share storage ได้พร้อมๆ กัน ทั้งการอ่าน และการเขียน ถ้ามองในมุม oracle จะมอง แต่ละ node เป็น thread หรือ instance โดยจะมีหน้าที่ provide resource ให้กับ Database ซึ่งตัว RAC เอง นั้นจะมี ตัว Load Balance เพื่อช่วยกระจาย Load ให้แต่ละ node ได้ นอกจากนี้ ตัว RAC เองยังรองรับในเรื่องของ Availability ที่เกิดจาก network หรือ node fail โดย session นั้นจะถูกย้ายไป reconnect ที่ node ที่ยังสามารถใช้งานได้อยู่้ (Fail-over) นอกจากนี้ RAC ยังรองรับการเพิ่ม node เข้ามาใช้งาน ในกรณีที่มี load เพิ่มขึ้นได้ด้วย

ส่วนวิธีการติดตั้งลองไปที่เวปนี้นะค่ะ พอจะเป็นแนวทางได้
http://www.puschitz.com/InstallingOracle9iRAC.shtml

วิธีการติดตั้งสำหรับ 9i นั้นจะซับซ้อนกว่า 10g นะค่ะ

IaM said...

รบกวนสอบถามค่ะ
พอดีว่าต้องการทำ report แล้วใน table มี field อยู่ 2 field ดังนี้คือ id และ code
โดย 1 id สามารถจะมี code ได้หลาย code
แล้วจะทำการออก report ให้แสดงออกมาว่าใน 1 row ให้แสดง id และ code ที่ pid นี้มี ซึ่ง id ดังกล่าวอาจจะมี code อยู่หลาย code อยากให้ code แสดงออกมาเป็น column ค่ะ

จึงขอแนวทางว่าจะต้องเขียนอย่างไร
ขอบคุณมากค่ะ

cherrymckwai said...

ตอบคุณ IaM

มี 2 วิธีแนะนำนะค่ะ ใช้ต่างกัน แล้วแต่ว่าถนัด หรือสะดวก แบบไหนค่ะ

สมมติว่า
CREATE TABLE t1
(ID NUMBER, code VARCHAR2(10));

INSERT INTO t1 VALUES (1, 'A1');
INSERT INTO t1 VALUES (1, 'A2');
INSERT INTO t1 VALUES (1, 'A3');
INSERT INTO t1 VALUES (2, 'B1');
INSERT INTO t1 VALUES (2, 'B2');
INSERT INTO t1 VALUES (3, 'C1');
INSERT INTO t1 VALUES (3, 'C2');
INSERT INTO t1 VALUES (3, 'C3');
INSERT INTO t1 VALUES (3, 'C4');

--------------------------------------------

วิธีแรก ใช้ CURSOR ใน PL/SQL ค่ะ

--------------------------------------------
DECLARE
vcode VARCHAR2 (100);
BEGIN
FOR c1 IN (SELECT ID
FROM t1
GROUP BY ID)
LOOP
vcode := NULL;

FOR c2 IN (SELECT code
FROM t1
WHERE ID = c1.ID)
LOOP
vcode :=
CASE
WHEN vcode IS NULL
THEN c2.code
ELSE vcode || ',' || c2.code
END;
END LOOP;

DBMS_OUTPUT.put_line (c1.ID || ' = ' || vcode);
END LOOP;
END;
----------------------------------------------
ผลลัพธ์ที่ได้
1 = A1,A2,A3
2 = B1,B2
3 = C1,C2,C3,C4
----------------------------------------------

วิธีที่สอง ทำเป็น PIVOT QUERY ดังนี้ค่ะ

--------------------------------------------
1. Create Object-Type สำหรับเก็บค่า Column
CREATE OR REPLACE TYPE code_obj AS OBJECT (
code VARCHAR2 (10)
);

2. Create Table-Type สำหรับเก็บแต่ละ Object ให้เป็น Array
CREATE OR REPLACE TYPE code_tab AS TABLE OF code_obj;

3. Query โดยใช้ Pivot Query
SELECT t1.ID, CAST (MULTISET (SELECT t2.code
FROM t1 t2
WHERE t1.ID = t2.ID) AS code_tab) AS code
FROM t1 t1
GROUP BY t1.ID;

----------------------------------------------
ผลลัพธ์ที่ได้
ID CODE(CODE)
---------- ------------------------------
1 CODE_TAB(CODE_OBJ('A1'), CODE_OBJ('A2'), CODE_OBJ('A3'))
2 CODE_TAB(CODE_OBJ('B1'), CODE_OBJ('B2'))
3 CODE_TAB(CODE_OBJ('C1'), CODE_OBJ('C2'), CODE_OBJ('C3'), CODE_OBJ('C4'))

IaM said...

ขอบคุณมากนะคะ คุณ cherrymckwai ที่แนะนำให้ เด๋วจะลองนำไปใช้ดูค่ะ

ขอบคุณค่ะ

IaM said...

ขอสอบถามค่ะ ต้องการที่จะทำการเขียน procedure ในการส่งเมล์จะมีการ attach file ไปด้วย จะเขียนยังไงคะ รบกวนด้วยค่ะ

ขอบคุณมากค่ะ

Anonymous said...

Send mail with UTL_SMTP - with attachments

Send mail with attachements using the UTL_SMTP package:
DECLARE
v_From VARCHAR2(80) := 'oracle@mycompany.com';
v_Recipient VARCHAR2(80) := 'test@mycompany.com';
v_Subject VARCHAR2(80) := 'test subject';
v_Mail_Host VARCHAR2(30) := 'mail.mycompany.com';
v_Mail_Conn utl_smtp.Connection;
crlf VARCHAR2(2) := chr(13)||chr(10);
BEGIN
v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25);

utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);

utl_smtp.Mail(v_Mail_Conn, v_From);

utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);

utl_smtp.Data(v_Mail_Conn,
'Date: ' || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf ||
'From: ' || v_From || crlf ||
'Subject: '|| v_Subject || crlf ||
'To: ' || v_Recipient || crlf ||

'MIME-Version: 1.0'|| crlf || -- Use MIME mail standard
'Content-Type: multipart/mixed;'|| crlf ||
' boundary="-----SECBOUND"'|| crlf ||
crlf ||

'-------SECBOUND'|| crlf ||
'Content-Type: text/plain;'|| crlf ||
'Content-Transfer_Encoding: 7bit'|| crlf ||
crlf ||
'some message text'|| crlf || -- Message body
'more message text'|| crlf ||
crlf ||

'-------SECBOUND'|| crlf ||
'Content-Type: text/plain;'|| crlf ||
' name="excel.csv"'|| crlf ||
'Content-Transfer_Encoding: 8bit'|| crlf ||
'Content-Disposition: attachment;'|| crlf ||
' filename="excel.csv"'|| crlf ||
crlf ||
'CSV,file,attachement'|| crlf || -- Content of attachment
crlf ||

'-------SECBOUND--' -- End MIME mail
);

utl_smtp.Quit(v_mail_conn);
EXCEPTION
WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then
raise_application_error(-20000, 'Unable to send mail: '||sqlerrm);
END;
/

http://www.orafaq.com/wiki/Send_mail_from_PL/SQL#Send_mail_with_UTL_SMTP_-_with_attachments

IaM said...

ขอบคุณมากนะคะ ลองทำดูแล้ว ใช้ได้ค่ะ
แต่ขอรบกวนถามอีกซักนิดนึงค่ะ ว่าถ้าจะเอา statement select * from emp; จะวางไว้ตรงที่ไหนคะ และใช้อย่างไร เพื่อที่จะให้ได้จากที่เรา query แล้วผลลัพธ์จออกมาเป็นไฟล์ csv ค่ะ

ขอบคุณมากค่ะ

cherrymckwai said...

คุณ IaM ค่ะ

ถ้าให้แนะนำ ก็ควรจะทำให้เสร็จก่อน open connection ค่ะ
คือตอน Begin ก็ทำ csv file เลย
ขั้นตอนก็มีดังนี้ค่ะ

1. Create Directory Object และ Grant Privilege ให้กับ User

CREATE OR REPLACE DIRECTORY CSV_DIR AS 'c:\temp\csv';

GRANT READ, WRITE ON DIRECTORY CSV_DIR TO SCOTT;

GRANT EXECUTE ON UTL_FILE TO SCOTT;

2. Create ส่วนที่ทำหน้าที่ Extract โดยจะสร้างเป็น Procedure ต่างหากก็ได้ค่ะ

DECLARE
v_file UTL_FILE.file_type;
BEGIN
v_file :=
UTL_FILE.fopen (LOCATION => 'CSV_DIR',
filename => 'emp.csv',
open_mode => 'w',
max_linesize => 32767
);

FOR cur_rec IN (SELECT empno, ename, job, mgr,
TO_CHAR (hiredate, 'DD-MON-YYYY') AS hiredate,
sal, comm, deptno
FROM emp
ORDER BY ename)
LOOP
UTL_FILE.put_line (v_file,
cur_rec.empno
|| ','
|| cur_rec.ename
|| ','
|| cur_rec.job
|| ','
|| cur_rec.mgr
|| ','
|| cur_rec.hiredate
|| ','
|| cur_rec.empno
|| ','
|| cur_rec.sal
|| ','
|| cur_rec.comm
|| ','
|| cur_rec.deptno
);
END LOOP;

UTL_FILE.fclose (v_file);
EXCEPTION
WHEN OTHERS
THEN
UTL_FILE.fclose (v_file);
END;

cherrymckwai said...

ส่วนอันนี้เป็น Package ที่ใช้สำหรับสร้าง csv file ค่ะ ถ้ามีการสร้างโดย query ที่แตกต่างกันอยู่บ่อยๆ package นี้น่าจะช่วยทุ่นแรงได้เยอะเลยค่ะ

http://www.oracle-base.com/dba/Script.php?category=miscellaneous&file=csv.sql

Anonymous said...

ผมสงใส เรื่อง JBPM มีประโยชน์อย่างไรหรอครับ ทำไมเราถึงเขียน เป็น แบบ ธรรมดาที่รับ paramitor และส่งไป เป็น ทอดๆไม่ได้หรอครับ มันช้า กว่าหรอครับ ? ตอนนี่ผมเพิ่งลองฝึกเล่น jbpm พอเข้าบ้างแล้ว แต่ยังไงว่า จะไห้มันทำงานบนเว็ปยังไงครับ ช่วยหาตัวอย่างไห้ดูหน่อยได้ไหมครับ เอาง่ายๆ ขอบคุณมากๆคับ

Anonymous said...

ผมอยากเชื่อต่อฐานข้อมูล dbf(foxpro dbase) กับ Oracle Form(Developer Suite 10g) ครับ
โดยสามารถ Select ,Insert ...

เท่าที่ผมลองหาข้อมูลดูครับ มันต้องทำผ่าน ODBC อ่ะครับผมก็ลองทำดูแล้ว ยัง งงๆ อยู่ครับ (มั่วอ่ะนะ -*-)
อ้อ เห็นว่ามันต้องลง ตัว Oracle Open Client Adapter(OCA)ก่อน ซึ่งผมก็ลองหาดูแล้วแต่ก็ยังไม่เจอครับ
ผมเลยอยากทราบว่า OCA นี้คืออะไรครับแล้วลงไว้ที่ไหน หาได้จากที่ไหนครับ
ขอบคุณครับ

Anonymous said...

อยากทราบว่า OWB กับ Datastage แตกต่างกันตรงไหนหรอคะ แล้วมีข้อดี ข้อเสีย ยังไงคะแต่ละอัน


ขอบคุณล่วงหน้าคะ

Anonymous said...

รบกวนสอบถามปัญหาเรื่อง database คับ
1. ปัจจุบัน ผมใช้ database oracle 10g 10.1 อยู่น่ะคับ มีวันนึงผม format เครื่อง แล้ว ผมจากลับมาใช้ database ก้อนเดิมอีกครั้ง แต่พอ connect แล้ว ใช้ไม้ได้ ผม เข้าไป shutdown database แล้ว ทำการ startup; แล้วเกิด error ขึ้นมาว่า
ORA-00218: b;ock size 16384 of controlfile 'D:\DATABASE10G\CONTROL01.CTL' does not match DB_BLOCK_SIZE(8192)อย่างนี้อ่ะคับ รบกวนขอคำชี้แนะคับว่าต้องทำไงต่อ ทำต่อม่ายถูกจืง ๆ ขอบคุณมากคับ
2. ถ้าผมจา upgrade version ของ database ได้ไหมคับ ถ้า ก้อน database ผมเป็น 10.1 และ ตัว oracle database ผมลง version 10.2 อ่ะคับ ถ้าได้ขอคำแนะนำ การ updrade version ให้หน่อยน่ะคับ เพราะลองทำเองแล้ว ม่ายได้คับ ขอบคุณหลาย ๆ คับ

Unknown said...

ตอบคุณ ChaiClub ครับ

1. ORA-00218: b;ock size 16384 of controlfile 'D:\DATABASE10G\CONTROL01.CTL' does not match DB_BLOCK_SIZE(8192)

- น่าจะเกิดจากการที่ขนาดของ block size ไม่เท่าเดิมครับ ผมเดาว่าคุณ ChaiClub ทำการ copy folder ที่เก็บ database files เอาไว้ (ctl, dbf, log) จากนั้นก็ทำการ format แล้วทำการสร้าง database ด้วยชื่อเดิม จากนั้นจึงเอา database files ที่ copy ไว้ไปวางทับ ใช่ไหมครับ

ถ้าทำแบบนี้ มีโอกาสที่การสร้าง database ครั้งแรก กับครั้งที่ 2 หลังจาก format จะมีการกำหนดขนาด block size ไม่เท่ากันครับ วิธีการแก้ไข ให้ลอง startup ไปที่ nomount ก่อนครับ จากนั้นทำการแก้ parameter ชื่อ DB_BLOCK_SIZE ให้เป็น 16K โดยใช้คำสั่ง alter system set DB_BLOCK_SIZE=16K scope=spfile จากนั้นให้ restart database ครับ

2. -ปกติแล้ว Oracle จะเตรียม tools ชื่อ DBUA (Database Upgrade Assistant) มาให้ครับ ซึ่งสามารถนำมาใช้ upgrade version ของ database ได้ครับ

Anonymous said...

ขอบคุณ คุณSagemus มากเลยคับ แถมเดาถูกด้วยคับ เป็นไปอย่างที่ Sagemus บอกทุกอย่างเลย ยังงัย เดี๋ยวผมจาลองดูน่ะคับ เพราะผมลองมาหลายวิธีแล้วม่ายสำเร็จสักที ส่วน tools ของOracle อ่ะคับ ผมลอง เข้า ไป Database Upgrade Assistant แล้วคับ แต่มัน popup อย่างนี้อ่ะคับ
'The Upgrade Assistant failed in briging up the database DES2.Oracle Home C:\oracle10g obtained from file/etc/oratab was used to connect to the database. Either the database is not running from Oracle Home c:\oracle10g or the correct Initialization parameter file(pfile) was not found.
To start the database,Oracle needs the pfile.Provide the full path name of the init file for the database DES2.'แล้วมันก้อให้ Browe file หา อ่ะคับ แต่ผมม่ายรู้จาหาfile ไหนไปให้ เลยรบกวนถามเพิ่มเติมน่ะคับ งงอีกตามเคย
ขอบคุณล่วงหน้าคับ

Anonymous said...

สวัสดีค่ะ
รบกวนพี่ช่วยตอบคำถามด้วยนะคะ

- มีวิธีเขียน jsp tags ใน oracle report ให้ออกมาในรูปของ pdf หรือเปล่าคะ ถ้ามี จะต้องเขียน jsp ด้วยคำสั่งใดคะ ... ถ้าไม่มี จะเขียนอย่างไรให้ report ออกมาเป็น pdf คะ?

ขอบคุณค่ะ

cherrymckwai said...

ตอบคุณ ChaiClub นะค่ะ

File ที่ตัว DBUA ถามหา ก็คือ pfile หรือ parameter file ของ Database ค่ะ ต้องเป็น pfile นะค่ะ ไม่ใช่ spfile จะอยู่ในรูปของ init[SID].ora ถ้าเป็น windows จะอยู่ที่ path [ORACLE_HOME]\database เราสามารถ create pfile จาก spfile ได้ โดยใช้คำสั่ง
CREATE PFILE FROM SPFILE; ค่ะ สำหรับการ upgrade base นั้น อาจต้องทำการแก้ parameter บางตัวภายใน parameter file ด้วยค่ะ

หากยังไม่สามารถใช้ DBUA ได้ เราสามารถทำการ upgrade database ด้วยวิธี manual ก็ได้ค่ะ รายละเอียดในการ upgrade ด้วยวิธี manual มีอยู่ใน document ของ oracle ค่ะ หรือไปตาม link นี้ได้เลยค่ะ http://download.oracle.com/docs/cd/B19306_01/server.102/b14238/upgrade.htm#i1011600

cherrymckwai said...

ในส่วนของ oracle report นั้น สามารถแสดงผลเป็น PDF Format ได้ โดยตัวที่มีหน้าที่จัดการในส่วนนี้คือ report server ค่ะ เราสามารถเลือก parameter จากหน้า servlet ของตัว report server หรือระบุ parameter ที่ชื่อ desformat ใน url ของ report ก็จะสามารถกำหนด output ได้ว่าจะเป็น html หรือ pdf ค่ะ

Anonymous said...

ขอบคุณพี่ cherrymckwai ด้วยน่ะคับ ที่ช่วยแนะนำ

Anonymous said...

ขอบคุณ คุณ cherrymckwai สำหรับคำตอบค่ะ


Oracle Report สามารถใช้ Web Layout ในการออก report ให้เป็น pdf ได้ไหมคะ?

ถ้ามี...ต้องทำอย่างไร?



ขอบคุณค่ะ

Anonymous said...

^^^^^^^^^^^
ให้ Report แสดงบน Application Server ในรูปแบบของ pdf ค่ะ

cherrymckwai said...
This comment has been removed by the author.
Anonymous said...

ขอบคุณ คุณ cherrymckwai สำหรับคำตอบค่ะ


หากต้องการจะเขียนคำสั่งใน Report Editer ในส่วนของ Web Source ให้แสดง report ออกมาเป็น PDF จะต้องเขียนคำสั่งว่าอะไรในส่วนของ page contentType คะ? หรือว่าไม่มีคำสั่งใน page contentType ให้แปลงรายงานเป็น pdf?

โดยใช้ url รัน report ผ่าน JSP-based


ขอบคุณค่ะ

cherrymckwai said...

ขอโทษนะค่ะ เข้าใจคำถามผิดไป

Oracle Report ไม่สามารถใช้ Web Layout ในการออก PDF output ได้ค่ะ ถ้าเกิดว่า JSP Reports นั้น มีการทำ Paper Layout ไว้ ก็จะสามารถทำ output ให้ออกเป็น PDF ได้ โดยเรียกผ่านตัว rwservlet ค่ะ ส่วนวิธีการก็ตามที่ให้รายละเอียดไว้นะค่ะ

ต้องขออภัยที่ทำให้สับสนนะค่ะ

cherrymckwai said...

Oracle Report ไม่สามารถใช้ Web Layout ในการออก report ให้เป็น PDF ได้ค่ะ แต่ถ้า JSP Reports นั้นมีการสร้าง Paper Layout ไว้ ก็สามารถ run report ให้ output เป็น PDF ได้ โดยจะ run ผ่าน rwservlet มีขั้นตอนคร่าวๆ ดังนี้ค่ะ

1. Application Server ที่มี Oracle Report Services ทำงานอยู่
2. Deploy report file (jsp or rdf) ลงบน Application Server นั้น ภายใต้ REPORT_PATH
3. เรียก report ผ่านทาง url โดยระบุ parameter ให้ถูกต้อง ส่วนของ Syntax ที่ใช้ ก็จะเป็น

http://web_server.domain_name:port/alias/rwservlet?parameters

โดย parameter แต่ละตัวอยู่ในรูปของ
para1=value1&para2=value2&para3=value3

สำหรับส่วนที่จะกำหนดให้มี format ออกมาในรูปไหน ก็คือ parameter ตัวที่ชื่อว่า desformat โดย default มันจะมีค่าเท่ากับ html แต่เราสามารถกำหนดเป็น pdf ได้ค่ะ จะได้เป็น
desformat=pdf

ส่วน parameter ที่ชื่อว่า destype นั้นเป็นตัวกำหนดว่า destination type ค่ะ โดย default จะเป็น cache คือ ให้แสดง output ที่ได้ทางหน้าจอปัจจุบัน แต่เราสามารถกำหนดเป็น file ในกรณีที่ถ้าอยากให้ output ที่ได้อยู่ในรูปของ file หรือ กำหนดเป็น email ถ้าอยากให้ output ที่ได้ ส่ง เป็น email ออกไปยังผู้รับ นะค่ะ

parameter report นั้นเป็นตัวระบุชื่อ report file ค่ะ เพื่อที่จะให้ report service ทราบว่า file ที่เราต้องการจะ run นั้นคือ file ไหน

ยังมี parameter อีกหลายตัวที่สามารถระบุเพื่อเรียกใช้ในการ run report ได้นะค่ะ นอกจากนี้ ยังสามารถ config parameter แต่ละตัว ไปยัง config file ของ report แล้วกำหนด alias เพื่อให้สามารถเรียกใช้งาน report แต่ละตัวได้ง่ายขึ้น และทำให้ url สั้นลงด้วยค่ะ

รายละเอียดเกี่ยวกับการใช้งาน report service สามารถดูเพิ่มเติมได้ตาม link นี้เลยนะค่ะ

http://download.oracle.com/docs/cd/B14099_17/bi.1012/b14048/pbr_run.htm

Anonymous said...

ขอบคุณ คุณ cherrymckwai สำหรับคำตอบค่ะ

Anonymous said...

รบกวนถามอีกนิดค่ะ

ใน pdf มันแสดงภาษาไทยมันยึกยืออ่ะค่ะ ต้องไปปรับแก้ที่ไหนเพิ่มเติมคะ?

Anonymous said...

ใน pdf มันแสดงภาษาไทยมันยึกยืออ่ะค่ะ ต้องไปปรับแก้ที่ไหนเพิ่มเติมคะ?

http://blog.middleware.co.th/2007/08/oracle-reports-pdf.html

Anonymous said...

ขอขอบคุณ คุณ ลองดูครับ


ผลออกมา ไม่แสดงค่ะ Y_Y

cherrymckwai said...

ลองตรวจสอบตามนี้ก่อนนะค่ะ

1. วิธีที่ให้ไว้ใช้สำหรับ Report Service ที่ Run บน windows นะค่ะ
2. ในส่วนของ Paper Layout Report จะต้องเลือก Font ให้ถูกต้องตามที่ config ไ ว้ใ น uifont ด้วยนะค่ะ เช่น AngsanaUPC หรือ AngsanaNEW c

ลองดูนะค่ะ

Anonymous said...

ขอบคุณ คุณ cherrymckwai ค่ะ

----------

ถ้าใช้ Web Layout (อาจจะใช้ paper layout ร่วมด้วย) ในการทำ report จะมีวิธีไหนให้รายงานออกมาเป็น pdf บ้างไหมคะ?

cherrymckwai said...

ขอโทษที่ตอบช้านะค่ะ

ในส่วนของ web layout วิธีที่จะให้รายงานออกเป็น PDF แบบง่ายที่สุด ก็คือ ใช้พวกโปรแกรมเช่น Adobe PDF หรืออย่าง PDFCreator แต่มีข้อเสียคือต้องติดตั้งที่ Client และ User ต้องเป็นคนสั่ง run report เองค่ะ

วิธีที่สองก็คือ ใช้พวก library มาช่วยนะค่ะ เห็นมี library ที่ชื่อ itext แต่ไม่แน่ใจในขั้นตอนการใช้เหมือนกันค่ะ

หรืออีกทางเลือกนึง ก็คือ เปลี่ยน tool ค่ะ เปลี่ยนไปใช้ jasper report บน java (oracle ใช้ jdev ค่ะ) แทน สามารถ run บน ias ได้เหมือนกัน แต่ว่าต้องพัฒนาใหม่

Anonymous said...

ขอบคุณ คุณ cherrymckwai ค่ะ

Anonymous said...

ผมต้องการ import text file ที่เก็บข้อมูลลักษณะดังนี้
aaa,bbb,cc,dd,adb
ddd,sad,adf,ad,bb
dfd,sdk,ad,dks
เข้าตารางในออราเคิลโดยแยกฟิลด์ตามเครื่องหมาย ,
โดยใช้ script sql หรือ pl/sql ต้องเขียนยังไงครับ

cherrymckwai said...

แนะนำให้ใช้เป็น external table นะค่ะ

ขั้นตอนนะค่ะ
1. Create directory ที่จะเก็บ Text File เสียก่อน (Directory ที่ว่านี่ต้องอยู่บนเครื่อง DB Server ค่ะ และขั้นตอนนี้ต้องทำโดย SYS ค่ะ) ตัวอย่างจะทำการ create directory ชื่อ xtern_dir โดยมี path อยู่ที่ /u01/oracle/xtern นะค่ะ

$ sqlplus /nolog
SQL> connect / as sysdba
SQL> create or replace directory xtern_dir as '/u01/oracle/xtern';


2. Grant permission ของ directory ให้กับ schema user ค่ะ ในที่นี้ grant ให้กับ user hr ค่ะ

SQL> grant read,write on directory xtern_dir to hr;


3. Connect ไปยัง user ที่จะเป็นเจ้าของ external table ที่ว่านี่นะค่ะ แล้วทำการสร้าง external table ขึ้นมาค่ะ

SQL> connect hr
Enter password:
Connected.
SQL> create table xtern_tab
2 ( c1 varchar2(4),
3 c2 varchar2(4),
4 c3 varchar2(4),
5 c4 varchar2(4)
6 )
7 organization external
8 ( type oracle_loader
9 default directory xtern_dir
10 access parameters
11 ( records delimited by newline
12 fields terminated by ','
13 badfile xtern_dir:'x.bad'
14 logfile xtern_dir:'x.log'
15 missing field values are null (c1,c2,c3,c4)
16 )
17 location ('x.txt')
18 )
19 parallel 2
20 reject limit unlimited;


4. ลอง select ข้อมูลจาก external table ดูค่ะ

SQL> select * from xtern_tab;


5. Insert ข้อมูลลง table ปลายทางได้เลยค่ะ

SQL> insert into dest_tab (dc1, dc2, dc3, dc4)
2 select * from xtern_tab;



ถ้าจะ load เพิ่ม ก็เอา file ใหม่ไปวางไว้ที่ path เดิม แล้วก็สั่ง insert ได้เลยค่ะ

Anonymous said...

มีวิธีใดไหมคะ ที่จะสามารถพิมพ์รายงานออกทาง printer โดยไม่ต้อง preview

Anonymous said...

ขอบคุณมากเลยครับที่ช่วยตอบแต่แฮ่ๆๆผมยังงงตรงคำสั่ง create or replace directory xtern_dir as '/u01/oracle/xtern';

คำสั่ง /u01/oracle/xtern ความหมายคือผมต้องไปสร้าง directory ที่ c:\u01\oracle\xtern แล้วเอา text file ไปไว้ในนี้หรือปล่าว เพราะจากคำสั่งข้างบนไม่รู้ว่าต้องเอาtext ไฟล์ไปไว้ที่ไหนเลยยังทำไม่สำเร็จผมทำแล้วขึ้น Error
ข้อผิดพลาดบรรทัดที่ 1:
ORA-29913: ข้อผิดพลาดในการรันODCIEXTTABLEOPEN
ORA-29400: ข้อผิดพลาดคาร์ทริดข้อมูล KUP-00554: error encountered while parsing acce
KUP-01005: syntax error: found "badfile": expec
exit, (, ltrim, lrtrim, ldrtrim, missing, notri
KUP-01007: at line 3 column 1
ORA-06512: ·ที่ "SYS.ORACLE_LOADER"

cherrymckwai said...

สำหรับกรณีที่ต้องการให้ report ออกทาง printer นะค่ะ
ระบุ parameter ที่เรียกผ่าน rwservlet ดังนี้ค่ะ
destype=printer และ desname=printer_name
โดย printer_name จะเป็นชื่อของ printer ที่เรา add ไว้ในเครื่อง iAS ค่ะ
จะได้เป็น

http://host:port/reports/rwservlet?report=test.rdf&destype=printer&desname=hpl1320

อันนี้สำหรับกรณีที่ iAS บน windows นะค่ะ
ถ้าเกิดว่าเป็นบน Unix จะมีขั้นตอนที่ซับซ้อนกว่านี้ค่ะ

cherrymckwai said...

ตอบคุณ camp นะค่ะ

สำหรับคำสั่ง create directory นั้น path ที่ระบุไปเป็น unix format ค่ะ ถ้าเกิดว่าเป็น windows ต้องระบุ path โดยกำหนด drive ให้ด้วยค่ะ

ดังนั้น คำสั่งที่ว่าจะกลายเป็น

create or replace directory xtern_dir as 'c:\oracle\xtern';

จากนั้นก็ไปสร้าง directory ไว้ตาม path ที่ระบุค่ะ แล้วนำ file .txt มาวางไว้ที่นี่

ลองดูนะค่ะ

Anonymous said...

ขอบคุณ คุณ cherrymckwai ค่ะ


- ใช้ form ในการออก report
- เครื่องเซิฟเวอร์เป็น Linux Redhat5

เครื่องเซิฟเวอร์จะต้องลงไดว์เวอร์ปริ้นเตอร์ไว้ก่อนด้วยหรือเปล่าคะ ?

cherrymckwai said...

ลองดูตาม web link นี้นะค่ะ เป็นวิธีการ print output report บน unix ค่ะ

http://download.oracle.com/docs/cd/B14099_19/bi.1012/b14048/pbr_uxprt.htm#i1007272

ต้องลง driver printer ด้วยค่ะ

ส่วนของการเรียกผ่าน form นั้น สามารถใช้ผ่าน package เหล่านี้นะค่ะ
- RUN_REPORT_OBJECT
- WEB.SHOW_DOCUMENT
ส่วนวิธีการใช้นั้นตัว Form Manual น่าจะมีรายละเอียดให้ค่ะ

Anonymous said...

โย้วๆๆทำได้แล้วครับเจ๋งจริงๆๆ แต่ยังติดอีกนิดนึงครับคือว่าจะ insert ข้อมูลใหม่ เพิ่มต่อเข้าไปในตารางเดิมที่ทำไว้ต้องทำไงอะคับเพราะที่เขียนไว้ว่าให้ใช้
SQL> insert into dest_tab (dc1, dc2, dc3, dc4)
2 select * from xtern_tab;
ยังไม่เข้านะครับ ช่วยอธิบายเพิ่มเติมให้ตาแจ้งอีกนิดนะครับ ขอบคุณหลายๆๆครับ

cherrymckwai said...

คุณ camp ค่ะ

สำหรับ external table มันจะเป็น table ที่อ่านข้อมูลมาจาก file อีกทีนะค่ะ จะ insert ข้อมูลเข้าไปให้มันตรงๆ ไม่ได้ แต่จะใช้ read ข้อมูลได้ หมายความว่า ข้อมูลในส่วนดังกล่าวจะไม่ถูกเก็บลงในฐานข้อมูลนะค่ะ ซึ่งในที่นี้ table xtern_tab ก็คือ external table

จากที่คุณ camp ถามไว้ว่าจะ load ข้อมูลจาก file ลง table เพื่อนำไปใช้งานต่อ ก็เลยจำเป็นต้องสร้าง table ปลายทางขึ้นมา ในที่นี้ก็คือ dest_tab นะค่ะ
คำสั่งที่ใช้สร้าง table ก็คือ

CREATE TABLE dest_tab
( dc1 varchar2(4),
dc2 varchar2(4),
dc3 varchar2(4),
dc4 varchar2(4))


จากนั้นก็ทำการ insert ข้อมูลจาก external table เข้ามายัง table ปลายทางนี้นะค่ะ

Anonymous said...

รบกวนสอบถามเกี่ยวกับการ query คับ เกี่ยวกับการ query ข้อมูล โดยมีเงื่อนไขที่ว่า เช่น ผมสั่งยาให้ นาย A จำนวน 2 รายการ โดย รายการยาที่สั่ง มี AAA,BBB ผมต้องการ query โดย แสดง รายการยาที่สั่ง ให้อยูใน แถวเดียวกานอ่ะคับ จาทำได้ไหมคับ เพราะ query ปกติ รายการยา จาแยกแถวอยู่แล้วคับ โดย อยากได้ Query ดังนี้คับ
name drug
นาย A AAA,BBB

รบกวนด้วยน่ะคับ ขอบคุงมากคับบบ

Unknown said...

สวัสดีครับอ่านถามต้อมมาตั้งนานแต่ไม่เคยได้ตั้งคำถาเลยเพราะที่สงสัยมีคนถามหมดแล้ว มาวันนี้ข้อถ้ามข้อสงสัยหน่อยครับ เริ่มเลยนะครับ แบบว่า
1 ใน Oracle ทำไมเราต้องสร้าง datafile ไว้เยอะๆ มันมีประโยชน์อย่างไรนอกจากการอ่านข้อมูลเร็ว
2 เราจะสามารถ สร้าง table และระบุ Datafile ได้หรือไม่ครับ ถ้าได้ทำยังไงครับ
3 เราสามารถย้าย table จาก datafileหนึ่ง ไปอีก datafileหนึ่งได้หรือไม่ครับ เช่น มี datafile A กับ datafile B แล้วมี table AA อยู่ที datafile A อยู่มาวันนึงมีเหตุการที่ต้องทำให้ย้าย table AA ไปอยู่ที่ datafile B แทน datafile A ไม่ทราบว่าสามารถทำได้หรือไม่ครับ รบกวนช่วยที่นะครับ ผมใช้ Oracle 10g ครับ

Anonymous said...

ออราเคิล ดาตาเบสที่ดาวน์โหลดมาจากเว็บออราเคิล จะใช้งานฟรีได้นานเท่าไหร่ ครับ คืออ่าน OTN ไลเซ็นส์ แล้วไม่ค่อยเข้าใจ ปัญหาที่เจอคือใช้งานได้ไม่นาน ก็จะเกิดปัญหา tns listener ไม่รู้จัก SID จะแก้ไขอย่างไรครับ

cherrymckwai said...

ตอบคุณ ChaiClub

วิธีที่ทำได้ก็มี 2 วิธีนะค่ะ คือใช้ pl/sql หรือใช้ Pivot Query
สำหรับวิธีการเคยตอบไว้ในส่วนของ ถามต้อม แล้วเหมือนกันค่ะ
ลองใช้ Ctrl+F แล้ว search คำว่า Pivot Query ดูนะค่ะ

cherrymckwai said...

ตอบคุณ Sukkasem

เพื่อป้องกันการสับสน ขออธิบายรายละเอียดเกี่ยวกับการจัดเก็บข้อมูลของ Oracle Database ก่อนนะค่ะ
Oracle Database นั้น จะทำงานในระดับ Logical ซึ่ง หน่วยของ Logical Storage นั้นจะประกอบไปด้วย
Tablespace --> Segment --> Extent --> DB Block เรียงลำดับจากหน่วยที่ใหญ่ที่สุด มาหน่วยที่เล็กที่สุด หมายความว่า 1 Tablespace จะประกอบไปด้วยหลายๆ Segment และ 1 Segment ประกอบด้วยหลายๆ Extent และ 1 Extent ประกอบด้วยหลายๆ DB Block นั่นเอง

ในขณะที่ Datafile เป็น Physical structure ที่ใช้ในการเก็บข้อมูลของ Oracle ซึ่ง หลายๆ Datafile ประกอบกันเป็น 1 Tablespace โดย Datafile หนึ่งๆ นั้น จะสามารถเป็นสมาชิกได้แค่ 1 Tablespace เท่านั้น กล่าวคือ เมื่อ Datafile ใดๆ ถูก assign ให้กับ Tablespace หนึ่งแล้ว จะไม่สามารถ assign ให้กับ Tablespace อื่นอีกได้

คราวนี้มาถึงคำถามนะค่ะ

1. จำนวนของ Datafile มีเยอะๆ เพียงอย่างเดียวนั้น ไม่ช่วยให้การอ่านข้อมูลเร็วขึ้นนะค่ะ เนื่องจากการอ่านข้อมูลนั้นต้องอาศัย Disk I/O ดังนั้นหากเราสร้าง Datafile ไว้บน Disk ลูกเดียวกัน เวลาที่มันจะอ่านข้อมูลจาก Disk ก็ต้องมีการ wait รอกันอยู่ดี การจะช่วยให้ Database ทำงานเร็วขึ้นอย่างนึงก็คือ การกระจาย Datafile ที่มีการใช้งานมากๆ ให้อยู่บน Disk คนละลูกนั่นเอง

2. เราไม่สามารถสร้าง Table โดยระบุ Datafile ได้ค่ะ แต่เราสามารถสร้าง Table โดยระบุ Tablespace ได้ค่ะ โดยระบุเพิ่มไปในคำสั่ง Create Table ค่ะ หากไม่ระบุ Oracle Database จะนำ Table ที่เราสร้างไปไว้ใน Default Tablespace ค่ะ
อ้อ ก่อนที่เราจะสามารถใช้ Tablespace ใดๆ นั้น DBA จะต้องให้สิทธิ์เราในการใช้พื้นที่ของ Tablespace นั้นๆ ก่อนนะค่ะ

CREATE TABLE [schema].table_name
(column datatype,...)
TABLESPACE tablespace_name;

3. เราไม่สามารถย้าย Table จาก Datafile หนึ่งไปยังอีก Datafile หนึ่งได้ค่ะ แต่เราสามารถทำการย้าย Table จาก Tablespace หนึ่ง ไปยังอีก Tablespace หนึ่งได้ค่ะ โดยใช้คำสั่ง ALTER TABLE ดังนี้ค่ะ

ALTER TABLE table_name SET TABLESPACE new_tablespace;

cherrymckwai said...

สำหรับ Oracle Database ที่ Download มานั้น สามารถใช้งานได้ไม่มีกำหนดสิ้นสุดค่ะ ตามเงื่อนไขของ Oracle นั้น สำหรับให้ทดลองใช้งานค่ะ เพื่อตัดสินใจค่ะ หากมีการนำมาใช้เพื่อการค้า จะถือว่าผิด License ค่ะ และหากทาง Oracle มีการตรวจสอบพบจะโดนปรับเป็นจำนวนเงินพอสมควรเลยค่ะ

ในส่วนของปัญหาที่เกิดขึ้นนั้น น่าจะเป็นที่ file listener.ora นะค่ะ ถ้ายังไง คงต้องขอรายละเอียดใน file ดูหน่อยนะค่ะ

Anonymous said...

ขอบคุณคุณเชอรี่ที่ตอบ ขอถามปัญหาออราเคิล ดาตาเบสต่อ ครับ ได้ส่งรายละเอียด listener มาให้ดู แก้หลายอย่างแล้ว ไม่ว่าจะเป็น stop service แล้ว start ใหม่ เป็นไปได้มั้ยครับว่า ดาตาเบสที่ผมดาวน์โหลดมา ผมติดตั้งในเครื่อง server 2 เครื่อง ตัวจริง กับสำรอง (ซึ่งต่อเน็ตทั้ง 2 เครื่อง ใช้ในราชการ) จึงมีการเช็คให้ทำงานได้แค่เครื่องเดียว
SID_LIST_LISTENER_61_phat =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
)
LISTENER_61-phat =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY=EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = 61-phat)(PORT = 1521))
)
)

cherrymckwai said...

ลองแก้ listener file นะค่ะ ตรงที่เป็นตัวหนา คือส่วนที่เราแก้ไปนะค่ะ ส่วนของ SID_NAME= นั้น ให้ระบุ SID ที่สร้างไว้ในเครื่องนะค่ะ ลองดูนะค่ะ

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(SID_NAME = ORCL)
)

)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY=EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = 61-phat)(PORT = 1521))
)
)

Anonymous said...

เรียนคุณเชอรี่ ลองแก้ file listener.ora แล้ว แต่ก็ยังเข้าดาตาเบสไม่ได้ มันมีแมสเสจบอกว่า agent connection succeed ถึงแม้จะลอง stop และ start พวกเซอร์วิสของออราเคิลแล้วก็ตาม

Anonymous said...

อยากสอบถามเรื่อง command OMB+ใน Oracle warehouse builder อะคะ
คือ ถ้า table source มีการเปลี่ยนแปลง column จำเป็นต้องมีการ synchonize tableนั้นใหม่ ในแต่ละ mapping เลยต้องการรู้ว่า table นี้ถูกใช้ใน mapping ไหนบ้าง ต้องใช้ command ยังไงหรอคะ ตอนนี้ที่ใช้ คือ

set mapList [OMBLIST MAPPINGS]
set opList [OMBRETRIEVE MAPPING '$mapList' GET OPERATORS 'DNAME']
foreach mapName $opList {
OMBRECONCILE TABLE 'DNAME'\
TO MAPPING '$mapName'\
OPERATOR 'DNAME' \
USE(RECONCILE_STRATEGY \
'REPLACE',MATCHING_STRATEGY \
'MATCH_BY_OBJECT_ID')
OMBCOMMIT
}

แต่เกิด error ฟ้องว่า can't read opList : no such variable

ขอบคุณค่ะ

Anonymous said...

เนื่องจากว่า connect จากเครื่อง client เข้าไปที่ oracle 11g on solaris สามารถใช้งานได้ปกติ แต่ติดตรงที่ว่าไม่สามารถ query field ที่มี data type เป็น timestamp ได้ จะขึ้น error
ORA-01882: timezone region %s not found

ลอง connect ผ่าน tools และ command line แล้ว error เหมือนกันค่ะ ไม่ทราบว่าต้องแก้ไขยังไงคะ

Anonymous said...

ลองดู สาเหตุ แล้วแนวทางแก้เบื้องต้นที่
http://plsqlworld.blogspot.com/2008/11/ora-01882-timezone-region-not-found.html

Unknown said...

อยากทราบคำจำกัดความของ Oracle Fusion Middleware ด้วยครับ

Anonymous said...

ลองทำตามhttp://plsqlworld.blogspot.com/2008/11/ora-01882-timezone-region-not-found.html
ได้ค่ะ แต่สงสัยว่าทำไมถึงไม่สามารถ query แบบเรียก ชื่อ field ตรงได้(โดยไม่ต้องใส่ extract) สามารถไป set อะไรเพิ่มได้หรือป่าวคะ เพราะว่าก่อนหน้านี้เคย connect แล้วสามารถเรียก qurey โดยใส่แค่ field ได้ค่ะ แต่เป็น oracle 10g ค่ะ

Anonymous said...

แก้ปัญหา Oracle Reports ให้ใช้งาน PDF ภาษาไทยได้ บน UNIX Platform น่ะค่ะ เนื่องจากทำแล้วติดปัญหาคือแสดงภาษาไทยได้ แต่แสดงข้อความไม่พอ และจัดตำแหน่งไม่ตรงตามต้องการค่ะ แต่ถ้ารันบน Windows โอเคค่ะ แต่บน Unix ไม่เวิร์คค่ะ รบกวนด้วยค่ะ


ปัญหาเดียวกันกับคุณ Pra อยากทราบวิธีแก้คะ

smuensa@hotmail.com

sirichai said...

คุณศิริรัตน์ครับ
ผมตอบให้ทาง email แล้วครับ

sirichai said...

ตอบคุณ bon เรื่อง Oracle Fusion Middleware ครับ

แต่ก่อน Oracle แบ่ง products ตระกูล core tech ดังนี้ครับ
- Oracle Database: เพื่อเก็บ data
- Oracle Application Server: เพื่อ deploy web application (tier นี้มักจะเรียกว่า middleware)
- Oracle Developer Suite: เพื่อพัฒนา web application แล้ว deploy ลง Oracle Application Server

products Oracle ตัวที่เก่งที่สุดคือ database ครับ แต่ตัวอื่น ๆ อยู่ในระดับปานกลาง
Oracle จึงใช้ strategy ควบรวมกิจการครับ โดยไล่ซื้อ products ต่าง ๆ ที่เป็น best of bread ของแต่ละสาย products มาเป็นของตัวเอง
เมื่อมี products หลากหลายที่่ oracle acquire มา
Oracle จึงตั้งใจระรวม products ต่าง ๆ หล่าวนี้ให้ทำงานร่วมกันได้เป็นเนื้อเดียวกัน
การรวมกันจึงเป็นที่มาของคำว่า fusion ครับ

project ที่เป็น fusion ของ Oracle มี Fusion Middleware และ Fusion Applications ครับ
Oracle Fusion Middleware ก็จะเป็นการรวมกันของ
- Oracle Application Server ตัวเดิม
- BEA WebLogic
- Hyperion
- Siebel
- Collaxa
- และตัวอื่น ๆ
ดูรายละเอียดต่อที่นี่ครับ
http://www.oracle.com/technology/products/middleware/index.html

Oracle Fusion Application ก็จะเป็นการรวมกันของ
- Oracle E-Business Suite เดิม
- PeopleSoft
- JD Edward
- และตัวอื่น ๆ
ดูรายละเอียดต่อที่นี่ครับ
http://www.oracle.com/applications/fusion.html

onono said...

อยากถามว่า filesperset ใน RMAN คืออะไร มีวิธีการคำนวณยังไงให้ได้ขนาดที่เหมาะสมค่ะ และการกำหนดค่าตัวนี้กับไม่ได้กำหนด ต่างกันยังไงบ้าง

ขอบคุณค่ะ

cherrymckwai said...

คุณ onono ค่ะ

สำหรับ FILESPERSET ใน RMAN คือการกำหนดจำนวน File (datafile/archivelog file) ต่อ Backup Set ค่ะ วิธีการคำนวณให้เหมาะสมก็ต้องพิจารณาจาก Channel ที่เรากำหนดตอน Backup ค่ะ โดยปรกติ ถ้าไม่กำหนดค่าให้กับตัวนี้ Oracle จะมีค่า Default ให้ค่ะ โดยพิจารณาจาก 2 ค่า ว่าค่าใด น้อยกว่า ก็จะกำหนดค่าที่น้องกว่าให้ค่ะ โดยค่าที่นำมาพิจารณาประกอบด้วย
1. 64
2. ผลลัพธ์ที่ได้จากการหารจำนวน File ด้วย Channel
เช่น สมมติ ถ้าเรามี data file อยู่ 90 files และมี channel อยู่ 3 channel ผลลัพธ์ที่ได้ก็คือ 90/3 = 30 เมื่อเปรียบเทียบกันแล้วค่า 30 น้อยกว่า 64 ดังนั้น ค่า default ของ FILESPERSET ในการ run rman คราวนี้จะอยู่ที่ 30 ค่ะ ผลลัพธ์ของการ backup คราวนี้จะประกอบด้วย 3 backup set โดยแต่ละ backup set จะมี file อยู่ 30 file ค่ะ

การกำหนด FILESPERSET นั้น ก็เพื่อช่วยให้เราบริหารการทำงานของ resource (ในที่นี้คือ channel) ให้เหมาะสม ไม่ปล่อยให้มัน idle ค่ะ

นอกจากนี้ อาจะต้องพิจารณา parameter ตัวอื่นๆ ประกอบด้วย อย่างเช่น MAXSETSIZE ซึ่งใช้กำหนด maximum size ของ backup set เป็นหน่วย bytes ค่ะ

Anonymous said...

พบปัญหาว่า เมื่อใช้งาน Oracle SQL Developer บน Vista ตัวอักษรที่แสดงจะแตก
เวลาใช้ mouse scroll down ก็จะเพี้ยน แก้ปัญหายังไงได้บ้างครับ

Anonymous said...

อยากทราบว่า ต้องการ get table บางเทเบิล เช่น เทเบิลที่มี prefix SRC เท่านั้น in mapping โดยใช้ OMB Plus ต้องทำอย่างไรค่ะ

ตอนนี้ที่ลองที่ใช้มันจะ get all table in mapping เลยอะคะ
[OMBRETRIEVE MAPPING 'MAP1' GET TABLE OPERATOR]

แต่ถ้าเป็นพวก คำสั่ง OMBLIST TABLE 'SRC_.*' มันจะได้ผลลัพธ์ที่มีแต่ SRC_ เท่านั้น

เลยอยากทราบว่า การใช้ OMBRETRIEVE MAPPING GET TABLE OPERATOR สามารถระบุชื่อเทเบิลที่เราต้องการได้หรือไม่ ถ้าได้กรุณายกตัวอย่างให้ด้วยนะค่ะ

ฝากด้วยนะค่ะ
ขอบคุณล่วงหน้าค่ะ
itzaa

kim said...

ตอบคุณ anonymous เรื่อง SQL Developer บน Vista ครับ
1. download JDK 6 version ล่าสุดครับ
2. ติดตัง JDK 6 ที่ download มา
3. ไปยัง path ที่ติดตั้ง SQL Developer ดังนี้
[SQL_DEV_HOME]\sqldeveloper\bin
4. เปิด file sqldeveloper.conf แล้วเพิ่มบรรทัดนี้ลงไปล่างสุดครับ
โดยระบุ Java Path ไปยัง folder ที่ได้ติดตั้งในข้อ 2 ดังตัวอย่าง
SetJavaHome C:\java\jdk16014

Anonymous said...

สวัสดครับ
พอดีมีข้อสงสัยนิดหน่อย ก่อนอื่นต้องออกตัวก่อนว่าเราไม่ใช่คน IT นะ คือว่า ที่บริษัท เราใช้ JDE Module AP กะ GL อยู่ แต่คราวนี้ จะมีการนำ app ที่เกี่ยวกับเรื่อง paymentตัวใหม่มาติดตั้งซึ่งพัฒนาบนพื้นฐานของ Oracle ซึ่งอาจจะพ่วงเอา module AP เข้ามาใช้ด้วย
เราไม่แน่ใจ JDE AP กะ GL มันควรจะใช้คู่กันหรือเปล่า แล้วถ้ามีการเปลี่ยน AP จริง มีอะไรที่น่าเป็นกังวลบ้าง

ไม่แน่ใจว่าจะเข้าใจคำถามเราหรือเปล่านะ

ขอบคุณมาก

Anonymous said...

To คุณ kim
เนื่องจาก ผมแก้ปัญหา Oracle Reports 10G บน UNIX Platform(OS Debian) ให้ใช้งาน PDF ภาษาไทยได้แล้วครับ แต่ติดปัญหาคือ
1. แสดงข้อความไม่พอรวมถึงจัดตำแหน่งไม่ตรงตามต้องการ ทั้งๆที่รัน test บนเครื่อง (OS windows XP) แสดงผลถูกต้อง
2. มีการตัดคำภาษาไทย โดยถูกตัดในระดับตัวอักษร เช่น "ปรับปรุงระบบคอมพิวเตอร์" จะ ถูกตัดเป็น "ปรับปรุงระบบค" กับ "อมพิวเตอร์" หากให้ตัดในระดับของคำต้องทำอย่างไรครับ ปัญหาเหมือน คุณ pra และ คุณ smuensa ครับ
ขอบคุณมากครับ
มาโนชย์ manote_tai@hotmail.com

Kim said...

คุณมาโนชครับ,
ตอบให้ทาง mail แล้วครับ

IaM said...

จะขอสอบถามการเขียนสคริป pl/sql ค่ะ
พอดีว่าติดปัญหาตรงที่ เอาไฟล์จาก select view_name from user_views where view_name like 'PP%' แล้วเอาแต่ละ file มา write เป็น .txt จะเขียนยังไงอ่ะคะ
คือมี view มากกว่า1 ค่ะ

cherrymckwai said...

คุณ IaM ค่ะ

ไม่แน่ใจเรื่องคำถามนะค่ะ ขอทำความเข้าใจนิดนึง คือจะเอาข้อมูลที่ได้จากการ view_name ที่ select มา แล้ว write ข้อมูลที่ได้ ออกเป็น file xxx.txt ตามแต่ละ view_name หรือว่า ทุก view_name write ออกมาเป็น file เดียวกัน หรือยังไงค่ะ

IaM said...

เอาออกมาตาม view_name ค่ะ คือมี view_name 10 view ก็ให้มีไฟล์ 10 file อ่ะค่ะ

cherrymckwai said...

เอ แล้วแต่ละ File ก็จะเป็นข้อมูลที่ได้จากการ Query view นั้นๆ หรือเปล่าค่ะ ถ้าเป็นอย่างนั้นแล้ว แต่ละ View มี Column เท่ากัน หรือ เหมือนกันหรือเปล่าค่ะ เพราะถ้ามันต่างกัน โอกาสที่จะทำ Script ดังกล่าวก็อาจจะยากนะค่ะ แต่ถ้า Column เท่ากัน และ Data Type ตรงกันด้วยแล้ว น่าจะไม่ยากเท่าไหร่ค่ะ

Kim said...

ตอบคุณ IaM ครับ,
ผมและคุณ cherrymckwai อ่านโจทย์ที่คุณ IaM ได้ถามมา แต่ก็ยังไม่เข้าใจในคำถามอย่างชัดเจน จึงต้องรบกวนให้คุณ IaM ช่วยส่ง email หรือโทรมาที่ office 02-634-1711 ก็ได้ครับ ถ้าช่วยเหลือได้ ก็จะยินดีช่วยครับ

onono said...

สวัสดีค่ะ

อยากทราบเกี่ยวกับ version ของ OEM ค่ะ สมมติว่า install oracle version 10.2.0.3 แล้วได้ OEM เป็น version 10.2.0.1 อยากถามข้อมูลดังนี้ค่ะ
- สามารถ patch OEM อย่างเดียวได้หรือป่าว
- ถ้า สามารถ patch OEM อย่างเดียวได้ ปัจจุบัน version ของ OEM ไปถึง version ไหนแล้วคะ
และสามารถ download patchset ได้จากหน้าไหน เพราะว่าเข้าไปหาใน otn แล้วไม่เจอค่ะ เจอแต่ที่เป็น grid control ค่ะ

ขอบคุณค่ะ

Kim said...

1. สมมติว่า install oracle version 10.2.0.3 แล้วได้ OEM เป็น version 10.2.0.1
ปกติ install DB 10203 ก็จะได้ EM 10203 ครับ
ลอง check version อีกทีที่
http://hostname:1158/em/console/aboutApplication

2. สามารถ patch OEM อย่างเดียวได้หรือป่าว
ไม่ได้ครับ, patch EM จะเป็น patch ย่อย แก้ bug เป็นเรื่อง ๆ ไป แต่ไม่ใช่ patch เพื่อ up version

3. ถ้า สามารถ patch OEM อย่างเดียวได้ ปัจจุบัน version ของ OEM ไปถึง version ไหนแล้วคะ
EM ใหม่ที่สุด ก็ 10.2.0.4 ที่ได้จากการ update Database patchset 10.2.0.4
ส่วน 10.2.0.5 ใกล้จะออกแล้ว

4. สามารถ download patchset ได้จากหน้าไหน เพราะว่าเข้าไปหาใน otn แล้วไม่เจอค่ะ เจอแต่ที่เป็น grid control ค่ะ
patchset download ได้ที่ http://metalink.oracle.com ต้องมีหมายเลข CSI (Customer Support Identifier) เท่านั้นถึงจะ access ได้
ถ้าใช้งาน metalink เป็นปกติอยู่แล้ว ก็ download patch#6810189 เพื่อ up เป็น 10.2.0.4 ครับ

onono said...

อ๋อ เข้าใจแล้วค่ะ งั้นขอถามเพิ่มค่ะ ว่า command emca -version ตรงนี้เป็น version ของอะไรคะ
$ emca -version
EM Configuration Assistant, Version 10.2.0.1.0 Production
Copyright (c) 2003, 2005, Oracle. All rights reserved.

ตอนแรกเข้าใจผิดว่าตรงนี้เป็น version ของ EM ค่ะ

เนื่องจาก EM ตัวที่ลงไม่รู้จัก hardware link ที่ collect hardware error แต่ในส่วนของ database ใช้งานได้ปกติ เลยคิดว่า version ของ EM เก่าไปค่ะ ก็เลยจะ patch EM ค่ะ

อย่างนี้พอจะมีแนวทางอื่นในการแก้ไขหรือป่าวคะ

Kim said...

1. ขอถามเพิ่มค่ะ ว่า command emca -version ตรงนี้เป็น version ของอะไรคะ

emca คือ Enterprice Manager Configuration Assistacne
จะใช้ในการ create/config/delete EM เพื่อ
- สร้าง EM มาผูกกับ DB ที่ไม่เคยมี EM มาก่อน (ตอนสร้าง DB เอา checkbox ตัวนี้ออกไป)
- ใช้แก้ config ของ EM
- ใช้ลบ EM เมื่อเราไม่ต้องการใช้งานแล้ว (DBA เชี่ยว ๆ ถนัด command มือ มากกว่าหน้า web และเพื่อประหยัด resource ของ CPU, Memory ในการ monitor EM)

คล้าย ๆ กับ dbca, netca
dbca คือ Database Configuration Assistacne ใช้ในการสร้าง DB, Config DB, delete DB เป็นต้น

2. เนื่องจาก EM ตัวที่ลงไม่รู้จัก hardware link ที่ collect hardware error แต่ในส่วนของ database ใช้งานได้ปกติ เลยคิดว่า version ของ EM เก่าไปค่ะ ก็เลยจะ patch EM ค่ะ
ขอรายละเอียดเพิ่มครับ

onono said...

ขอบคุณค่ะ คุณ kim

คือ install oracle 10201 patch to 100203 ตัว EM ใช้งานได้ปกติไม่ได้ reconfig ใหม่ เข้าไปที่ link hardware collection error ตามด้านล่างค่ะ

Hardware
Information of type Host Configuration for Host poseidon] into repository: Error carrying out the repository operation - the SQL statement: insert into MGMT_HC_IOCARD_DETAILS( BUS,VENDOR_NAME,FREQ_IN_MHZ,NAME,REVISION,SNAPSHOT_GUID) values ... .-Error Code: 1400 Error Message: ORA-01400: cannot insert NULL into ("SYSMAN"."MGMT_HC_IOCARD_DETAILS"."NAME") Collection problem(s) for failed component: CLOCK_FREQUENCY_IN_MHZ : Could not able to collect this information.

Surachart Opun said...

หลังจาก patch to 100203 บน readme.html
มีบอกให้
emca -upgrade db

ด้วยหรือเปล่า

onono said...

ใน readme ไม่ได้บอกนะคะ ว่าให้ run
emca -upgrade db

Surachart Opun said...

โอเคครับผม

ฝากเช็ค emoms.trc ไฟล์หน่อยนะครับ
ถ้าสามารถเข้า metalink ฝากลองดู 843767.1
ไม่แน่ใจว่าตรงไหม

onono said...

search เจอ bug นี้ใน metalink เหมือนกันค่ะ แต่เห็นว่า applies to Enterprise Manager Grid Control - Version: 10.2.0.4 ไม่ค่อยตรงเท่าไร คงจะลองแก้ตาม bug นี้ดูค่ะ ยังไงขอบคุณมาก ๆ นะคะ ที่ช่วยดูให้

Anonymous said...

อยากสอบถามเกี่ยวกับการทำ Guage ของ BIDiscovere หน่อยค่ะ เนื่องจากตอนแสดงผลไม่สามารถแสดงเป็นภาษาไทยได้จะแสดงเป็นตัวสี่เหลี่ยมๆๆ ต้องทำยังงัยค่ะ

Kim said...

ถามเพิ่มเติมครับ
1. ปัญหาที่เกิดเป็นบน Discoverer Viewer, Discoverer Plus, หรือ Discoverer Portlet

2. ภาษาไทยที่เป็นสี่เหลี่ยม เป็นเฉพาะ Guage หรือการแสดงผล Chart อื่น ๆ ก็เป็น

Pak said...

To kim
เป็นที่ Discoverer Portlet ค่ะ แล้วก็เป็นเฉพาะที่ Guage ที่เดียว Chart อื่นแสดงได้ปกติค่ะ

Kim said...

ถามเพิ่มครับ
1. OS น่าจะ unix ระบุด้วยครับ
2. version ที่ใช้เป็น 10.1.2.0.2?
3. patchset ล่าสุดที่ลงไปเป็น 10.1.2.3.0?
4. ข้อมูลที่เป็น สี่เหลี่ยม เป็นข้อมูลที่ดึงมาจาก Database หรือเป็นแค่ wording ที่สร้างใน discoverer admin
5. ถ้าเป็นข้อมูลจาก base, ขอทราบ database encoding เป็น TH8TISASCII?
6. ถ้าทดลองสร้าง worksheet, workbook ใหม่แบบ Guage ก็ยังเป็นอีก, หรือเป็นแค่ worksheet, workbook นั้น ๆ

pak said...

ใช้ Unix ค่ะ ส่วน version discoverer 10.1.2.1
ข้อมูลที่แสดงดึงมาจาก database ลองสร้างจาก workbook อื่นแล้ว
ก็ยังเป็นเหมือนเดิม ส่วนข้อมูลอย่างอื่นต้องรอถาม admin ก่อนค่ะ
ไม่ทราบว่าสามารถแนะนำการ set ค่าต่างๆ ให้ได้มั้ยค่ะ ขอบคุณค่ะ

Kim said...

ถ้าเป็นไปได้ ขอ screenshot ด้วยครับ
ส่ง mail มาที่ tom@middleware.co.th
ผมจะทดลองทำ simulate test ดูครับ

JoeIMIsu said...

ขอคำแนะนำเรื่อง จะใช้ oracle สร้างโปรแกรมแชท ครับ

ถ้าจะใช้ pl/sql ล้วนๆเลย หรือว่าจะใช้ java เข้ามาช่วยดีครับ (ออกตัวก่อนว่าจาวาผมยังไม่ได้เรื่อง ฮ่าๆ )

แนะนำด้วยนะครับ
ขอบคุณครับ

JoeIMIsu said...

อ่อลืมบอกไปครับ ใช้เป็น dev 10g ครับ
สามารถส่งไฟล์หากันได้ก็พอครับ

Anonymous said...

รบกวนสอบถามค่ะ เนื่องจากเขียน procedure แล้วให้มีการ write file เป็น .txt ลงที่เครื่อง server แล้วข้อมูลที่ทำการ select ค่ะมีคอลัมภ์เยอะมากก และคั่นข้อมูลโดยใช้ ; แต่เมื่อรัน procedure นี้ไปก็ทำการ write file ได้ปกติ แต่บางครั้งรันไปก็เกิด error: ORA-29285: file write error
ORA-06512: at "SYS.UTL_FILE", line 140
ORA-06512: at "SYS.UTL_FILE", line 785
ORA-06512: at "REGOPER.SPOOL_PPIS_2551", line 79
ORA-06512: at line 1

นี้ค่ะ ซึ่งคาดการณ์ว่าในการ write file ลง server มันจำกัดความยาวของตัวอักษรด้วยรึป่าว อย่างงี้จะแก้ไขอย่างไรได้บ้างคะ เพราะบางครั้งก็ไม่ทราบว่าข้อมูลจะมีตัวอักษรมากหรือน้อยอ่ะค่ะ

แต่ถ้าทำการ spool file ก็เป็นปกตินะคะ


รบกวนด้วยค่ะ
ขอบคุณค่ะ

cherrymckwai said...

ลองเพิ่ม max_linesize => 32767 ใน utl_file.open ดูนะค่ะ

:= utl_file.fopen(
location => path,
filename => filename,
open_mode => read_write_append,
max_linesize => 32767);

Anonymous said...

รบกวนถามเรื่อง Oracle BI หน่อยคับเรื่องการ sort ภาษาไทย สมมุติผมจะ sort ข้อมูลชื่อจังหวัด แล้วอย่างจังหวัดเชียงใหม่ เชียงราย จะต้องอยู่ข้างล่างจังหวัดชลบุรี ชัยภมูิ แบบนี้นะคับแทนที่จะไปอยู่อันสุดท้าย ขอบคุณคับ

chai said...

รบกวนสอบถามด้วยคับ คือ ผมไป เปลี่ยน tpye ของ คอลัมน์ จาก long raw เป็น BLOB ที่นี่ ผมจะเปลี่ยนกลับมาเป็น type เดิม คือ long raw ทำไม่ได้อ่ะคับ รบกวน ขอคำแนะนำด้วยคับ ขอบคุณมากคับ

bee said...

รบกวนถามเรื่องการเขียน file ค่ะ ตอนนี้ใช้ UTL_FILE ในการเขียน file ซึ่งไม่ต้องการขึ้นบรรทัดใหม่ เลยใช้ UTL_FILE.put ในการ write อยู่ค่ะ แต่พอปิด file ด้วย UTL_FILE.FCLOSE แล้วเปิด file พบว่าขึ้นบรรทัดใหม่ให้ตอนจบค่ะ เลยอยากทราบว่าจะทำอย่างไรให้ไม่ขึ้นบรรทัดใหม่ค่ะ

cherrymckwai said...

เรียนคุณ chai

ตาม concept ของ oracle เราไม่สามารถเปลี่ยน type จาก BLOB กลับมาเป็น long raw ได้ค่ะ
ตอนนี้ที่สามารถทำได้ ก็คือ add new column แล้ว set เป็น long raw
จากนั้น update column โดยใช้ dbms_lob ช่วยค่ะ ขั้นตอนนี้อาจสร้างเป็น Procedure หรือเขียนเป็น pl/sql block ก็ได้ค่ะ

แต่ว่า long raw นั้นมีข้อจำกัดในการใช้งานค่อนข้างมากนะค่ะ

ลองดูนะค่ะ หวังว่าคงช่วยได้บ้าง

cherrymckwai said...

เรียน คุณ bee

ทำไม่ได้ค่ะ ปรกติเวลาที่ใช้ utl_file.fclose แล้ว โปรแกรมจะทำการใส่ Carrier Return และ Line feed ให้ ก่อนที่จะปิด File
อาจจะต้องลองหาทางอื่นดูนะค่ะ หากต้องการในรูปแบบที่ว่าจริงๆ ใช้ spool ใน sqlplus ก็ได้นะค่ะ แต่อาจมีขั้นตอนในการเรียกใช้ยุ่งยากสักนิดนึง

ตัวอย่างนะค่ะ
1. สร้าง sql script file โดยมีข้อมูลดังนี้ (ในตัวอย่างจะ save เป็น test.sql)

set verify off
set serveroutput on
set termout off
set feedback off
spool test.txt
begin
dbms_output.put_line('test');
end;
/
spool off

2. connect sqlplus
3. run sqlscript โดยใช้คำสั่ง ---> @test.sql
4. เปิด file ที่ spool ออกมา (test.txt) จะเห็นว่าไม่มีการขึ้นบรรทัดใหม่ค่ะ

ลองดูนะค่ะ

Anonymous said...

เรียนคุณkim
ผมมีปัญหาเดียวกับคุณมาโนชเลยครับ
(ขออนุญาติิ post มาด้วย)

"เนื่องจาก ผมแก้ปัญหา Oracle Reports 10G บน UNIX Platform(OS Debian) ให้ใช้งาน PDF ภาษาไทยได้แล้วครับ แต่ติดปัญหาคือ
1. แสดงข้อความไม่พอรวมถึงจัดตำแหน่งไม่ตรงตามต้องการ ทั้งๆที่รัน test บนเครื่อง (OS windows XP) แสดงผลถูกต้อง
2. มีการตัดคำภาษาไทย โดยถูกตัดในระดับตัวอักษร เช่น "ปรับปรุงระบบคอมพิวเตอร์" จะ ถูกตัดเป็น "ปรับปรุงระบบค" กับ "อมพิวเตอร์" หากให้ตัดในระดับของคำต้องทำอย่างไรครับ ปัญหาเหมือน คุณ pra และ คุณ smuensa ครับ
ขอบคุณมากครับ
มาโนชย์"

ผมรบกวนขอวิธีแก้ปัญหาให้ด้วยได้ไหมครับ jorn911@hotmail.com ขอบคุณมากครับ
จอน

Anonymous said...

สวัสดีค่ะ รบกวนถามเรื่อง query นะคะ
มีดาต้าดังนี้ค่ะ
id type parent_type
------------------------
1 A INI
1 B A
2 B INI
2 D B
1 C B
3 M INI
3 N M

out put ที่ต้องการเป็นดังนี้ค่ะ
id type parent_type level
------------------------
1 A INI 1
1 B A 2
1 C B 3
2 B INI 1
2 D B 2
3 M INI 1
3 N M 2

โดยให้เริ่มจาก parent_type = 'INI'
ดิฉันได้ลองใช้คำสั่งดังนี้
select id,type,parent_type,level
from tab
start with parent_type = 'INI' and id = 1
connect by prior type = parent_type
and id = 1;
ปัญหาคือดิฉันการ output ทุก id ทั้ง table โดยให้เรียงลำดับ level ของแต่ละไอดีด้วยน่ะค่ะ
จะมีวิธีเขียนอย่างไรได้อีกบ้างคะ

cherrymckwai said...

สวัสดีค่ะ

อันนี้เป็นแบบนึงที่นึกออกนะค่ะ ลองพิจารณาปรับแก้ดูอีกทีก็ได้ค่ะ

SELECT ID, TYPE, parent_type, LEVEL
FROM
(SELECT t1.ID, t1.TYPE, t1.parent_type,
t1.ID || t1.TYPE AS idtyp,
t1.ID || t1.parent_type AS idptyp
FROM temp02 t1)
START WITH parent_type = 'INI'
CONNECT BY PRIOR idtyp = idptyp
ORDER BY 1, 4;

Anonymous said...

สุโค่ย
ได้แล้วค่ะ ขอบคุณมากนะคะ

Unknown said...

แก้ปัญหา Oracle Reports ให้ใช้งาน PDF ภาษาไทยได้ บน UNIX Platform น่ะครับ เนื่องจากทำแล้วติดปัญหาคือแสดงภาษาไทยได้ แต่แสดงข้อความไม่พอ และจัดตำแหน่งไม่ตรงตามต้องการครับ แต่ถ้ารันบน Windows โอเคครับ แต่บน Unix ไม่เวิร์ค รบกวนด้วยครับ

เป้น Oracle report 10.1.2.0.2 นะครับ

รบกวนขอวิธีแก้ด้วยครับ (ปัญหาเดียวกับคุณ pra ครับ)

eid_cpe@hotmail.com

Anonymous said...

คำถามต่าง ๆ แนะนำให้ย้ายไปถามกันที่นี่ครับ
https://www.facebook.com/groups/OUGTH

OUGTH Admin.

Anonymous said...

ถ้าจะ share ตาราง ให้ระบบอื่นมาเรียกใช้ โดยอ่านค่าได้อย่างเดียว ควรสร้างเป็น View หรือ Synonym