當前位置:首頁 » 存儲配置 » javaoracle存儲過程返回值

javaoracle存儲過程返回值

發布時間: 2023-04-11 10:36:27

A. oracle 的存儲過程在java怎麼調用

java下實現調用oracle的存儲過程和函數
在oracle下創建一個test的賬戶,然後按一下步驟執行:
1.創建表:STOCK_PRICES

--創建表格
CREATE TABLE STOCK_PRICES(
RIC VARCHAR(6) PRIMARY KEY,
PRICE NUMBER(7,2),
UPDATED DATE );

2.插入測試數據:

--插入數據
INSERT INTO stock_prices values('1111',1.0,SYSDATE);
INSERT INTO stock_prices values('1112',2.0,SYSDATE);
INSERT INTO stock_prices values('1113',3.0,SYSDATE);
INSERT INTO stock_prices values('1114',4.0,SYSDATE);

3.建立一個返回遊標: PKG_PUB_UTILS

--建立一個返回遊標
CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS
--動態游標
TYPE REFCURSOR IS REF CURSOR;
END PKG_PUB_UTILS;

4.創建和存儲過程:P_GET_PRICE

--創建存儲過程
CREATE OR REPLACE PROCEDURE P_GET_PRICE
(
AN_O_RET_CODE OUT NUMBER,
AC_O_RET_MSG OUT VARCHAR2,
CUR_RET OUT PKG_PUB_UTILS.REFCURSOR,
AN_I_PRICE IN NUMBER
)
IS
BEGIN
AN_O_RET_CODE := 0;
AC_O_RET_MSG := '操作成功';

OPEN CUR_RET FOR
SELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE;
EXCEPTION
WHEN OTHERS THEN
AN_O_RET_CODE := -1;
AC_O_RET_MSG := '錯誤代碼:' || sqlCODE || CHR(13) || '錯誤信息:' || SQLERRM;
END P_GET_PRICE;

5.創建函數:

--創建函數:F_GET_PRICE
CREATE OR REPLACE FUNCTION F_GET_PRICE(v_price IN NUMBER)
RETURN PKG_PUB_UTILS.REFCURSOR
AS
stock_cursor PKG_PUB_UTILS.REFCURSOR;
BEGIN
OPEN stock_cursor FOR
SELECT * FROM stock_prices WHERE price < v_price;
RETURN stock_cursor;
END;

6.JAVA調用存儲過程返回結果集
代碼示例:JDBCoracle10G_INVOKEPROCEDURE.java

import java.sql.*;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

/* 本例是通過調用oracle的存儲過程來返回結果集:
* oracle 9i、10G 的jdbc由1個jar包組成:classes12.zip
*/
public class JDBCoracle10G_INVOKEPROCEDURE {
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
CallableStatement stmt = null;

String driver;
String url;
String user;
String pwd;
String sql;
String in_price;

public JDBCoracle10G_INVOKEPROCEDURE()
{
driver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@localhost:1521:ORCL";
// oracle 用戶
user = "test";
// oracle 密碼
pwd = "test";
init();
// mysid:必須為要連接機器的sid名稱,否則會包以下錯:
// java.sql.SQLException: Io 異常: Connection
// refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
// 參考連接方式:
// Class.forName( "oracle.jdbc.driver.OracleDriver" );
// cn = DriverManager.getConnection(
// "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );

}

public void init() {
System.out.println("oracle jdbc test");
try {
Class.forName(driver);
System.out.println("driver is ok");
conn = DriverManager.getConnection(url, user, pwd);
System.out.println("conection is ok");
statement = conn.createStatement();
// conn.setAutoCommit(false);
// 輸入參數
in_price = "3.0";
// 調用函數
stmt = conn.prepareCall("call P_GET_PRICE(?,?,?,?)");
stmt.registerOutParameter(1, java.sql.Types.FLOAT);
stmt.registerOutParameter(2, java.sql.Types.CHAR);
stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);
stmt.setString(4, in_price);
stmt.executeUpdate();
int retCode = stmt.getInt(1);
String retMsg = stmt.getString(2);
if (retCode == -1) { // 如果出錯時,返回錯誤信息
System.out.println("報錯!");
} else {
// 取的結果集的方式一:
rs = ((OracleCallableStatement) stmt).getCursor(3);
// 取的結果集的方式二:
// rs = (ResultSet) stmt.getObject(3);
String ric;
String price;
String updated;
// 對結果進行輸出
while (rs.next()) {
ric = rs.getString(1);
price = rs.getString(2);
updated = rs.getString(3);
System.out.println("ric:" + ric + ";-- price:" + price
+ "; --" + updated + "; ");
}
}

} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("close ");
}
}

