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