您的位置:首页 > 数据库 > Oracle

java下实现调用oracle的存储过程和函数

2014-12-05 19:44 941 查看
在oracle下创建一个test的账户,然后

1.创建表:STOCK_PRICES

[cpp]
view plaincopyprint?

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

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


2.插入测试数据:

[sql]
view plaincopyprint?

--插入数据
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);

--插入数据
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

[cpp]
view plaincopyprint?

--建立一个返回游标
CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS
--动态游标
TYPE REFCURSOR IS REF CURSOR;
END PKG_PUB_UTILS;

--建立一个返回游标
CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS
    --动态游标
    TYPE REFCURSOR IS REF CURSOR;
END PKG_PUB_UTILS;

4.创建和存储过程:P_GET_PRICE

[sql]
view plaincopyprint?

--创建存储过程
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;

--创建存储过程
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.创建函数:

[cpp]
view plaincopyprint?

--创建函数: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;

--创建函数: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.J***A调用存储过程返回结果集

JDBCoracle10G_INVOKEPROCEDURE.java

[java]
view plaincopyprint?

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();

}
}

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.开发J***A调用函数返回结果集

JDBCoracle10G_INVOKEFUNCTION.java

[java]
view plaincopyprint?

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();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: