หน้าเว็บ

วันจันทร์ที่ 28 พฤศจิกายน พ.ศ. 2554

เรียกใช้ PL/SQL Oracle ด้วย java


        พอดีมีท่านผู้อ่านท่านหนึ่งได้เข้ามาถามผมเกี่ยวกับเรื่องของการเรียกใช้ PL/SQL ของ oracle ด้วย ภาษา  java   ว่าเราจะเรียกใช้ PL/SQL  ที่เราได้เขียนไว้ใน database ยังไง
        ผมก็ได้ไปลองศึกษาค้นคว้าหาข้อมูลมาดู  ก็สามารถทำได้ดังนี้ครับ

ผมเขียน java ผ่าน Netbeans IDE 7.0 น่ะครับ ดูวิธีการเซตค่าต่างๆ  ในหัวข้อ  ติดตั้ง Oracle database 11g R1 (11.1.0.6.0) เพื่อใช้งาน กับ Netbeans IDE 7.0 และ ติดตั้ง Plugin iReport เพื่อการออกแบบรายงาน บน windows 7

        เดี๋ยวเรามาลองสร้าง strored function ใน oracle database 11g R2 กันดู (พอดีผมใช้ R2    , R2 ก็ไม่ได้แตกต่างอะไรมากกับ R1 หรอกครับ  คล้ายๆกัน)  ไปดูกันเลยครับ



 ตอนแรกก็ run SQL Developer ขึ้นมาก่อน


จากนั้นก็ไปที่ฟังก์ชัน(Functions)


 จากนั้นก็คลิ๊กขวาที่ Functions  แล้วก็เลือก New Function


จะมีหน้าต่าง Create PL/SQL Function โผล่ขึ้นมาครับ  
ก็ให้เราตั้งชื่อฟังก์ชันแล้วก็ใส Return Type ให้มัน  แล้วก็ OK ไป


จากนั้น SQL Developer  ก็จะ Generate โค๊ดขึ้นมาให้เราเขียนเพิ่มเติมลงไป



 ผมลองเขียนโค๊ดง่ายๆดูน่ะครับ  เพื่อการทดสอบ


 จากโค๊ดข้างบนที่ผมได้เขียนไว้ก็คือ  ให้ทำการนับจำนวณนักศึกษาทั้งหมดในตาราง Student ว่ามีกี่คน  ได้ผลลัพธ์ใส่ลงในตัวแปร counter  และ return ค่าของ counter ออกจาก stored function
โค๊ดง่ายๆน่ะครับ  ซึ่งตัวตาราง student นีัผมได้ทำการสร้างขึ้นมาอยู่ก่อนแล้ว

จากนั้นก็ทำการ compile โปรแกรมโดยคลิ๊กเมาส์ที่ 



ถ้าหากว่าโปรแกรมเราไม่มีอะไรผิดพลาด ตรงส่วนของ Running-Log ก็จะไม่แสดงอะไรออกมา


จากนั้นเราก็มาเขียนโปรแกรมทดสอบ stored function ที่เราได้เขียนขึ้นมาลองดูกันครับ


จากนั้นให้ไปที่ DBMS Output แล้วคลิ๊กที่


เพื่อให้ DBMS เราสามารถแสดงผลลัพธ์ของ script โปรแกรมที่เราเขียนไว้ได้



เมื่อกดแล้ว  สังเกตว่าจะมี คำว่า set serveroutput on แสดงขึ้นมา  ห้ามเป็น  set serveroutput off  เพราะ DBMS จะไม่แสดงผลลัพธ์ให้เราเห็น  ต้องเป็น on เท่านั้น

จากนั้นทำการ run script โดยคลิ๊กที่  


ก็จะมี massege ว่า  anonymous block completed  แสดงขึ้นมา  ว่าตอนนี้เราได้ทำการ run script เรียบร้อยแล้ว
(anonymous block คือ รูปแบบการเขียนโปรแกรมแบบหนึ่งของ PL/SQL  ที่ไม่มีชื่อ  ที่เราได้เขียนขึ้นเมื่อตะกี๊ครับ   ที่เป็น begin   ...  end;  
ส่วน stored function เป็น PL/SQL แบบ name block เพราะเราได้กำหนดชื่อมันไว้ว่า countstudent   
การเขียน PL/SQL ต้องหาอ่านศึกษาเพิ่มเติมเอาเองน่ะครับ  จะไม่ขอกล่าวในที่นี้)


จากนั้นให้ไปที่ DBMS Output  เพื่อดูผลลัพธ์การทำงาน



ผลลัพธ์คือ  มีข้อมูลจำนวนนักศึกษา 50 คนถูกเก็บไว้ในตาราง Student
เราลองมาดูจากตารางจริงดูครับ


ตอนนี้  เราทดสอบ PL/SQL ใน DBMS กันเสร็จเรียบร้อยแล้ว
เรามาเริ่มการเขียนโปรแกรมภาษา java เพื่อเรียก strored function  ที่เราได้ทำการเขียนไว้กันดีกว่าครับ

ผมเคยกล่าวมาแล้วน่ะครับว่าผมใช้ Netbeans IDE 7.0  ขั้นตอนการติดตั้งและตั้งค่าต่างๆ  ก็ได้บอกไปในตอนต้นแล้ว  ตอนนี้อยู่ในช่วงเขียนโปรแกรมอย่างเดียวครับ


ส่วนหลักจริงๆของตัวโปรแกรมมีแค่นี้เองครับ 
CallableStatement stm=con.prepareCall("Begin ? := countstudent(); End;");
stm.registerOutParameter(1,Types.INTEGER);
stm.execute();
int counter=stm.getInt(1);
System.out.println(counter);
        คลาส CallableStatement เป็น คลาสที่อยู่ใน library JDBC  เอาไว้สำหรับเรียกใช้งาน PL/SQL  ที่เราได้เขียนและเก็บไว้ในฐานข้อมูล 

CallableStatement stm=con.prepareCall("Begin ? := countstudent(); End;");

เป็นการเขียนโค๊ดแบบที่เรียกว่า prepare(พรีแพร์) statement  คือ เขียนโค๊ดไปก่อน  แล้วจึงกำหนดค่าให้กับ พารามิเตอร์ทีหลัง  โดยจะใช้สัญลักษณ์ ?  เพื่อบอกว่าตรงนี้มีพารามิเตอร์ 1 ตัวที่เราจะกำหนดค่าให้กับมันทีหลัง

stm.registerOutParameter(1,Types.INTEGER);

บอกว่าให้กำหนดพารามิเตอร์ตัวที่ 1 ให้ทำหน้าที่เป็น output โดยเซต data type เป็น integer

stm.execute();

จากนั้น เอ็กซีคิวต์คำสั่ง(ให้คำสั่ง CallableStatement stm=con.prepareCall("Begin ? := countstudent(); End;");  ทำงาน)

int counter=stm.getInt(1);

รับค่าผลลัพธ์ที่ได้จากการทำงานมาจาก object stm  ไปเก็บไว้ในตัวแปร counter

  System.out.println(counter);

จากนั้นก็แสดงผลลัพธ์


ถ้าหากเราเขียนโปรแกรมเก็บไว้เป็น  package


เวลาเรียกใช้งานก็เพียงแค่เขียนเป็น (ชื่อ package).(ชื่อ stored function)  เช่น  MSP.AGE(?);
แทน countstudent ใน CallableStatement stm=con.prepareCall("Begin ? := countstudent(); End;");  แค่นั้นเองครับ

อีกตัวอย่างนึงเพื่อให้เห็นภาพมากขึ้นครับ

ตัว function AGE ถูกเก็บไว้ใน package MSP ครับ  ทำหน้าที่ในการคำนวณอายุ  โดยเอาเวลาปัจจุบันลบออกด้วยเวลาที่เรากรอกเข้าไป


 stm.registerOutParameter(1,Types.INTEGER);
? ตัวที่ 1 ให้เป็น output  จากนั้นส่งผลลัพธ์ให้กับ age

stm.setString(2,Birthday );

? ตัวที่ 2 ในเป็นพารามิเตอร์ Birthday

ศึกษาเพิ่มเติมได้ที่  http://docs.oracle.com/cd/B10500_01/java.920/a96659/04_call.htm

ไม่มีความคิดเห็น:

แสดงความคิดเห็น