ORA-29280: invalid directory path

ปัญหาที่ผมเจอจากการเขียน PL/SQL ในการ import text file ซึ่งมีการไปอ่านไฟล์จาก directory ที่กำหนดไว้แล้วบันทึกลงฐานข้อมูล (ใช้ package UTL_FILE ของ Oracle) โดยติดปัญหาที่คำสั่ง

in_file := UTL_FILE.fopen ("Path of file", "File name", 'R');

เพราะทดลองรันแล้วจะขึ้น “ORA-29280: invalid directory path” ลองดีบั๊กดูจึงรู้ว่าพอถึงคำสั่งเปิดไฟล์ขึ้นมาอ่านก็ขึ้น error ตามที่กล่าว ตอนแรกผมคิดว่าอาจเป็นเพราะ User oradb นั้นไม่มีสิทธิ์เข้าถึงหรืออ่านข้อมูลจาก Directory ในเครื่องผมหรือเปล่า จัดแจงเพิ่มสิทธิ์เรียบร้อยก็ไม่ได้ สุดท้ายต้องเพิ่งอาจารย์ google ได้ความว่า
1. ในการอ่านเขียน File ผ่าน PL/SQL นั้นจะต้องมีการกำหนด Path ของ Directory ในตัวแปร “utl_file_dir” ก่อน ซึ่งหลายๆที่ก็บอกให้ไปกำหนดใน init.ora เช่น

utl_file_dir = full_path_for_directory

ซึ่งผมลองแล้วก็ไม่ได้
2. ให้ตรวจสอบดูว่า ตัวแปรระบบ ที่ชื่อ “UTL_FILE_DIR” นั้นมีค่าเป็นอะไร ด้วยคำสั่งดังนี้

select name,value,display_value from v$parameter where name = 'utl_file_dir';

แล้วข้อมูลที่ได้คือ ค่า value และ display_value เป็นค่า null คือไม่มีค่าอะไร เมื่อไม่มีค่าอะไรผมก็หาวิีธีในการ set ค่า “UTL_FILE_DIR” แล้วก็ได้คำสั่ง

ALTER SYSTEM SET UTL_FILE_DIR='directory_path' scope=spfile;

และยังได้ความรู้เพิ่มมาอีกว่า สามารถกำหนดหลายๆ Directory ได้โดยใช้ “,” เช่นอยากเปลี่ยนเป็น “C:\tmp,C:\data\tmp” ที่ง่ายกว่านั้นก็คือ สามารถใช้ “.” แทนด้วยทุก Directory ตามแต่ที่เราจะใส่เข้าไป เมื่อแก้ไขเสร็จทำการ stop oracle service และ start service มาใหม่ จากนั้นทดลองใช้

select name,value,display_value from v$parameter where name = 'utl_file_dir';

ทีนี้ค่า value และ display_value ก็เปลี่ยนมาเป็น “*” แล้ว ทดลองรัน PL/SQL ที่เขียนขึ้นมาก็ใช้ได้แล้ว

  1. No comments yet.

  1. No trackbacks yet.