public static void main(String args[])// 自己替換[]
{
new JDBCoracle10G_INVOKEPROCEDURE();
}
}

7.開發JAVA調用函數返回結果集
代碼示例:JDBCoracle10G_INVOKEFUNCTION.java

import java.sql.*;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

/*
/* 本例是通過調用oracle的函數來返回結果集:
* oracle 9i、10G 的jdbc由1個jar包組成:classes12.zip
*/
public class JDBCoracle10G_INVOKEFUNCTION {
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
CallableStatement stmt = null;

String driver;
String url;
String user;
String pwd;
String sql;
String in_price;

public JDBCoracle10G_INVOKEFUNCTION()
{
driver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@localhost:1521:ORCL";
// oracle 用戶
user = "test";
// oracle 密碼
pwd = "test";
init();
// mysid:必須為要連接機器的sid名稱,否則會包以下錯:
// java.sql.SQLException: Io 異常: Connection
// refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
// 參考連接方式:
// Class.forName( "oracle.jdbc.driver.OracleDriver" );
// cn = DriverManager.getConnection(
// "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );
}

public void init() {
System.out.println("oracle jdbc test");
try {
Class.forName(driver);
System.out.println("driver is ok");
conn = DriverManager.getConnection(url, user, pwd);
System.out.println("conection is ok");
statement = conn.createStatement();
// conn.setAutoCommit(false);
// 輸入參數
in_price = "5.0";
// 調用函數
stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");
// stmt.registerOutParameter(1, java.sql.Types.FLOAT);
// stmt.registerOutParameter(2, java.sql.Types.CHAR);
stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
stmt.setString(2, in_price);
stmt.executeUpdate();
// 取的結果集的方式一:
rs = ((OracleCallableStatement) stmt).getCursor(1);
// 取的結果集的方式二:
// rs = (ResultSet) stmt.getObject(1);
String ric;
String price;
String updated;

while (rs.next()) {
ric = rs.getString(1);
price = rs.getString(2);
updated = rs.getString(3);
System.out.println("ric:" + ric + ";-- price:" + price + "; --"
+ updated + "; ");
}

} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("close ");
}
}

public static void main(String args[])// 自己替換[]
{
new JDBCoracle10G_INVOKEFUNCTION();
}
}

B. Java連接Oracle調用存儲過程提示實際返回的行數超出請求的行數異常,怎麼解決

package com.yc.ycportal.ge.util;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;import com.mysql.jdbc.ResultSet;public class TestOracle { private Connection conn=null;
private CallableStatement call=null;
private ResultSet rs=null; public TestOracle() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
setConn();
}
catch (ClassNotFoundException ex) {
}
} public void setConn(){
String url="jdbc:oracle:thin:@localhost:1521:hy";
try {
conn = DriverManager.getConnection(url, "system", "manager");
System.out.println("conn ok");
}
catch (SQLException ex) {
}
} public void closeConn(){
if(conn!=null){
try {
conn.close();
System.out.println("conn close");
}
catch (SQLException ex) {
}
}
} //調用單獨的具有輸出參數的過程
public void testShuchu(int salary ){
//實例化cal
try {
//cal = conn.prepareCall("{call hr.shuchu(?,?)}");
call=conn.prepareCall("begin hr.shuchu(?,?); end;");
call.setInt(1,salary);
//注冊輸出參數
//cal.registerOutParameter(2,java.sql.Types.VARCHAR);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
call.execute();
//獲得輸出參數
// String str=cal.getString(2);
String str=(String)call.getObject(2);
System.out.println(str);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 調用函數
public void testHanshu(int num1,int num2){
try {
call = conn.prepareCall("begin ?:=hr.mypack.myfunc(?,?); end;");
call.setInt(2,num1);
call.setInt(3,num2);
call.registerOutParameter(1,oracle.jdbc.OracleTypes.NUMBER);
call.execute();
int num = call.getInt(1);
System.out.println(num);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 調用游標
public void testRs(int salary){
try {
call = conn.prepareCall("begin hr.mypack.shuchu(?,?); end;");
call.setInt(1,salary);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
call.execute();
rs=(ResultSet)call.getObject(2); if(rs!=null){
while (rs.next()) {
System.out.println(rs.getString(2));
}
}
else{
System.out.println("查無結果");
}
}
catch (SQLException ex) {
}
finally{
try {
rs.close();
call.close();
}
catch (SQLException ex1) {
} }
}
public static void main(String[] args) {
TestOracle dbUtil1 = new TestOracle();
dbUtil1.testRs(420);
}}package com.yc.ycportal.ge.util;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;import com.mysql.jdbc.ResultSet;public class TestOracle { private Connection conn=null;
private CallableStatement call=null;
private ResultSet rs=null; public TestOracle() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
setConn();
}
catch (ClassNotFoundException ex) {
}
} public void setConn(){
String url="jdbc:oracle:thin:@localhost:1521:hy";
try {
conn = DriverManager.getConnection(url, "system", "manager");
System.out.println("conn ok");
}
catch (SQLException ex) {
}
} public void closeConn(){
if(conn!=null){
try {
conn.close();
System.out.println("conn close");
}
catch (SQLException ex) {
}
}
} //調用單獨的具有輸出參數的過程
public void testShuchu(int salary ){
//實例化cal
try {
//cal = conn.prepareCall("{call hr.shuchu(?,?)}");
call=conn.prepareCall("begin hr.shuchu(?,?); end;");
call.setInt(1,salary);
//注冊輸出參數
//cal.registerOutParameter(2,java.sql.Types.VARCHAR);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
call.execute();
//獲得輸出參數
// String str=cal.getString(2);
String str=(String)call.getObject(2);
System.out.println(str);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 調用函數
public void testHanshu(int num1,int num2){
try {
call = conn.prepareCall("begin ?:=hr.mypack.myfunc(?,?); end;");
call.setInt(2,num1);
call.setInt(3,num2);
call.registerOutParameter(1,oracle.jdbc.OracleTypes.NUMBER);
call.execute();
int num = call.getInt(1);
System.out.println(num);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 調用游標
public void testRs(int salary){
try {
call = conn.prepareCall("begin hr.mypack.shuchu(?,?); end;");
call.setInt(1,salary);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
call.execute();
rs=(ResultSet)call.getObject(2); if(rs!=null){
while (rs.next()) {
System.out.println(rs.getString(2));
}
}
else{
System.out.println("查無結果");
}
}
catch (SQLException ex) {
}
finally{
try {
rs.close();
call.close();
}
catch (SQLException ex1) {
} }
}
public static void main(String[] args) {
TestOracle dbUtil1 = new TestOracle();
dbUtil1.testRs(420);
}}

C. java調用oracle存儲過程無法獲得正確的返回值,每次都是0

你通過JDBC這種方式調用存儲過程,應該使用 CallableStatement 類, CallableStatement cs=conn.prepareCall(str);

補充一句,避免你在執行有錯,
cs.excuse();這個方法為執行,然後在獲取輸出參數。另外寫輸出參數的類型時,直Types.類型即可,不用帶包。

D. Oracle存儲過程怎麼返回結果

這個存儲過程你可以在TEST的環境下查看結果,不過你需要隱式游標來進行操作,那樣才能看到,具體步驟如下:
1、首先我們要藉助游標,因此需要先定義一個返回類型的游標
create or replace package type_difinition
as
type mycursor is ref cursor;
end type_difinition;
2、改寫你的存儲過程,要想查看執行SQL後結果需要一個返回參數,這個參數即上面定義的游標
類型
create or replace procere select_pro(
p_result out type_difinition.mycursor -- 返回結果
)
is
syn_sql varchar2(200) default '';
begin
syn_sql := 'select * from emp';
-- 此處打開游標,並把需執行的SQL賦值給游標
open p_result for syn_sql;
end select_pro;
3、執行編譯通過後,右鍵點擊存儲過程的名字,跳出框,選擇Test一項,進入Test界面
4、點擊編譯、再點擊執行
5、Test界面的底部界面,有個Variable Type value的列表,此時你可以點擊Value值裡面的
... 按鈕,即可查看結果,由於不怎麼會應用這個編輯器,本想把圖片上傳給你,如有不解,再詳問,希望回答對樓主有幫助

E. Java JDBC里如何取得Oracle存儲過程返回的動態結果集

  1. 創建存儲過程

    createorreplaceprocereproc3(stidinstudent.stuid%type,stnameoutstudent.sname%type,stphoneoutstudent.phonenumber%type,stuaddoutstudent.saddress%type)
    ascountnumbernumber;
    begin
    selectcount(*)=stid;
    ifcountnumber=1then
    =stid;
    =stid;
    =stid;
    else
    dbms_output.put_line('返回值過多');
    endif;
    end;


  2. 調用存儲過程時,要用CallabelStatement的prepareCall 方法。結構:{call 存儲過程名(?,?,...)}

    在設置參數的時候,輸入參數用set,輸出參數要registerOutParameter。取出輸出參數的值可以直接用CallabelStatement的get方法



    importjava.sql.CallableStatement;
    importjava.sql.Connection;
    importjava.sql.DriverManager;
    importjava.sql.ResultSet;
    importjava.sql.SQLException;
    importjava.sql.Types;

    publicclassDao{

    Stringdriver="oracle.jdbc.driver.OracleDriver";
    Stringurl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    Connectionconn=null;
    CallableStatementcs=null;//PreparedStatement,Statement
    ResultSetrs;


    publicvoidgetConn(){
    try{
    Class.forName(driver);
    conn=DriverManager.getConnection(url,"scott","tiger");
    }catch(ClassNotFoundExceptione){
    e.printStackTrace();
    }catch(SQLExceptione){
    e.printStackTrace();
    }

    }
    publicvoidcallProc(){
    try{
    cs=conn.prepareCall("{callproc3(?,?,?,?)}");
    cs.setInt(1,1);
    cs.registerOutParameter(2,Types.VARCHAR);
    cs.registerOutParameter(3,Types.VARCHAR);
    cs.registerOutParameter(4,Types.VARCHAR);
    cs.execute();
    Stringname=cs.getString(2);
    Stringphone=cs.getString(3);
    Stringaddress=cs.getString(4);
    System.out.println("Name:"+name+" Phone:"+phone+" Address:"+address);
    }catch(SQLExceptione){
    e.printStackTrace();
    }finally{
    try{
    if(cs!=null)cs.close();
    if(conn!=null)conn.close();
    }catch(SQLExceptione){
    e.printStackTrace();
    }
    }
    }
    publicstaticvoidmain(String[]args){
    Dao=newDao();
    .getConn();
    .callProc();
    }
    }

F. Oracle中存儲過程返回自定義的集合類型,Java中使用mybatis返回List集合類型

存儲過程我不太熟,給你一個調用儲存過程mybatis的實例參考:

<mappernamespace="entity.puserMapper">	
<!--調用存儲過程-->
<selectid="getCount"parameterMap="getUserCountMap"statementType="CALLABLE">
CALLmyts.ges_user_count(?,?)
</select>
<parameterMaptype="java.util.Map"id="getUserCountMap">
<parameterproperty="sexid"mode="IN"jdbcType="INTEGER"/>
<parameterproperty="usercount"mode="OUT"jdbcType="INTEGER"/>
</parameterMap>
</mapper>

主要是定義好parameterMap就行了

熱點內容
恐怖月亮伺服器ip 發布:2025-05-16 16:18:42 瀏覽:721
java核心技術1 發布:2025-05-16 16:18:01 瀏覽:727
安卓汽車盲區輔助哪裡下載 發布:2025-05-16 16:02:53 瀏覽:361
碼尚編程 發布:2025-05-16 15:55:39 瀏覽:445
android全局字體 發布:2025-05-16 15:53:19 瀏覽:573
jsp在伺服器編譯先轉譯成什麼 發布:2025-05-16 15:41:36 瀏覽:981
svn伺服器編譯 發布:2025-05-16 15:41:26 瀏覽:965
照片被塗鴉擦掉如何看到信息安卓 發布:2025-05-16 15:36:43 瀏覽:179
手機怎麼配置內存大 發布:2025-05-16 15:18:06 瀏覽:166
xpshop源碼 發布:2025-05-16 15:17:25 瀏覽:404