การอ่านข้อมูลจากไฟล์ .txt เขียนลงฐานข้อมูล Oracle ด้วย UTL_FILE

ในการใช้ application ร่วมกันของระบบนั้นบางครั้งอาจจะต้องมีการดึงข้อมูลจาก text file ด้วย นี่คือตัวอย่างการอ่านไฟล์ด้วย UTL_FILE Package ครับ

หมายเหตุ 1: ตั้งแต่ขั้นตอนที่ 1,3,4,5,6 หากผุ้อ่านเคยทำไว้แล้ว ไม่ว่าทำผ่าน tools หรือ command ให้ข้ามไปขั้นตอนที่ 7 ได้เลยครับ
หมายเหตุ 2 : หากจะใช้คำสั่งใช้ (ต้องใช้สิทธิ SYS นะครับ)
CREATE DIRECTORY EXTERNALS AS'C:\EXTERNALS ';       -- ชื่อโฟรเดอร์ของเราเอง
GRANT READ, WRITE ON DIRECTORY EXTERNALS  TO JMEDX; -- JMEDX user ของผู้ใช้
เสร็จแล้วให้ข้ามไปขั้นตอนที่ 7 ได้เลยครับ

ขั้นตอนที่ 1 : สร้างโฟรเดอร์เก็บ text file ชื่อ "EXTERNALS"

และสร้าง text file ไฟล์ชื่อ "input" ไว้ในโฟรเดอร์ดังกล่าวพร้อมตัวอย่างข้อมูลให้เรียบร้อยก่อน



ขั้นตอนที่ 2 : สร้างตารางชื่อ "SS_TB_EMPLOYEE"
CREATE  TABLE EMP12(EMPNO NUMBER(10), ENAME VARCHAR2(15), JOB VARCHAR2(15), MGR NUMBER(4), HIREDATE     DATE, SAL NUMBER(7,2));

    เมื่อสร้างเสร็จจะเป็นดังรูป


    เบื้องต้นในตารางไม่มีข้อมูลใดๆเลย

ขั้นตอนที่ 3 : เปิดโปรแกรม SQL Developer ขึ้นมาทำการ connect ด้วย user "SYS" และคลิกขวาที่ "Directories" จากนั้นเลือก Create Directory... เพื่อสร้างชื่อ Directory ให้ระบบรู้จัก

ขั้นตอนที่ 4 : ป้อนชื่อ Directory Name และ Database Server Directory ซึ่งก็คือ path ของโฟรเดอร์ที่เราสร้างไว้ก่อนหน้านั้น จากนั้นก็กด Apply และ OK



ขั้นตอนที่ 5 : ต่อมาเป็นขั้นตอนการกำหนดสิทธิ์การเข้าถึง Directory ใหม่ที่สร้างขึ้นว่า ใครมีสิทธิ์เข้าใช้ได้บ้าง ให้ทำการคลิกขวาที่ Directory ที่เราสร้างจากนั้นเลือก "Grant" เมื่อเลือกแล้วจะมีหน้าต่างใหม่ขึ้นมา

ขั้นตอนที่ 6 : ในหน้าต่างใหม่ ให้เลือก Users/Roles ของเราเอง (1) จากนั้นกำหนดสิทธิ์ให้เลือก Grant All (2) แล้วกดปุ่ม Apply

ขั้นตอนที่ 7 : เมื่อสร้าง Directory และกำหนดสิทธิ์ต่างๆเสร็จแล้วขั้นตอนต่อมาคือการเขียน Procedure ครับ
create or replace PROCEDURE read_file
IS
  -- ประกาศตัวแปรสำหรับจัดการไฟล์
  f_line VARCHAR2(2000);
  f utl_file.file_type;
  -- ประกาศตัวแปรสำหรับจัดการข้อมูล
Comma1 VARCHAR(10);
  Comma2 VARCHAR(10);
  Comma3 VARCHAR(10);
  Comma4 VARCHAR(10);
  Comma5 VARCHAR(10);
  -- ประกาศตัวแปรสำหรับจัดการตาราง
f_empno SS_TB_EMPLOYEE.empno%type;
  f_ename SS_TB_EMPLOYEE.ename%type;
  f_job SS_TB_EMPLOYEE.job%type;
  f_mgr SS_TB_EMPLOYEE.mgr%type;
  f_hiredate SS_TB_EMPLOYEE.hiredate%type;
  f_sal SS_TB_EMPLOYEE.sal%type;
BEGIN
  -- ใช้ UTL_FILE เปิดไฟล์ โดยใช้ 'EXTERNALS' เป็นชื่อ directory 
  -- ตามด้วยชื่อไฟล์ 'input.txt' และโหมดการอ่าน 'R' (Read)
  f := SYS.UTL_FILE.FOPEN('EXTERNALS','input.txt','R');
  LOOP
    BEGIN
      utl_file.get_line(f,f_line); -- อ่านทีละบรรทัดโดยการวนลูป
    EXCEPTION
    WHEN no_data_found THEN
      EXIT;
    END;
    --ตัดคำแต่ละตัวด้วย ',' โดยหา ',' ในแต่ละตำแหน่ง
    Comma1 := INSTR(f_line, ',' ,1 , 1);
    Comma2 := INSTR(f_line, ',' ,1 , 2);
    Comma3 := INSTR(f_line, ',' ,1 , 3);
    Comma4 := INSTR(f_line, ',' ,1 , 4);
    Comma5 := INSTR(f_line, ',' ,1 , 5);
    --เอาตำแหน่งที่ได้มาเก้บไว้ในตัวแปร
    f_empno    := to_number(SUBSTR(f_line, 1, Comma1-1));
    f_ename    := SUBSTR(f_line, Comma1+1, Comma2-Comma1-1);
    f_job      := SUBSTR(f_line, comma2+1, Comma3-Comma2-1);
    f_mgr      := to_number(SUBSTR(f_line, comma3+1, Comma4-Comma3-1));
    f_hiredate := to_date(SUBSTR(f_line, comma4+1, Comma5-Comma4-1),'dd-mon-yyyy');
    f_sal      := to_number(SUBSTR(f_line, comma5+1),'99999');
    -- พอมพ์ log
    dbms_output.put_line(f_empno ||' '|| f_ename || ' ' || f_job || ' ' || f_mgr ||' ' || f_hiredate||' '|| f_sal);
    --เอาข้อมูลที่ได้ใส่ตาราง
    INSERT
    INTO SS_TB_EMPLOYEE VALUES
      (
        f_empno,
        f_ename,
        f_job,
        f_mgr,
        f_hiredate,
        f_sal
      );
  END LOOP;
  utl_file.fclose(f);
  COMMIT;
END;
จากนั้น ทำการ run script (1) เราก็จะเห็นว่า Procedure ถูกสร้างขึ้นใหม่ ให้คลิกขวาที่ Procedure "READ_FILE" แล้วกด Run

ขั้นตอนที่ 8 :  หลังจากดปุ่ม Run แล้วจะมีหน้าต่างใหม่ขึ้นมาให้กดปุ่ม ok เพื่อรันฟังก์ชั้นอ่านข้อมูลจาก text file

ขั้นตอนที่ 9 : ให้ดูในตารางที่เราสร้างว่าข้อมูลเข้าหรือยัง เป็นอันเสร็จสิ้นการอ่านข้อมูลจากไฟล์ .txt  เขียนลงฐานข้อมูล Oracle ด้วย UTL_FILE Package

About Nop

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment

0 comments:

Post a Comment