1. 程式人生 > >在java應用程式下呼叫儲存函式,儲存過程,包

在java應用程式下呼叫儲存函式,儲存過程,包

建立connection連結,釋放關閉連結

package demo.untils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {

	private static String driver="oracle.jdbc.OracleDriver";
	private static String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
	private static String user="scott";
	private static String password="tiger";
	//註冊資料庫的驅動
	static{
		try {
			Class.forName(driver);//採用java反射機制,必然會丟擲異常
			//DriverManager.registerDriver(driver);//一般不採用java提供的這個方法註冊驅動
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//獲取資料庫連結
	public static Connection getConnection(){
		try {
			return DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;//如果不成功,測沒有獲取資料庫的連結
	}
	//釋放資料庫的資源
	public static void release(Connection conn,Statement st,ResultSet rs){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				rs=null;//讓rs迅速成為java垃圾回收的物件
			}
		}
		if(st!=null){
			try {
				st.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				st=null;
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				conn=null;
			}
		}
	}
    
}

呼叫儲存過程
package demo.oracle;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

import oracle.jdbc.OracleTypes;
import org.junit.Test;

import demo.untils.JDBCUtils;

public class TestProcedure {

	/*
	 *create or replace procedure queryempinform(eno in number,
                                           pename out varchar2,
                                           psal out number,
                                           pjob out varchar2)
	 */
	@Test
	public void testprocedure(){
		//{call <procedure-name>[(<arg1>,<arg2>, ...)]}
        String sql = "{call queryempinform(?,?,?,?)}";
        Connection conn =null;
        CallableStatement call =null;
        
        try {
        	//得到一個連結
        	conn=JDBCUtils.getConnection();
        	//通過連結創建出statement
			call=conn.prepareCall(sql);
			
			//對於in引數,賦值
			call.setInt(1, 7839);
			
			//對於out引數 ,宣告
			call.registerOutParameter(2, OracleTypes.VARCHAR);
			call.registerOutParameter(3, OracleTypes.NUMBER);
			call.registerOutParameter(4, OracleTypes.VARCHAR);
			
			//執行呼叫
			call.execute();
			
			//取出結果
			String name = call.getString(2);
			double salary = call.getDouble(3);
			String job = call.getString(4);
			System.out.println(name+"\t"+salary+"\t"+job);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JDBCUtils.release(conn, call,null);
		}
	}
}
呼叫儲存函式
package demo.oracle;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

import oracle.jdbc.OracleTypes;

import org.junit.Test;

import demo.untils.JDBCUtils;

public class TestFunction {
/*
 create or replace function queryempincome(eno in number)
return number
 */
	@Test
	public void testFunction(){
		//{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
        String sql ="{?= call queryempincome(?)}";
        Connection conn = null;
        CallableStatement call= null;
        
        try {
        	//得到資料庫連結
        	conn=JDBCUtils.getConnection();
        	//基於連結建立statement
			call = conn.prepareCall(sql);
			
			//對於輸出引數,宣告
			call.registerOutParameter(1, OracleTypes.NUMBER);
			//對於輸入引數,賦值
			call.setInt(2, 7839);
			
			//執行呼叫
			call.execute();
			
			//取出年收入的結果(儲存函式的結果)
			double income = call.getDouble(1);
			System.out.println("該員工的年收入是:"+income);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JDBCUtils.release(conn, call, null);
		}
	}
}
呼叫包,要注意下出out引數的強制型別轉換
package demo.oracle;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

import org.junit.Test;

import demo.untils.JDBCUtils;

public class TestCursor {
/*
 create or replace PACKAGE MYPACKAGE AS 

  type empcursor is ref cursor;
  procedure queryEmpList(dno in number,empList out empcursor);
END MYPACKAGE;
 */
	@Test
	public void testcursor(){
		//{call <procedure-name>[(<arg1>,<arg2>, ...)]}
		String sql = "{call MYPACKAGE.queryEmpList(?,?)}";
		Connection conn = null;
		CallableStatement call = null;
		ResultSet rs = null;
		
		try {
			//建立資料庫連結
			conn = JDBCUtils.getConnection();
			//基於連結建立statement
			call = conn.prepareCall(sql);
			
			//對於in引數, 賦值
			call.setInt(1, 20);
			
			//對於out,引數,宣告
			call.registerOutParameter(2, OracleTypes.CURSOR);
			
			//執行呼叫
			call.execute();
			
			//取出該部門的所有員工資訊
			//所有介面都有實現類,不同的是將sql java的介面轉換成oracle資料庫的介面
			rs = ((OracleCallableStatement)call).getCursor(2);
			
			while(rs.next()){
				//取出該員工的工號,姓名,薪水,職位
				int empno = rs.getInt("empno");
				String name = rs.getString("ename");
				double salary = rs.getDouble("sal");
				String job = rs.getString("empjob");
				System.out.println(empno+"\t"+name+"\t"+salary+"\t"+job);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JDBCUtils.release(conn, call, rs);
		}
	}
}


相關推薦

java應用程式呼叫儲存函式儲存過程

建立connection連結,釋放關閉連結 package demo.untils; import java.sql.Connection; import java.sql.DriverManage

如何從 VC WebBrowser 應用程式呼叫指令碼函式

為了呼叫指令碼函式存在的網頁上,您必須使用自動化 ; 換句話說,IDispatch。 使用以下步驟來呼叫指令碼函式從 Visual C++ 應用程式的網頁上存在的: 獲取在 HTML 文件的 IDispatch。 呼叫利用 IDispatch:: GetIDsOfName

VisualVM(8) 查詢JAVA應用程式耗時的方法函式

Java虛擬機器效能管理神器 - VisualVM(8) 查詢JAVA應用程式耗時的方法函式 1.為什麼要監控?         JAVA程式在開發前,根據設計文件的效能需求,是要對程式的效能指標進行

mac資料庫工具Sequel pro安裝總是安裝不到Launchpad應用程式每次開機都要重灌的解決方法

1、首先到Mac系統下安裝HomeBrew Homebrew是一款Mac OS平臺下的軟體包管理工具,擁有安裝、解除安裝、更新、檢視、搜尋等很多實用的功能。簡單的一條指令,就可以實現包管理,而不用你關心各種依賴和檔案路徑的情況,十分方便快捷。 開啟終端,輸入以下指令 /usr/b

編寫一個Java應用程式當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD如1999年1月12日應輸入為19990112)程式將判斷兩個日期的先後順序以及兩個日期之間的間隔天數(例

編寫一個Java應用程式,當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD, 如1999年1月12日應輸入為19990112), 程式將判斷兩個日期的先後順序, 以及兩個日期之間的間隔天數(例如1999年1月1日和1999年1月2日之間的間隔是1天。  

<Java>完成一個“可以由使用者鍵入文字內容並輸出其字元個數”的Java應用程式

一、任務目標     完成一個 java application應用程式,可以接收使用者通過鍵盤輸入的文字,並輸出此段文字字元的個數。   二、Scanner類     Scanner是JDK1.5新增的一個類,可以使用該類建立一個物件。它是一個可以使用正則表示

C#/WPF 應用程式A 呼叫WPF編寫的應用程式B的exe時引數傳遞問題

經過驗證該方法可行,注意:引數可以多個傳入,以空格分隔開的; WPF中, 應用程式A 呼叫WPF編寫的應用程式B的exe,引數傳遞給B的 主要方法: 1、在App.xaml.cs中的App類中,過載

編寫一個Java 應用程式計算兩個大整數的和、差、積和商並計算一個大整數的因 子個數(因子中不包括1 和大整數本身)。

1 package ex6_2; 2 import java.math.BigInteger; 3 4 public class BigintegerExample { 5 public static void main(String[] args) { 6

編寫一個Java 應用程式使用者從輸入對話方塊輸入了兩個日期程式將判斷兩個日期的 大小關係以及兩個日期之間的間隔天數。

1 package ex6_1; 2 3 import java.sql.Date; 4 import java.util.Calendar; 5 6 import javax.swing.JOptionPane; 7 8 public class DateExample { 9

猜數字遊戲。編寫一個Java應用程式實現功能:

import javax.swing.JOptionPane;  public class GuessNumber  {            public static void main (String args[ ])       {            

java -Xms -Xmx設定java應用程式執行的記憶體大小Xms Xmx PermSize MaxPermSize 區別

Eclipse崩潰,錯誤提示: MyEclipse has detected that less than 5% of the 64MB of Perm  Gen (Non-heap memory) space remains. It is strongly recommended that you ex

Java程式呼叫C函式--列印"HelloWorld"

本文是將書中的第二章單獨抽出來,紅色部分為譯者注. 1.概述 這個列印的過程是用JDK或Java 2 SDK寫一個簡單的Java程式,程式會呼叫一個C函式列印"HelloWorld".這個過程將包括以下步驟: 建立一個Java類(HelloWorld.java),以及定義一

寫一個Java應用程式輸入一個數求其平方和立方

package day20170107; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; class InputData {public

[基礎題] 5.(*)按如下要求編寫Java應用程式:(1)編寫一個用於表示戰鬥能力的介面Fightable

/*5.(*)按如下要求編寫Java應用程式: (1)編寫一個用於表示戰鬥能力的介面Fightable, 該介面包含:整型常量MAX; 方法void win(),用於描述戰鬥者獲勝後的行為; 方法int injure(int x),用於描述戰鬥者受傷後的行為。 (2)編寫一

開發筆記9 | 部署 Java 應用程式到阿里雲 EDAS

前言 在之前的一篇文章中,我們介紹了 如何將一個本地的 Java 應用程式直接部署到阿里雲 EDAS ,有不少讀者反饋,如果目前已經在使用阿里雲 EDAS 了,那該如何配合這個外掛部署應用呢?在本文中,我們來介紹 部署 Java 應用程式到阿里雲 EDAS。 關於 EDAS EDAS 是一個圍繞應用和微

應用程序實現對其他應用程式呼叫

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Fiddler監聽Java應用程式http請求方法(Configure a Java Application to Use Fiddler)

Fiddler官網:http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureJavaApp Configure a Java Application to Use Fiddler 要配置Java應用程式以向Fiddle

iOS應用程式如何呼叫以太坊智慧合約

以太坊智慧合約有各種各樣的用例,但到目前為止,從你的iOS應用程式中呼叫它們非常困難。不過如果使用以太坊iOS開發套件和EtherKit,這種情況會改善很多,你可以立即開始使用。在本教程結束時,你將能夠呼叫其ABI(應用程式二進位制介面)中定義的任何公共合約函式。 對於這個專案,我們將使

Java應用程式效能監控

Java應用程式效能監控 您想知道Java Runtime環境的執行狀況嗎? 您想監控執行緒死鎖、異常記憶體、CPU消耗和Java應用程式嗎? 監控Java應用程式 利用ManageEngine Applications Manager Java Runtime 監控功能,可以監