導航:首頁 > 使用方法 > oraclejava函數的使用方法

oraclejava函數的使用方法

發布時間:2022-09-26 23:50:54

Ⅰ java調用oracle函數

CREATE OR REPLACE FUNCTION COPY_PAPER (input_paper_id in number)

RETURN INTEGER -- return value type (0: error,1:)

IS
_paper_name VARCHAR(512);
_paper_id NUMBER(7) := 0;

BEGIN

BEGIN

SELECT PAPER_NAME INTO _paper_name
FROM test_paper
WHERE paper_id = input_paper_id;

select seq_paper.nextval into _paper_id from al;

INSERT INTO test_paper (paper_id, paper_name) values (_paper_id, _paper_name);

EXCEPTION
WHEN OTHERS THEN

ROLLBACK;

RETURN(0);

END;

DECLARE CURSOR _question_cur IS
SELECT content
FROM question
WHERE PAPER_ID = input_paper_id;

BEGIN

FOR RC_RECORD IN _question_cur LOOP

IF RC_RECORD.content IS NULL THEN

BEGIN

ROLLBACK;

RETURN(1);

END;

ELSE

INSERT INTO question (q_id, paper_id, content) VALUES (seq_question.nextval, _paper_id , RC_RECORD.content);

END IF;

END LOOP;

commit;
return(1);

EXCEPTION
WHEN OTHERS THEN

ROLLBACK;

RETURN(0);

END;

EXCEPTION
WHEN OTHERS THEN

ROLLBACK;

RETURN(0);

END;

Ⅱ java怎麼調用oracle的過程

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

Ⅲ Oracle中怎樣使用JAVA函數及自定義函數

cs=conn.prepareCall("{?=callgoode(?,?)}");
//
cs.registerOutParameter(1,Types.NUMERIC);

//SetthevaluefortheINparameter
cs.setString(2,"lz");
cs.setString(3,"lz");

//
cs.execute();
intretValue=cs.getInt(1);

Ⅳ java中怎麼使用oracle的序列,過程和函數

JAVA中使用oracle序列

直接使用
String sql="insert into wf_hxinxi (oid,zsnumber,sortinfo,address,dateinfo)values(SEQ_SYSTEMADD.Nextval,'"+hxinxiVO.getZsnumber()+"','"+hxinxiVO.getSortinfo()+"','"+hw+"','"+hxinxiVO.getDateinfo()+"')";

使用存儲過程就更多,看你的傳入,和傳出情況,

一:無返回值的存儲過程
存儲過程為:
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里調用時就用下面的代碼:
package com.hyq.src;

import java.sql.*;
import java.sql.ResultSet;

public class TestProcereOne {
public TestProcereOne() {
}
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) {
}
}
}
}
當然了,這就先要求要建張表TESTTB,裡面兩個欄位(I_ID,I_NAME)。
二:有返回值的存儲過程(非列表)
存儲過程為:
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里調用時就用下面的代碼:
package com.hyq.src;

public class TestProcereTWO {
public TestProcereTWO() {
}
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)中的數值2並非任意的,而是和存儲過程中的out列對應的,如果out是在第一個位置,那就是proc.getString(1),如果是第三個位置,就是proc.getString(3),當然也可以同時有多個返回值,那就是再多加幾個out參數了。
三:返回列表
由於oracle存儲過程沒有返回值,它的所有返回值都是通過out參數來替代的,列表同樣也不例外,但由於是集合,所以不能用一般的參數,必須要用pagkage了.所以要分兩部分,
1, 建一個程序包。如下:
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
end TESTPACKAGE;
2,建立存儲過程,存儲過程為:
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS
BEGIN
OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
END TESTC;
可以看到,它是把游標(可以理解為一個指針),作為一個out 參數來返回值的。
在java里調用時就用下面的代碼:
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 TestProcereTHREE {
public TestProcereTHREE() {
}
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) {
}
}
]
]

函數更是簡單,具體的別人已經給更詳細的說明,參考這個
http://..com/question/1567623.html?si=8

如何在Oracle中使用Java方法 詳細�0�3

java 存儲過程今後在各大資料庫廠商中越來越流行,功能也越來越強大。這里以 Oracle 為例,介紹一下java 存儲過程的具體用法。 一、如何創建java 存儲過程? 通常有三種方法來創建java 存儲過程。 1. 使用oracle 的sql 語句來創建: e.g. 使用create or replace and compile java source named "" 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[] args) 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 size 5000 SQL> call dbms_java.set_output(5000); --java 語言向控制台輸出 SQL> execute javademo1(); --execute 存儲過程名稱 hello, java demo1 調用完成。 2. 使用外部class 文件來裝載創建 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 已連接。 SQL> create or replace directory test_dir as 'd:/oracle'; 目錄已創建。 using -- 使用 bfile---外部文件 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 -v -resolve Or acleJavaProc.java arguments: '-u' '-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(?,?,?

Ⅵ 在oracle中怎樣聲明這個java類中的函數

