oracle存儲過程調用java
/*這是我的一個調用Oracle procere 的一個class test*/
package com.sp;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.*;
public class Test_fenye {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection ct;
CallableStatement cs;
// TODO Auto-generated method stub
try{
//載入驅動
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//建立連接
ct= DriverManager.getConnection("jdbc:odbc:testsp","scott","tiger");
//創建callablestatement調用存儲過程
cs=ct.prepareCall("{call pro_fenye(?,?,?,?,?,?)}");
//給前三個in輸入 ?賦值,後三個為out返回參數
cs.setString(1, "emp");
cs.setInt(2, 5);
cs.setInt(3, 1);
//注冊
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
//執行
cs.execute();
//取出值
int rowNum=cs.getInt(4);
int pagecount=cs.getInt(5);
ResultSet rs =(ResultSet)cs.getObject(6);
System.out.println("rownumber "+ rowNum);
System.out.println("pagecount "+pagecount);
}catch(Exception ex){
ex.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)})
③ 如何在Oracle中使用Java存儲過程
通常有三種方法來創建java存儲過程。
1. 使用oracle的sql語句來創建:
e.g. 使用create or replace and compile java source named "<name>" as
後邊跟上java源程序。要求類的方法必須是public static的,才能用於存儲過程。
SQL>"javademo1"
as
importjava.sql.*;
publicclassJavaDemo1
{
publicstaticvoidmain(String[]argv)
{
System.out.println("hello,javademo1");
}
}
/
Java已創建。
SQL>showerrorsjavasource"javademo1"
沒有錯誤。
SQL>
as
languagejavaname'JavaDemo1.main(java.lang.String[])';
/
過程已創建。
SQL>setserveroutputon
SQL>calljavademo1();
調用完成。
SQL>calldbms_java.set_output(5000);
調用完成。
SQL>calljavademo1();
hello,javademo1
調用完成。
SQL>calljavademo1();
hello,javademo1
調用完成。
2. 使用外部class文件來裝載創建
e.g. 這里既然用到了外部文件,必然要將class文件放到oracle Server的某一目錄下邊。
publicclassOracleJavaProc
{
publicstaticvoidmain(String[]argv)
{
System.out.println("It'saJavaOracleprocere.");
}
}
SQL>;
授權成功。
SQL>connscott/[email protected]
已連接。
SQL>createorreplacedirectorytest_diras'd:/oracle';
目錄已創建。
SQL>(test_dir,'OracleJavaProc.CLASS')
2/
Java已創建。
SQL>'OracleJavaProc.main(java.lang.String[])';
2/
過程已創建。
SQL>calltestjavaproc();
調用完成。
SQL>executetestjavaproc;
PL/SQL過程已成功完成。
SQL>setserveroutputonsize5000
SQL>calldbms_java.set_output(5000);
調用完成。
SQL>executetestjavaproc;
It'saJavaOracleprocere.
3. 我推薦的一種方法,直接使用loadjava命令遠程裝載並創建。
先創建一個類, e.g.
importjava.sql.*;
importoracle.jdbc.*;
publicclassOracleJavaProc{
//Addasalgradetothedatabase.
publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal){
System.out.println("...");
try{
Connectionconn=
DriverManager.getConnection("jdbc:default:connection:");
Stringsql=
"INSERTINTOsalgrade"+
"(GRADE,LOSAL,HISAL)"+
"VALUES(?,?,?)";
PreparedStatementpstmt=conn.prepareStatement(sql);
pstmt.setInt(1,grade);
pstmt.setInt(2,losal);
pstmt.setInt(3,hisal);
pstmt.executeUpdate();
pstmt.close();
}
catch(SQLExceptione){
System.err.println("ERROR!AddingSalgrade:"
+e.getMessage());
}
}
}
使用loadjava命令將其裝載到伺服器端並編譯:
D:eclipse3.1workspacedbtest>loadjava-uscott/[email protected]
acleJavaProc.java
arguments:'-u''scott/[email protected]'-v''-resolve''OracleJavaProc.java'
creating:sourceOracleJavaProc
loading:sourceOracleJavaProc
resolving:sourceOracleJavaProc
查詢一下狀態:
連接到:
.2.0.1.0-Proction
WiththePartitioning,
JServerRelease9.2.0.1.0-Proction
SQL>SELECTobject_name,object_type,statusFROMuser_objectsWHEREobject_typeLIKE'JAVA%';
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPESTATUS
--------------------------------------------------
OracleJavaProc
JAVACLASSVALID
OracleJavaProc
JAVASOURCEVALID
測試一下存儲過程:
SQL>createorreplaceprocereadd_salgrade(idnumber,losalnumber,hisalnum
ber)aslanguagejavaname'OracleJavaProc.addSalGrade(int,int,int)';
2/
過程已創建。
SQL>setserveroutputonsize2000
SQL>calldbms_java.set_output(2000);
調用完成。
SQL>executeadd_salgrade(6,10000,15000);
...
PL/SQL過程已成功完成。
SQL>select*fromsalgradewheregrade=6;
GRADELOSALHISAL
------------------------------
61000015000
④ 在Oracle中用java編寫存儲過程
Oracle自帶一個JVM 內置對Java的支持 任何Java能做的事情你都可以放到Oracle裡面來做 你甚至可以在裡面操作db 這讓Oracle具備了極其巨大的擴展能力 只要你願意 完全可以開發一個trigger 讓它在適當的時候給管理員的msn發送一條即時消息
由於ps/SQL是過程化的語言 它基本上不具備多態的概念 供Oracle使用的Java方法必須申明為static 所以在Oracle中你無法使用Java的動態特性 比如介面 反射等 不過這並不妨礙你用Java *** 做的事
我們以一個簡單的hello world為例 我想任何一個有經驗的Java程序員都能夠通過這個例子 派生出其他希奇古怪的應用 有好的創意記得要與我共享 我的msn是
首先是創建一個Java類 啟動SQL plus 執行如下命令
create or replace and pile java source named hello_sp as
package bromon oracle;
public class Hello
{
public static String say(String name)
{
return 你好 +name;
}
}
Java程序已創建
然後在Oracle中把這個類導入成為一個函數 執行命令
create or replace function hello_sp(name varchar ) return varchar
as language java name
bromon oracle Hello say(java lang String) return java lang String ;
函數已創建
現在可以調用該函數 執行
select hello( bromon ) from al;
返回結果 你好 bromon
有一個需要注意的問題是 假如我們的java方法是沒有參數的 比如
public static String say()
{
return 你好 ;
}
那麼在創建函數的時候 函數名不應該有擴號 hello_sp 否則會報告函數有編譯錯誤
如果你的Java類是在IDE裡面編寫的 那麼只需要在oracle中載入編譯過的class文件即可 方法是
lishixin/Article/program/Oracle/201311/18111
⑤ 關於oracle存儲過程調用java(在線等)
1、創建或者代替已有的目錄。目錄名為test_dir,路徑為d:\的目錄;
2、使用bfile來創建或者代替目錄test_dir下的TEST.CLASS的java的類文件
3、查詢object_name,object_type,STATUS這三個欄位在 user_objects里的數據
4、用java語言調用名稱為'TEST.main(java.lang.String[])'來創建或者代替已有的存儲過程test_java
其實就是:首先創建一個目錄test_dir,路徑d:\,然後就在目錄名為test_dir下生成test.class(類似於JAVAC這樣)然後就創建test_java存儲過程,把test.class裡面的內容放到到test_java存儲過程裡面
個人理解,如有誤,歡迎指出。
⑥ 如何在Oracle中使用Java存儲過程
給你一個簡單的例子(其實自己搜索:oracle資料庫 java存儲過程 就可以了)
使用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
調用完成。
⑦ JAVA調用ORACLE存儲過程
給你個方法,自己參研吧。
private static final String DELETE_ENTRIES_BY_DATE_RANGE_SPNAME = "";
public int deleteByDateRange(Date start, Date end) {
// get connection
Connection conn = getConnection();
try {
// set auto commit false
conn.setAutoCommit(false);
// retrieve callableStatement by
CallableStatement cs = prepareCallableStatement(conn,
);
cs.setString("application_name", applicationName);
cs.setString("mole_name", moleName);
cs.setDate("startDate", Util.convUtilDateToSqlDate(start));
cs.setDate("endDate", Util.convUtilDateToSqlDate(end));
cs.registerOutParameter("deleted_rows", java.sql.Types.INTEGER);
cs.execute();
int affectedRows = cs.getInt("deleted_rows");
// transaction commit
conn.commit();
// close cs
cs.close();
return affectedRows;
⑧ 如何在ORACLE中使用JAVA存儲過程
比如下面寫的是Oracle的一個存儲過程:
create or replace procere queryempinfo(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2)
as
begin
--得到該員工的姓名 月薪和職位
select ename, sal, job into pename, psal, pjob from emp where empno = eno;
end;
Java調用Oracle的存儲過程
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url, username, password);
stat = conn.prepareCall(sql);
// 一個輸入參數和三個輸出參數
stat.setInt(1, 7566);
stat.registerOutParameter(2, OracleTypes.VARCHAR);
stat.registerOutParameter(3, OracleTypes.NUMBER);
stat.registerOutParameter(4, OracleTypes.VARCHAR);
stat.execute();
String name = stat.getString(2);
int sal = stat.getInt(3);
String job = stat.getString(4);
System.out.println("name: " + name + ", sal: " + sal + ", job: " + job);
} catch (Exception e) {
e.printStackTrace();
} finally {
close(conn, stat, rs);
}
⑨ 在java 怎樣調用oracle存儲過程
java.sql
裡面的
public interface CallableStatement
extends PreparedStatement
用於執行 SQL 存儲過程的介面。JDBC API 提供了一個存儲過程 SQL 轉義語法,該語法允許對所有 RDBMS
使用標准方式調用存儲過程。此轉義語法有一個包含結果參數的形式和一個不包含結果參數的形式。如果使用結果參數,則必須將其注冊為 OUT
參數。其他參數可用於輸入、輸出或同時用於二者。參數是根據編號按順序引用的,第一個參數的編號是 1。
{?= call <procere-name>[(<arg1>,<arg2>, ...)]}
{call <procere-name>[(<arg1>,<arg2>, ...)]}
⑩ 關於ORACLE存儲過程或觸發器調用JAVA類的問題
不知道你具體需求,做了JAVA開發5年從沒這么干過,一般都是java調存儲過程然後把數據拿回來,這么反正調我是沒干過。
你那個存儲過程調JAVA的就這一句么?
create or replace procere javademo1
as
language java name 'JavaDemo1.main(java.lang.String[])';
你這句話前面應該有個創建目錄和指定java class路徑的語句吧,如果都沒錯那就
execute javademo1; 執行這個存儲過程就會看到java類里輸出的那句話了啊。
你要是成功輸出java列印的語句就是調用成功了 ,那你就在那方法體里寫你要調用的Action了唄,那就隨你怎麼幹了想調啥調啥