日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

用java调用oracle存储过程总结二

發(fā)布時(shí)間:2025/7/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用java调用oracle存储过程总结二 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

這段時(shí)間開(kāi)始學(xué)習(xí)寫(xiě)存儲(chǔ)過(guò)程,主要原因還是因?yàn)楣ぷ餍枰?#xff0c;本來(lái)以為很簡(jiǎn)單的,但幾經(jīng)挫折,豪氣消磨殆盡,但總算搞通了,為了避免后來(lái)者少走彎路,特記述與此,同時(shí)亦對(duì)自己進(jìn)行鼓勵(lì)。

一:無(wú)返回值的存儲(chǔ)過(guò)程

存儲(chǔ)過(guò)程為:

CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)? AS

BEGIN

?? INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);

END TESTA;

然后呢,在java里調(diào)用時(shí)就用下面的代碼:

package com.hyq.src;

?

import java.sql.*;

import java.sql.ResultSet;

?

public class TestProcedureOne {

? public TestProcedureOne() {

? }

? public static void main(String[] args ){

??? String driver = "oracle.jdbc.driver.OracleDriver";

??? String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";

??? Statement stmt = null;

??? ResultSet rs = null;

??? Connection conn = null;

??? CallableStatement cstmt = null;

?

??? try {

????? Class.forName(driver);

????? conn =? DriverManager.getConnection(strUrl, " hyq ", " hyq ");

????? CallableStatement proc = null;

????? proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");

????? proc.setString(1, "100");

????? proc.setString(2, "TestOne");

????? proc.execute();

??? }

??? catch (SQLException ex2) {

????? ex2.printStackTrace();

??? }

??? catch (Exception ex2) {

????? ex2.printStackTrace();

??? }

??? finally{

????? try {

??????? if(rs != null){

????????? rs.close();

????????? if(stmt!=null){

??????????? stmt.close();

????????? }

????????? if(conn!=null){

??????????? conn.close();

????????? }

??????? }

????? }

????? catch (SQLException ex1) {

????? }

??? }

? }

}

當(dāng)然了,這就先要求要建張表TESTTB,里面兩個(gè)字段(I_IDI_NAME)。

二:有返回值的存儲(chǔ)過(guò)程(非列表)

存儲(chǔ)過(guò)程為:

CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)? AS

BEGIN

?? SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;

END TESTB;

java里調(diào)用時(shí)就用下面的代碼:

package com.hyq.src;

?

public class TestProcedureTWO {

? public TestProcedureTWO() {

? }

? public static void main(String[] args ){

??? String driver = "oracle.jdbc.driver.OracleDriver";

??? String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";

??? Statement stmt = null;

??? ResultSet rs = null;

??? Connection conn = null;

??? try {

????? Class.forName(driver);

????? conn =? DriverManager.getConnection(strUrl, " hyq ", " hyq ");

????? CallableStatement proc = null;

????? proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");

????? proc.setString(1, "100");

????? proc.registerOutParameter(2, Types.VARCHAR);

????? proc.execute();

????? String testPrint = proc.getString(2);

????? System.out.println("=testPrint=is="+testPrint);

??? }

??? catch (SQLException ex2) {

????? ex2.printStackTrace();

??? }

??? catch (Exception ex2) {

????? ex2.printStackTrace();

??? }

??? finally{

????? try {

??????? if(rs != null){

????????? rs.close();

????????? if(stmt!=null){

??????????? stmt.close();

????????? }

????????? if(conn!=null){

??????????? conn.close();

????????? }

??????? }

????? }

????? catch (SQLException ex1) {

????? }

??? }

? }

}

?

}

注意,這里的proc.getString(2)中的數(shù)值2并非任意的,而是和存儲(chǔ)過(guò)程中的out列對(duì)應(yīng)的,如果out是在第一個(gè)位置,那就是proc.getString(1),如果是第三個(gè)位置,就是proc.getString(3),當(dāng)然也可以同時(shí)有多個(gè)返回值,那就是再多加幾個(gè)out參數(shù)了。

三:返回列表

由于oracle存儲(chǔ)過(guò)程沒(méi)有返回值,它的所有返回值都是通過(guò)out參數(shù)來(lái)替代的,列表同樣也不例外,但由于是集合,所以不能用一般的參數(shù),必須要用pagkage.所以要分兩部分,

1,? 建一個(gè)程序包。如下:

CREATE OR REPLACE PACKAGE TESTPACKAGE ?AS

?TYPE Test_CURSOR IS REF CURSOR;

end TESTPACKAGE;

2,建立存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程為:

CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS

BEGIN

??? OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;

END TESTC;

可以看到,它是把游標(biāo)(可以理解為一個(gè)指針),作為一個(gè)out 參數(shù)來(lái)返回值的。

java里調(diào)用時(shí)就用下面的代碼:

package com.hyq.src;

import java.sql.*;

import java.io.OutputStream;

import java.io.Writer;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import oracle.jdbc.driver.*;

?

?

public class TestProcedureTHREE {

? public TestProcedureTHREE() {

? }

? public static void main(String[] args ){

??? String driver = "oracle.jdbc.driver.OracleDriver";

??? String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";

??? Statement stmt = null;

??? ResultSet rs = null;

??? Connection conn = null;

?

??? try {

????? Class.forName(driver);

????? conn =? DriverManager.getConnection(strUrl, "hyq", "hyq");

?

????? CallableStatement proc = null;

????? proc = conn.prepareCall("{ call hyq.testc(?) }");

????? proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);

????? proc.execute();

????? rs = (ResultSet)proc.getObject(1);

?

????? while(rs.next())

????? {

????????? System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");

????? }

??? }

??? catch (SQLException ex2) {

????? ex2.printStackTrace();

??? }

??? catch (Exception ex2) {

????? ex2.printStackTrace();

??? }

??? finally{

????? try {

??????? if(rs != null){

????????? rs.close();

????????? if(stmt!=null){

??????????? stmt.close();

????????? }

????????? if(conn!=null){

??????????? conn.close();

????????? }

??????? }

????? }

????? catch (SQLException ex1) {

????? }

??? }

? }

}

在這里要注意,在執(zhí)行前一定要先把oracle的驅(qū)動(dòng)包放到class路徑里,否則會(huì)報(bào)錯(cuò)的。

總結(jié)

以上是生活随笔為你收集整理的用java调用oracle存储过程总结二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。