javaoracle存儲過程
㈠ java怎樣通過jdbc來訪問oracle資料庫的存儲過程和存儲函數
//存儲過程create or replace Procere countBySal(
p_sal emp.sal%type,
p_count OUT number
)as
begin
select count(*) into p_count from emp where sal >= p_sql;
end countBySal; //調用步奏import java.sql.CallableStatement; //帶哦用存儲過程所必須的語句借口
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;public class EmpUtil {
public static int countBySal(double sal) throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@localhost:1521:test";
Connection cn=DriverManager.getConnection(url, "scott", "tiger");
String sql="{call countBySal(?,?)}";//調用存儲過程的語句,call後面的就是存儲過程名和需要傳入的參數
CallableStatement cst=cn.prepareCall(sql);
cst.setDouble(1, sal);//設置in參數的值
cst.registerOutParameter(2, Types.INTEGER);//注冊out參數的類型
cst.execute();
int result = cst.getInt(2);
cst.close();
cn.close();
return result;
}
public static void main(String[] args) {
int count;
try {
count = EmpUtil.countBySal(3000);
System.out.println("工資在3000元以上的人數為:"+count);
} catch (Exception e) {
e.printStackTrace();
}
}
㈡ 如何使用java語言調用oracle存儲過程
1.api上的方法為 Connection.prepareCall(java.lang.String)
2.prepareCall(String sql)
throws SQLException
參數:sql - 可以包含一個或多個 '?' 參數佔位符的 SQL 語句。通常此語句是使用 JDBC 調用轉義語法指定的。
3.JDBC API 提供了一個存儲過程 SQL 轉義語法,該語法允許對所有 RDBMS 使用標准方式調用存儲過程。此轉義語法有一個包含結果參數的形式和一個不包含結果參數的形式。分別為:
{?= call <procere-name>[(<arg1>,<arg2>, ...)]}
{call <procere-name>[(<arg1>,<arg2>, ...)]}
4.示例,無返回值調用:Connection.prepareCall({ call p_test(p1,p2)})
㈢ 怎麼在java代碼中設置oracle存儲過程中的入參和出參
public String insertJCSP(Map parmaters) {
// TODO Auto-generated method stub
String str=null;
Connection conn = null;
CallableStatement csm = null;
conn = (Connection) sqlSession.getSqlSessionFactory().openSession()
.getConnection();
try {
csm = conn
.prepareCall("{Call pr_insert_JcInfo(?,?,?)}"); //調用存儲過程
csm.setString(1, (String) parmaters.get("lottId")); //第一個入參數
csm.setString(2, (String) parmaters.get("idata"));//第二個入參數
csm.registerOutParameter(3, java.sql.Types.VARCHAR);//返回參數
csm.execute();
str = csm.getString(3); //取得返回參數
㈣ JAVA調用存儲過程,Oracle自定義類型作參數怎麼寫法
1. 存儲過程以及類型定義如下:
--The array in oracle
CREATE OR REPLACE TYPE idArray AS TABLE OF VARCHAR2(20);
--package header
CREATE OR REPLACE PACKAGE Lib_Package AS
PROCEDURE Book_Check_Procere(ids IN idArray, exist OUT NUMBER);
END Lib_Package;
--package body
CREATE OR REPLACE PACKAGE BODY Lib_Package AS
PROCEDURE Book_Check_Procere( ids IN idArray, exist OUT NUMBER) AS v_Index BINARY_INTEGER; BEGIN v_Index:= ids.FIRST; LOOP SELECT COUNT(*) INTO exist FROM Lib_Duplicate WHERE status='Lent' AND book_id=ids(v_Index); EXIT WHEN v_Index=ids.LAST OR exist>0; v_Index:= ids.NEXT(v_Index); END LOOP;END Book_Check_Procere;
END Lib_Package;
2.在Java中調用上面的存儲過程
(1) 在Oracle中定義數組類型idArray (2) 在java構造數組並轉換成Oracle中定義的數組類型,調用存儲過程
/** * 當要刪除圖書時,檢查是否仍然有圖書復本處於借出狀態 */ public boolean checkBookStatus(String[] bookIds) throws DataAccessException {
boolean flag = false; Connection conn = null; OracleCallableStatement cstmt = null; ArrayDescriptor desc = null; ARRAY bookIdArray = null; int count = 0; String sql = "{call LIB_PACKAGE.Book_Check_Procere(?,?)}";
DbDriverManager dbManager = DbDriverManager.getInstance(); conn = dbManager.getConnection(Constants.DATABASE);
try { cstmt = (OracleCallableStatement) conn.prepareCall(sql);
//定義oracle中的數組類型 desc = ArrayDescriptor.createDescriptor("IDARRAY", conn); bookIdArray = new ARRAY(desc, conn, bookIds);
cstmt.setObject(1, bookIdArray, oracle.jdbc.OracleTypes.ARRAY); cstmt.registerOutParameter(2, Types.INTEGER); cstmt.execute(); count = cstmt.getInt(2);
log.info(this.getClass() + ".checkBookStatus: count = " + count);
DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); } catch (SQLException e) {
log.error(this.getClass() + ".checkBookStatus-->SQLException: " + e.getMessage()); DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); throw new DataAccessException( "When check the books, there is a SQLException: " + e.getMessage(), e.getCause()); }
if (count > 0) {
flag = true; }
return flag; }
㈤ 如何在Oracle中使用Java存儲過程
方法如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* Load JDBC Driver
* 最基本的方法通過JDBC連接資料庫
* @author Jacob
*
*/
public class LoadByPrimary {
public static void main(String[] args) throws ClassNotFoundException
{
String driver = "oracle.jdbc.OracleDriver";
Connection cn = null;
/**
* Class.forName手動載入一個類到方法區,Driver類中包含自動注冊驅動的靜態代碼塊
* 會自動在DriverManager中注冊驅動
*/
Class.forName(driver);
String url = "jdbc:oracle:thin:@localhost:1521:ORACLE"; //1521代表埠號,默認的
String user = "用戶名";
String pwd = "密碼";
try
{
/*
* Connection是介面,返回值是一個引用對象,是Oracle驅動提供實現類ojdbc7.jar
* 使用JDBC API介面,實際上是驅動實現類
*/
cn = DriverManager.getConnection(url,user,pwd);
Statement stmt = cn.createStatement();
String sql = "SELECT * FROM stu_emp WHERE deptno =10";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
System.out.println(rs.getInt("empno")+" "+
rs.getString("ename")+" "+
rs.getString("job"));
}
rs.close();
stmt.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
if(cn!=null)
{
cn.close();
}
}
catch (SQLException e2)
{
e2.printStackTrace();
}
}
}
}
這是通過preparedstatement實現更新數據,這里我把連接資料庫的方法進行了封裝,每次直接調用了。
public static void main(String[] args)
{
PreparedStatementDemo psd = new PreparedStatementDemo();
psd.updateSalary("JACOB",3000);
psd.selectSalary("JACOB");
}
public void updateSalary(String ename,double sal)
{
String sql = "Update stu_emp set sal= ? Where ename = ?";
Connection cn = null;
PreparedStatement ps = null;
try
{
cn = DBPUtil.getConnection();
ps = cn.prepareStatement(sql);
ps.setDouble(1, sal);
ps.setString(2, ename);
int num = ps.executeUpdate();
System.out.println("提示:總共有 "+num+" 條數據已經更新!");
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
DBUtil.stmtClose(ps);
DBUtil.connClose(cn);
}
}
public void selectSalary(String name)
{
String sql = "Select * From stu_emp Where ename = ?";
Connection cn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try
{
cn = DBPUtil.getConnection();
ps = cn.prepareStatement(sql);
ps.setString(1, name);
rs = ps.executeQuery();
while(rs.next())
{
System.out.println(rs.getString("ename")+" 的工資是: "+ rs.getInt("sal"));
}
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
DBUtil.stmtClose(ps);
DBUtil.rsClose(rs);
DBUtil.connClose(cn);
}
}
}
㈥ Java調用oracle的存儲過程時,只能用問號指定參數么
是的
存儲過程對java來說已經是固化的函數,傳入的參數是按順序扔給存儲過程的,所以也不存在變數名的概念了,自然只有問號就夠了
㈦ 如何在Oracle中使用Java存儲過程
其實,這篇短文,我早就應該寫了。因為,Java存儲過程今後在各大資料庫廠商中越來越流行,功能也越來越強大。這里以Oracle為例,介紹一下java存儲過程的具體用法。
一、如何創建java存儲過程?
通常有三種方法來創建java存儲過程。
1. 使用oracle的sql語句來創建:
e.g. 使用create or replace and compile java source named "<name>" as
後邊跟上java源程序。要求類的方法必須是public static的,才能用於存儲過程。
SQL> create or replace and compile java source named "javademo1"
2 as
3 import java.sql.*;
4 public class JavaDemo1
5 {
6 public static void main(String[] argv)
7 {
8 System.out.println("hello, java demo1");
9 }
10 }
11 /
Java 已創建。
SQL> show errors java source "javademo1"
沒有錯誤。
SQL> create or replace procere javademo1
2 as
3 language java name 'JavaDemo1.main(java.lang.String[])';
4 /
過程已創建。
SQL> set serveroutput on
SQL> call javademo1();
調用完成。
SQL> call dbms_java.set_output(5000);
調用完成。
SQL> call javademo1();
hello, java demo1
調用完成。
SQL> call javademo1();
hello, java demo1
調用完成。
2. 使用外部class文件來裝載創建
e.g. 這里既然用到了外部文件,必然要將class文件放到oracle Server的某一目錄下邊。
public class OracleJavaProc
{
public static void main(String[] argv)
{
System.out.println("It's a Java Oracle procere.");
}
}
SQL> grant create any directory to scott;
授權成功。
SQL> conn scott/[email protected]
已連接。
SQL> create or replace directory test_dir as 'd:/oracle';
目錄已創建。
SQL> create or replace java class using bfile(test_dir, 'OracleJavaProc.CLASS')
2 /
Java 已創建。
SQL> create or replace procere testjavaproc as language java name 'OracleJavaProc.main(java.lang.String[])';
2 /
過程已創建。
SQL> call testjavaproc();
調用完成。
SQL> execute testjavaproc;
PL/SQL 過程已成功完成。
SQL> set serveroutput on size 5000
SQL> call dbms_java.set_output(5000);
調用完成。
SQL> execute testjavaproc;
It's a Java Oracle procere.
3. 我推薦的一種方法,直接使用loadjava命令遠程裝載並創建。
先創建一個類, e.g.
import java.sql.*;
import oracle.jdbc.*;
public class OracleJavaProc {
//Add a salgrade to the database.
public static void addSalGrade(int grade, int losal, int hisal) {
System.out.println("Creating new salgrade for EMPLOYEE...");
try {
Connection conn =
DriverManager.getConnection("jdbc:default:connection:");
String sql =
"INSERT INTO salgrade " +
"(GRADE,LOSAL,HISAL) " +
"VALUES(?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,grade);
pstmt.setInt(2,losal);
pstmt.setInt(3,hisal);
pstmt.executeUpdate();
pstmt.close();
}
catch(SQLException e) {
System.err.println("ERROR! Adding Salgrade: "
+ e.getMessage());
}
}
}
使用loadjava命令將其裝載到伺服器端並編譯:
D:eclipse3.1workspacedbtest>loadjava -u scott/[email protected] -v -resolve Or
acleJavaProc.java
arguments: '-u' 'scott/[email protected] '-v' '-resolve' 'OracleJavaProc.java'
creating : source OracleJavaProc
loading : source OracleJavaProc
resolving: source OracleJavaProc
查詢一下狀態:
連接到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Proction
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Proction
SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE 'JAVA%';
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPE STATUS
------------------------------------ --------------
OracleJavaProc
JAVA CLASS VALID
OracleJavaProc
JAVA SOURCE VALID
測試一下存儲過程:
SQL> create or replace procere add_salgrade(id number, losal number, hisal num
ber) as language java name 'OracleJavaProc.addSalGrade(int, int, int)';
2 /
過程已創建。
SQL> set serveroutput on size 2000
SQL> call dbms_java.set_output(2000);
調用完成。
SQL> execute add_salgrade(6, 10000, 15000);
Creating new salgrade for EMPLOYEE...
PL/SQL 過程已成功完成。
SQL> select * from salgrade where grade=6;
GRADE LOSAL HISAL
---------- ---------- ----------
6 10000 15000
二、如何更新你已經編寫的java存儲過程?
假如要往類OracleJavaProc里添加一個存儲過程方法,如何開發?
正確的步驟應該是先dropjava, 改程序,再loadjava。
e.g.修改OracleJavaProc類內容如下:
import java.sql.*;
import oracle.jdbc.*;
public class OracleJavaProc {
// Add a salgrade to the database.
public static void addSalGrade(int grade, int losal, int hisal) {
System.out.println("Creating new salgrade for EMPLOYEE...");
try {
Connection conn =
DriverManager.getConnection("jdbc:default:connection:");
String sql =
"INSERT INTO salgrade " +
"(GRADE,LOSAL,HISAL) " +
"VALUES(?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,grade);
pstmt.setInt(2,losal);
pstmt.setInt(3,hisal);
pstmt.executeUpdate();
pstmt.close();
}
catch(SQLException e) {
System.err.println("ERROR! Adding Salgrade: "
+ e.getMessage());
}
}
public static int getHiSal(int grade)
{
try {
Connection conn =
DriverManager.getConnection("jdbc:default:connection:");
String sql = "SELECT hisal FROM salgrade WHERE grade = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, grade);
ResultSet rset = pstmt.executeQuery();
int res = 0;
if (rset.next())
{
res = rset.getInt(1);
}
rset.close();
return res;
}
catch (SQLException e)
{
System.err.println("ERROR! Querying Salgrade: "
+ e.getMessage());
return -1;
}
}
}
如何更新呢?
D:eclipse3.1workspacedbtest>dropjava -u scott -v OracleJavaProc
D:/[email protected]>loadjava -u scott -v -resolve Or
acleJavaProc/[email protected]
arguments: '-u' 'scott/[email protected]' '-v' '-resolve' 'OracleJavaProc.java'
creating : source OracleJavaProc
loading : source OracleJavaProc
resolving: source OracleJavaProc
後邊的應用示例:
SQL> create or replace function query_hisal(grade number) return number as langu
age java name 'OracleJavaProc.getHiSal(int) return int';
2 /
函數已創建。
SQL> set serveroutput on size 2000
SQL> call dbms_java.set_output(2000);
調用完成。
SQL> select query_hisal(5) from al;
QUERY_HISAL(5)
--------------
9999
㈧ java調用oracle中定義的包內的存儲過程如何取到包內記錄類型的值
包內定義了存儲過程和記錄 存儲過程實現的是一個查詢並把結果賦給包內的記錄類型變數 在java代碼中調用 包內的存儲過程時 如果得到包內的記錄變數 包定義及包結構定義如下: ---包中定義記錄型變數 兩個函數 一個過程 create or replace package demo_packisdeptrec dept%rowtype; ---聲明一個記錄類型變數 function add_dept(dept_no number,dept_name varchar2,location varchar2) return number; --聲明函數 function remove_dept(dept_no number) return number; procere query_dept(dept_no number);--聲明過程 end demo_pack; ---包的主體部分 create or replace package body demo_packisflag number;---聲明一個私有的變數 function check_dept(dept_no number) return number; ---聲明一個私有的函數 ---私有函數的實現 function check_dept(dept_no number) return numberisbeginselect count(*) into flag from dept where deptno=dept_no; if flag>0 thenflag:=1;end if;return flag; end check_dept; ---公有函數的實現
㈨ JAVA調用ORACLE存儲過程出錯
從報錯看是字元串索引超出范圍,需要看存儲過程的執行結果。
可以在sqlplus中執行exec PKG_I_DFXM.PRC_I_NBBPCF(你的參數)看下結果。
㈩ java調用oracle的delete操作存儲過程
你可以這樣寫試試:conn.prepareCall("{call ZHL_PACKAGE1()}");
即加個括弧
如果有包的話,一定要加包名.存儲過程名。
Java中調用的存儲過程可以不帶參數,也就是說可以沒有括弧,不過我習慣性的都加上。
希望能幫到你。