❶ java 調用Oracle函數
是不是中文哇。你先用控制台連接oracle取數據看數據是不是正確顯示的。
dbCharset用的什麼字元集哇。。
System.out.println("str的值:"+new String(out_value.stringValue().getBytes("這里用和dbCharset一樣的字元集")));
❷ java調用oracle管道函數怎麼調用,求解
調用資料庫里的一個函數
一個函數本質上一個返回一個結果的存儲過程,這個例子示範了怎麼調用有in、out和in/out參數的函數***********************************/
CallableStatement cs;
try {
// 調用一個沒有參數的函數; 函數返回 a VARCHAR// 預處理callable語句
cs = connection.prepareCall("{? = call myfunc}");// 注冊返回值類型
cs.registerOutParameter(1, i);
// Execute and retrieve the returned valuecs.execute();
String retValue = cs.getString(1);
// 調用有一個in參數的函數; the function returns a VARCHARcs = connection.prepareCall("{? = call myfuncin(?)}");// Register the type of the return value
cs.registerOutParameter(1, Types.VARCHAR);// Set the value for the IN parameter
cs.setString(2, "a string");
// Execute and retrieve the returned valuecs.execute();
retValue = cs.getString(1);
// 調用有一個out參數的函數; the function returns a VARCHARcs = connection.prepareCall("{? = call myfuncout(?)}");// Register the types of the return value and OUT parametercs.registerOutParameter(1, Types.VARCHAR);cs.registerOutParameter(2, Types.VARCHAR);// Execute and retrieve the returned valuescs.execute();
retValue = cs.getString(1); // return valueString outParam = cs.getString(2); // OUT parameter// 調用有一個in/out參數的函數; the function returns a VARCHARcs = connection.prepareCall("{? = call myfuncinout(?)}");// Register the types of the return value and OUT parametercs.registerOutParameter(1, Types.VARCHAR);cs.registerOutParameter(2, Types.VARCHAR);// Set the value for the IN/OUT parametercs.setString(2, "a string");
// Execute and retrieve the returned valuescs.execute();
retValue = cs.getString(1); // return valueoutParam = cs.getString(2); // IN/OUT parameter} catch (SQLException e) {
}
❸ 高手速來幫忙!!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函數
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;
❺ oracle觸發器調用一個Java類
把JAVA程序LOAD進oracle
在$ORACLE_HOME/bin目錄下有個LOADJAVA命令,使用這個命令將剛寫好的JAVA程序LOAD進資料庫。
loadjava -user test/test@test -o -v -f -r Main.java
如果成功的話,會列印出來信息提示成功,若程序有編譯錯誤的話,也會提示你錯誤的地方。
3。修改許可權
因為我的這個JAVA程序里涉及到對文件的讀寫操作,所以要先修改許可權。
首先以管理員身份登錄進資料庫
sqlplus / as sysdba
然後執行
begin
dbms_java.grant_permission('TEST','SYS:java.io.FilePermission','/var/spool/cron/oracle','read,write,execute,delete');
end;
/
執行完畢後,在資料庫里執行上述JAVA程序時,就擁有讀寫該文件的許可權了。
4。創建存儲過程
進入到資料庫,我是在SQLPLUS命令行
create or replace procere Modify(name varchar2) as language java name 'Main.modify(java.lang.String)';
/
會提示創建存儲過程成功。
5。增加trigger
我是在TOAD里直接針對某個表增加trigger,所以我只寫出關鍵部分的代碼
begin
if :old.name = 'time' then
Modify(:new.value);
end if;
end;
至此,在ORACLE的trigger里調用JAVA程序就完成了,後來的實驗證明,每當更新這個表時,都確實執行了該JAVA程序,完成了對文件的讀寫。