หมายเหตุ 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












0 comments:
Post a Comment