環境:windows2000 + oracle9.2
1、loadjava
2、直接在Oracle中使用Java源,Oracle內置JVM,對java支持很好
(1). 建立 java source
create or replace and compile java source named js_output_test as
public class js_test
{
public static String js_desc()
{
return "this is java source test.";
}
}

(2). 發布java source
CREATE OR REPLACE FUNCTION fn_test_js RETURN VARCHAR2
AS LANGUAGE JAVA NAME 'js_test.js_desc() return java.lang.String';

(3). 測試.
SQL> set serveroutput on;
SQL> var v_test varchar2(25);
SQL> call fn_test_js() into :v_test;
調用完成。
SQL> print v_test;
V_TEST
--------------------------------
this is java source test.
注意:發布時參數中的java.lang.String一定要寫全,返回類型可以用number代替int
====================================================================
create or replace and compile java source named hello as
public class Hello {
static public String Message(String yname) {
return "Hello, " + yname;
}
}
create or replace function hello (Name VARCHAR2) return VARCHAR2
as language java name
'Hello.Message (java.lang.String) return java.lang.String';

Select hello('every body!') From al;
====================================================================
create or replace and compile java source named sea as
public class Sea{
public static String myReplaceAll(String src,String name1,String name2) {
int a=0; int n=name1.length(); int l=src.indexOf(name1,a);
while(l>0){
src = src.substring(0,l) + src.substring(l+n);
a=a+n;
l=src.indexOf(name1,a);
}
return src;
}

public static String getSameCompany(String name11,String name22){
if(name11==null || name22==null){
return "false";
}
String s1=myReplaceAll(name11,"公司",""); String s2=myReplaceAll(name22,"公司","");
s1=myReplaceAll(s1,"有限",""); s2=myReplaceAll(s2,"有限","");
s1=myReplaceAll(s1,"責任",""); s2=myReplaceAll(s2,"責任","");
s1=myReplaceAll(s1,"市",""); s2=myReplaceAll(s2,"市","");
s1=myReplaceAll(s1,"股份",""); s2=myReplaceAll(s2,"股份","");

if(s1.indexOf(s2)>=0 || s2.indexOf(s1)>=0){
return "true";
}else{
return "false";
}
}
}
CREATE OR REPLACE Function same (name1 Varchar2, name2 Varchar2) Return Varchar2
As Language Java Name
'Sea.getSameCompany(java.lang.String,java.lang.String) return java.lang.String';

====================================================================
CREATE OR REPLACE Function SAME_COMPANY_NAME(Name1 In Varchar2, Name2 In Varchar2) Return Integer Is
Nam1 Varchar2(255); Nam2 Varchar2(255);
Begin
Nam1 := Replace(Name1, '公司', ''); Nam2 := Replace(Name2, '公司', '');
Nam1 := Replace(Nam1, '有限', ''); Nam2 := Replace(Nam2, '有限', '');
Nam1 := Replace(Nam1, '責任', ''); Nam2 := Replace(Nam2, '責任', '');
Nam1 := Replace(Nam1, '市', ''); Nam2 := Replace(Nam2, '市', '');
Nam1 := Replace(Nam1, '股份', ''); Nam2 := Replace(Nam2, '股份', '');
If (Instr(Nam1, Nam2) > 0 Or Instr(Nam2, Nam1) > 0) Then Return 0; Else Return 1; End If;
End SAME_COMPANY_NAME;
====================================================================

Ⅶ 高手速來幫忙!!oracle調用Java函數的問題!!

