วันพฤหัสบดีที่ 29 กรกฎาคม พ.ศ. 2553

ปัญหา java call Function return type boolean ใน oracle

สำหรับคนที่เคยใช้ ฐานข้อมูล oracle คงหนีไม่พ้นเรื่องการเขียน pl/sql ซึ่งก็เป็นจุ่นเด่นของ oracle เค้าว่าอย่างนั้น แต่มีนักพัฒนาไม่น้อยที่
ไม่จำเป็นต้องรู้จักหรือต้องเรียนรู้การเขียน pl/sql รู้แต่เพียงว่าเรียกใช้ procedure/function pl/sql เท่านั้น
ปัญหาอย่างหนึ่งระหว่าง java กับ oracle คือการเรียกใช้ function ใน oracle ที่มี Return type เป็น boolean ซึ่งเค้าว่ากันว่า java ยังไม่ support
การเรียกใช้ Return type ที่เป็น boolean นี่อาจเป็นวิธีทางแก้อีก หนึ่งทางเลือกสำหรับนักพัฒนาคือการเขียน pl/sql ครอบระหว่างการเรียนใช้ function ของ orcle
ซึ่งในตัวอย่างประกอบไปด้วย
1. pl/sql function ที่ return ค่าเป็น boolean
2. การเรียกใช้โดยใช้ java

--สร้าง ประกาศ function และสร้าง package
create or replace
PACKAGE PKG_TEST AS
FUNCTION F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2) RETURN BOOLEAN;
END PKG_TEST;

/***********************************************/
--สร้าง body และสร้าง function F_GET_TEST_BOOL โดย return type ที่เป็น boolean
create or replace
PACKAGE BODY PKG_TEST AS
FUNCTION F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2)
RETURN BOOLEAN AS
B_RESULT BOOLEAN := TRUE;
BEGIN
IF P_SALARY1>1500 THEN
P_SALARY2 := 'salary1 > 1500 bath';
ELSE
P_SALARY2 := 'salary1 < 1500 bath';
B_RESULT := FALSE;
END IF;
RETURN B_RESULT;
END F_GET_TEST_BOOL;

END PKG_TEST;

//เรียกใช้ จากโดย java set parameter in,out,และ return type

package com.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;

public class TEST_CALL_FBOOL {
//สร้าง connection method เพื่อ connec oracle
private static Connection conn()
{
String conStr;
Connection conn;
try
{
//สร้าง url connection
conStr = "jdbc:oracle:thin:@localhost:1521:orcl";
//register class dirver
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
//connection & return
return conn = DriverManager.getConnection(conStr, "system", "root");
}
catch(Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//การเรียนใช้
P_CALL_FUNCTION_BOOL();
}

//สร้าง method สำหรับ เรียกใช้ fuction PL/SQL
public static void P_CALL_FUNCTION_BOOL()
{
//ประกาศ call prepared
CallableStatement cstmt = null;
//ประกาศ connection
Connection conn = null;
try {
//connection
conn =conn();

// -------------------------------------------------------------
// Call PL/SQL Function to retrieve {?= call function(?,?...n)}
// -------------------------------------------------------------
//F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2)
//วิธีแก้ไขสำหรับการเรียน function จาก pl/sql ที่มี return type เป็น boolean เราจะทำการเขียน pl/sql คลอบ function ที่ต้องการเรียกใช้
//และมีการ return type เป็น varchar แทน ในตัวอย่าง ประกาศ ตัวเเปรที่ชื่อ B_VAL เป็น boolean เพื่อรับค่าจาก function ที่ return type เป็น boolean
//โดย function มี argument ที่เป็น IN(P_SALARY1) และ OUT(P_SALARY2) จากนั้น ก็ทำการ check if B_VAL เป็นจริงหรือไม่ ถ้าเป็นจริงให้ ตัวแปร ? มีค่าเป็น "T" String เพื่อ Return
//ค่าให้ java ใช้งาน

// prepared call
cstmt = conn.prepareCall("DECLARE B_VAL BOOLEAN; " +
"BEGIN B_VAL := PKG_TEST.F_GET_TEST_BOOL(?,?);" +
"IF (B_VAL) THEN ? := 'T'; END IF; END;");

//register input parameters
cstmt.setInt(1,1000);

//register output parameters
cstmt.registerOutParameter(2, OracleTypes.VARCHAR);

//register Return type
cstmt.registerOutParameter(3, OracleTypes.VARCHAR);

// Execute and retrieve the returned values
cstmt.execute();

System.out.println("******************************************8");

String result1 = cstmt.getString(2); //OUT parameter
String result2 = cstmt.getString(3); //Return type เื่พื่อทำไป check แล้วใช้งานต่อไป(ที่ได้จากการเรียก function)
//หมายเหตุ ถ้าเป็น True จะได้ String = 'T' แต่ถ้าเป็น False มีค่าเป็น null

System.out.println("Result Output param:"+result1);
System.out.println("Result Return Type:"+result2);

//close
cstmt.close();
conn.close();
}
catch (SQLException e)
{
System.out.println("'ERROR':"+e.toString());
}
}
}

ตัวอย่างสำหรับการเรียกใช้ function ของ pl/sql ที่มีการ Return type เป็น boolean โดยใช้ ภาษา java

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

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