1. 程式人生 > 實用技巧 >java中呼叫儲存過程或函式

java中呼叫儲存過程或函式

1.呼叫函式

CallableStatement cs=con.prepareCall("{?=call get_pname(?,?,?)}");

第一個?表示返回的值,後面的?可以是輸入引數,也可以是輸出引數。

第一個?是返回引數,所以必須有語句:

connection.registerOutParameter(1, Types.VARCHAR);(Types.varchar是型別)

後面的?如果是輸出引數,應該也加上registerOutParameter語句:

connection.registerOutParameter(2, Types.VARCHAR);(2是第2個佔位符,Types.varchar是型別)

最後列印輸出的結果:

System.out.println(cs.getString(1)); (1是對應輸出引數,第一個輸出引數)

2.呼叫儲存過程

CallableStatement cs=con.prepareCall("{call stu_pro(?,?,?)}");(與函式的區別是:沒有?=)
java程式中要列印呼叫過程獲得的值,需呼叫有輸出引數的儲存過程,用法和呼叫函式一樣。

package com.dgy.app;  
  
import java.sql.CallableStatement;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.SQLException;  
import java.sql.Types;  
  
  
public class OraclePro { /** * 連線資料庫 */ public static Connection getConnection(){ Connection con = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); String url = "jdbc:oracle:thin:@PC-200911181406:1521:dgy"; String user
= "dwj"; String pwd = "dwj"; con = DriverManager.getConnection(url,user,pwd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return con; } public static void main(String[] args) throws SQLException { //System.out.println(OraclePro.getConnection()); Connection con=OraclePro.getConnection(); CallableStatement cs=con.prepareCall("{?=call get_pname}");//沒有引數的函式 cs.registerOutParameter(1, Types.VARCHAR);//第一個佔位為輸出,型別是varchar cs.execute(); //不能忘記execute() System.out.println(cs.getString(1)); //列印輸出結果,對應registerOutParameter } }
//有1個輸入引數的函式          
CallableStatement cs=con.prepareCall("{?=call get_pname1(?)}");  
cs.registerOutParameter(1, Types.VARCHAR);  
cs.setLong(2,25);     //輸入引數是25  
cs.execute();  
  
//有1個輸出引數的函式      
CallableStatement cs=con.prepareCall("{?=call get_pname2(?)}");  
cs.registerOutParameter(1, Types.VARCHAR);  
cs.registerOutParameter(2, Types.VARCHAR);  
cs.execute();  
System.out.println(cs.getString(1));  
System.out.println(cs.getString(2));  
//上面兩個結果一樣,因為兩個意思是一樣的  
  
//1個輸入引數,1個輸出引數       
CallableStatement cs=con.prepareCall("{?=call get_pname3(?,?)}");  
//第1個是返回值,第2個是輸入引數,第3個是輸出引數       
cs.registerOutParameter(1, Types.VARCHAR);  
cs.setLong(2, 25);    
cs.registerOutParameter(3, Types.VARCHAR);        
cs.execute();  
System.out.println(cs.getString(1));  
System.out.println(cs.getString(3));  

呼叫儲存過程與呼叫函式的方法一樣,就只是con.prepareCall("{call procedure(?,?)}")沒有?=。