JAVA中Resultset是一個類 而不是一個方法。記住啊。結果集(ResultSet)是數據中查詢結果返回的一種對象,可以說結果集是一個存儲查詢結果的對象,但是結果集並不僅僅具有存儲的功能,他同時還具有操縱數據的功能,可能完成對數據的更新等。結果集讀取數據的方法主要是getXXX(),它的參數可以是整型,表示第幾列(是從1開始的),還可以是列名。返回的是對應的XXX類型的值。如果對應那列時空值,XXX是對象的話返回XXX型的空值,如果XXX是數字類型,如Float等則返回0,boolean返回false。使用getString()可以返回所有的列的值,不過返回的都是字元串類型的。XXX可以代表的類型有:基本的數據類型如整型(int),布爾型(Boolean),浮點型(Float,Double)等,比特型(byte),還包括一些特殊的類型,如:日期類型(java.sql.Date),時間類型(java.sql.Time),時間戳類型(java.sql.Timestamp),大數型(BigDecimal和BigInteger等)等。還可以使用getArray(int colindex/String columnname),通過這個方法獲得當前行中,colindex所在列的元素組成的對象的數組。使用getAsciiStream(int colindex/String colname)可以獲得該列對應的當前行的ascii流。也就是說所有的getXXX方法都是對當前行進行操作。結果集從其使用的特點上可以分為四類,這四類的結果集的所具備的特點都是和Statement語句的創建有關,因為結果集是通過Statement語句執行後產生的,所以可以說,結果集具備何種特點,完全決定於Statement,當然我是說下面要將的四個特點,在Statement創建時包括三種類型。首先是無參數類型的,他對應的就是下面要介紹的基本的ResultSet對應的Statement。下面的代碼中用到的Connection並沒有對其初始化,變數conn代表的就是Connection對應的對象。SqlStr代表的是響應的SQL語句。1、 最基本的ResultSet。之所以說是最基本的ResultSet是因為,這個ResultSet他起到的作用就是完成了查詢結果的存儲功能,而且只能讀去一次,不能夠來回的滾動讀取。這種結果集的創建方式如下: Statement st = conn.CreateStatementResultSet rs = Statement.excuteQuery(sqlStr);由於這種結果集不支持,滾動的讀去功能所以,如果獲得這樣一個結果集,只能使用它裡面的next()方法,逐個的讀去數據。 2 可滾動的ResultSet類型。這個類型支持前後滾動取得紀錄next()、previous(),回到第一行first(),同時還支持要去的ResultSet中的第幾行absolute(int n),以及移動到相對當前行的第幾行relative(int n),要實現這樣的ResultSet在創建Statement時用如下的方法。Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)ResultSet rs = st.executeQuery(sqlStr)其中兩個參數的意義是:resultSetType是設置ResultSet對象的類型可滾動,或者是不可滾動。取值如下: ResultSet.TYPE_FORWARD_ONLY只能向前滾動 ResultSet.TYPE_SCROLL_INSENSITIVE和Result.TYPE_SCROLL_SENSITIVE這兩個方法都能夠實現任意的前後滾動,使用各種移動的ResultSet指針的方法。二者的區別在於前者對於修改不敏感,而後者對於修改敏感。resultSetConcurency是設置ResultSet對象能夠修改的,取值如下: ResultSet.CONCUR_READ_ONLY 設置為只讀類型的參數。 ResultSet.CONCUR_UPDATABLE 設置為可修改類型的參數。所以如果只是想要可以滾動的類型的Result只要把Statement如下賦值就行了。Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE, ResultSet.CONCUR_READ_ONLY);ResultSet rs = st.excuteQuery(sqlStr);用這個Statement執行的查詢語句得到的就是可滾動的ResultSet。3、 可更新的ResultSet這樣的ResultSet對象可以完成對資料庫中表的修改,但是我知道ResultSet只是相當於資料庫中表的視圖,所以並不時所有的ResultSet只要設置了可更新就能夠完成更新的,能夠完成更新的ResultSet的SQL語句必須要具備如下的屬性: a、只引用了單個表。 b、不含有join或者group by子句。 c、那些列中要包含主關鍵字。 具有上述條件的,可更新的ResultSet可以完成對數據的修改,可更新的結果集的創建方法是:Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE)4、 可保持的ResultSet正常情況下如果使用Statement執行完一個查詢,又去執行另一個查詢時這時候第一個查詢的結果集就會被關閉,也就是說,所有的Statement的查詢對應的結果集是一個,如果調用Connection的commit()方法也會關閉結果集。可保持性就是指當ResultSet的結果被提交時,是被關閉還是不被關閉。JDBC2.0和1.0提供的都是提交後ResultSet就會被關閉。不過在JDBC3.0中,我們可以設置ResultSet是否關閉。要完成這樣的ResultSet的對象的創建,要使用的Statement的創建要具有三個參數,這個Statement的創建方式也就是,我所說的Statement的第三種創建方式。如下:Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)ResultSet rs = st.excuteQuery(sqlStr);前兩個參數和兩個參數的createStatement方法中的參數是完全相同的,這里只介紹第三個參數: resultSetHoldability表示在結果集提交後結果集是否打開,取值有兩個: ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交時,不關閉資料庫。 ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交時ResultSet關閉。

Ⅷ java怎麼調用oracle的過程

參考下面代碼
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();
}
}

閱讀全文

與oraclejava函數的使用方法相關的資料

熱點內容
貨車發動機左右搖晃解決方法 瀏覽:319
電燈帶插座安裝方法 瀏覽:608
史上最全分析問題的7種方法 瀏覽:9
小林發燒貼使用方法 瀏覽:764
轉呼啦圈正確方法 瀏覽:320
平時調節情緒的方法有哪些 瀏覽:378
腋溫測量的正確方法 瀏覽:849
怎麼做南瓜丸子的方法 瀏覽:54
牛頭臉的使用方法視頻 瀏覽:645
如何學會思維方法 瀏覽:452
柚子如何去皮方法 瀏覽:65
如何做雙肩包簡單的方法 瀏覽:888
上網慢解決方法 瀏覽:170
製作泡泡奶的方法簡單一點 瀏覽:176
高中生種植蓮藕的方法 瀏覽:280
陰角條連接方法 瀏覽:87
東方裝飾鹵水製作方法步驟 瀏覽:793
避孕套的方法圖片 瀏覽:152
多肉植物生根粉的使用方法 瀏覽:53
家庭自製蛋糕最簡單的方法不用蛋糕粉 瀏覽:142