java創建存儲過程
可以在PL/sql Devlelop環境中寫
用Java編寫Oracle存儲過程和函數
Oracle里可以使用多種語言來編寫存儲過程,比如Pro*C/C++,PL/SQL,COBOL,在Oracle8i開始支持用Java編寫存儲過程。
如果非要寫存儲過程的話,做為以Java謀生的我,首選用Java編寫,用PL/SQL需要記憶很多的語法(Pascal類的語法)和函數,遠不如使用Java/JDBC這么輕車熟路。而且,DB2等資料庫都支持Java存儲過程,所以不比為每一種數據學習一種編寫存儲過程的方法了。
Java存儲過程與一般的JDBC程序有所不同的是:
1.有安全限制,畢竟是在oracle內部運行的,不允許訪問操作系統的資源,如文件。
2.獲取資料庫聯接方式,connection = new OracleDriver().defaultConnection();
3.System.out,System.err,System.in等輸入輸出有所不同。可以利用某些命令重定向。
下面是用Java source寫一個存儲過程和函數的例子。
1.在plsqldeveloper里,java source里增加一個MyTest類,
代碼:
create or replace and compile java source named test as
public class MyTest
{// 創建存儲過程的java源代碼
(執行時請將注釋刪除,這里本人試過所有的注釋了,都不行,還沒弄明白為什麼不能用注釋)
public static void myProc(int a,int b,int[] ret){
ret[0]=a+b;
}
// 創建函數的java源代碼(執行時請將注釋刪除)
public static int myFunc(int a,int b){
return a+b;
}
}
/
F8執行它,以保存並編譯。
2)增加一個procere和函數,執行如下命令:
代碼:
'創建存儲過程
CREATE OR REPLACE PROCEDURE myProc(a in number, b in number, ret out number) AS
LANGUAGE java NAME 'MyTest.myProc(int,int,int[])'; '注意MyTest.myProc是我們編寫的java source的類名和方法名
/
'創建函數
CREATE OR REPLACE FUNCTION myFunc(a in number, b in number) RETURN NUMBER IS
LANGUAGE java NAME 'MyTest.myFunc(int,int) return int';
/
F8執行它,以保存並編譯。
3)使用測試
『測試存儲過程用到的測試代碼
set serveroutput on
DECLARE a INTEGER;
BEGIN
myProc(1, 2, a);
DBMS_OUTPUT.PUT_LINE(a);
END;
/
『測試函數用到的測試代碼
select myFunc(1,2) from al;
存儲過程執行結果:
3
PL/SQL procere successfully completed
--------------------------------------------
函數執行結果
MYFUNC(1,2)
-----------
3
可以適當找些參考例子,從簡單的開始,希望我的回答對你有所幫助。
2. java中怎麼用存儲過程啊
對已儲存過程的調用是CallableStatement對象所含的內容。這種調用是用一種換碼語法來寫的,有兩種形式:一種形式帶結果參,另一種形式不帶結果參數。結果參數是一種輸出(OUT)參數,是已儲存過程的返回值。兩種形式都可帶有數量可變的輸入(IN參數)、輸出(OUT參數)或輸入和輸出(INOUT參數)的參數。問號將用作參數的佔位符。在JDBC中調用已儲存過程的語法如下所示。注意,方括弧表示其間的內容是可選項;方括弧本身並非語法的組成部份。 {call過程名[(?,?,...)]} 返回結果參數的過程的語法為: {?=call過程名[(?,?,...)]} 不帶參數的已儲存過程的語法類似: {call過程名} 通常,創建CallableStatement對象的人應當知道所用的DBMS是支持已儲存過程的,並且知道這些過程都是些什麼。然而,如果需要檢查,多種DatabaseMetaData方法都可以提供這樣的信息。例如,如果DBMS支持已儲存過程的調用,則supportsStoredProceres方法將返回true,而getProceres方法將返回對已儲存過程的描述。 CallableStatement繼承Statement的方法(它們用於處理一般的SQL語句),還繼承了PreparedStatement的方法(它們用於處理IN參)。 CallableStatement中定義的所有方法都用於處理OUT參數或INOUT參數的輸出部分:注冊OUT參數的JDBC類型(一般SQL類型)、從這些參數中檢索結果,或者檢查所返回的值是否為JDBCNULL。 JDBC存儲過程1、創建CallableStatement對象 CallableStatement對象是用Connection方法prepareCall創建的。下例創建CallableStatement的實例,其中含有對已儲存過程getTestData調用。該過程有兩個變數,但不含結果參數:CallableStatementc stmt=con.prepareCall("{callgetTestData(?,?)}");其中?佔位符為IN、OUT還是INOUT參數,取決於已儲存過程getTestData。 JDBC存儲過程2、IN和OUT參數 將IN參數傳給CallableStatement對象是通過setXXX方法完成的。該方法繼承自PreparedStatement。所傳入參數的類型決定了所用的setXXX方法(例如,用setFloat來傳入float值等)。如果已儲存過程返回OUT參數,則在執行CallableStatement對象以前必須先注冊每個OUT參數的JDBC類型(這是必需的,因為某些DBMS要求JDBC類型)。注冊JDBC類型是用registerOutParameter方法來完成的。語句執行完後,CallableStatement的getXXX方法將取回參數值。正確的getXXX方法是為各參數所注冊的JDBC類型所對應的Java類型。換言之,registerOutParameter使用的是JDBC類型(因此它與資料庫返回的JDBC類型匹配),而getXXX將之轉換為Java類型。 作為示例,下述代碼先注冊OUT參數,執行由cstmt所調用的已儲存過程,然後檢索在OUT參數中返回的值。方法getByte從第一個OUT參數中取出一個Java位元組,而getBigDecimal從第二個OUT參數中取出一個BigDecimal對象(小數點後面帶三位數): CallableStatementc stmt=con.prepareCall("{callgetTestData(?,?)}"); cstmt.registerOutParameter(1,java.sql.Types.TINYINT); cstmt.registerOutParameter(2,java.sql.Types.DECIMAL,3); cstmt.executeQuery(); byte x=cstmt.getByte(1); java.math.BigDecimaln=cstmt.getBigDecimal(2,3); CallableStatement與ResultSet不同,它不提供用增量方式檢索大OUT值的特殊機制。JDBC存儲過程3、INOUT參數 既支持輸入又接受輸出的參數(INOUT參數)除了調用registerOutParameter方法外,還要求調用適當的setXXX方法(該方法是從PreparedStatement繼承來的)。setXXX方法將參數值設置為輸入參數,而registerOutParameter方法將它的JDBC類型注冊為輸出參數。setXXX方法提供一個Java值,而驅動程序先把這個值轉換為JDBC值,然後將它送到資料庫中。這種IN值的JDBC類型和提供給registerOutParameter方法的JDBC類型應該相同。然後,要檢索輸出值,就要用對應的getXXX方法。例如,Java類型為byte的參數應該使用方法setByte來賦輸入值。應該給registerOutParameter提供類型為TINYINT的JDBC類型,同時應使用getByte來檢索輸出值。 下例假設有一個已儲存過程reviseTotal,其唯一參數是INOUT參數。方法setByte把此參數設為25,驅動程序將把它作為JDBCTINYINT類型送到資料庫中。接著,registerOutParameter將該參數注冊為JDBCTINYINT。執行完該已儲存過程後,將返回一個新的JDBCTINYINT值。方法getByte將把這個新值作為Javabyte類型檢索。 CallableStatementc stmt=con.prepareCall("{callreviseTotal(?)}"); cstmt.setByte(1,25); cstmt.registerOutParameter(1,java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x=cstmt.getByte(1); 1)返回一個結果集(ResultSet)。2)返回一個特定的值。下面來詳細的說明。1)返回一個結果集(ResultSet),這種類似通常的處理結果集如果事先就有一個類似如下的procere CREATE PROCEDURE getShipQuantity @jsid int ASSELECT jf_js_id,SUM(jf_ship_quantity) AS shipqty FROM tjobsheet_finish f WHERE (jf_js_id=@jsid)GROUP BY jf_js_id 那麼我們將通過如下的代碼來調用 String sql = "{ call getShipQuantity(?) }";Connection con = conn.connection();ResultSet rs = null;BigDecimal shipQuantity = new BigDecimal(0);try{ CallableStatement cs = con.prepareCall(sql); cs.setInt(1,jsoId);//設置輸入參數 rs = cs.executeQuery();//返回結果集 if(rs.next()){ shipQuantity = new BigDecimal(rs.getDouble(2)); } logger.debug("shipQuantity --------------------- "+shipQuantity);}catch(Exception e){ logger.debug(e);}2)返回一個特定的值。也就是說,在procere的定義中已經用output輸出參數了。請看下面的proceercreate procere getSingleWgt @@singleWgt numeric(8,3) output,@jsnum varchar(11) = '0000-0480'asdeclare @stwgt numeric(8,3)select @stwgt = sum(b.stwgt)from js as ainner join jsactdtl as b on a.jsnum = b.jsnumwhere a.completion = 1 and b.stflag = 22and a.jsnum = @jsnumselect @@singleWgt = (@stwgt/orderedqty) from js where jsnum = @jsnum那麼我們將通過如下的代碼來調用String sql = "{ call getSingleWgt(?,?) }";Connection con = getSession().connection();//得到connectiontry{ CallableStatement cs = con.prepareCall(sql);//通過它來執行sql cs.registerOutParameter(1,java.sql.Types.FLOAT);//注冊輸出參數 cs.setString(2,shipment.getJsnum());//指出輸入參數 if(cs.execute()){//執行 float output = cs.getFloat(1);//返回值 }}catch(Exception e){logger.debug(e);}
3. 怎樣用JavaDB創建存儲過程
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class UseSQLDataBase3 {
Connection con;
Statement state;
ResultSet rs;
CallableStatement cs;//調用存儲過程使用的介面
String url = "jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=test";
String user = "sa";
String password = "";
public void connectSQL(){
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
} catch (ClassNotFoundException e) {
// TODO 自動生成 catch 塊
e.printStackTrace();
}
try {
con = DriverManager.getConnection(url, user, password);
state = con.createStatement();
//創建存儲過程SQL語句
String createProcere = " create procere SHOW_SUPPLIERS " +
"as "+
" select SUPPLIERS.SUP_NAME,COFFEES.COF_NAME "+
"from suppliers,coffees"+
"where suppliers.sup_id = coffees.sup_id "+
"order by sup_name";
//創建存儲過程
state.executeUpdate("USE TEST");
state.executeUpdate(createProcere);
//調用存儲過程
cs = con.prepareCall("{call SHOW_SUPPLIERS}");//創建一個 CallableStatement 對象來調用資料庫存儲過程
//返回調用的結果集
rs = cs.executeQuery();
//輸出結果
System.out.println("SUPPLIERS.SUP_NAME COFFEES.COF_NAME");
while(rs.next()){
String sup_name = rs.getString(1);
String coffees_name = rs.getString(2);
System.out.println(sup_name + " " + coffees_name);
}
con.close();
state.close();
} catch (SQLException e) {
// TODO 自動生成 catch 塊
e.printStackTrace();
}
}
public static void main(String[] args){
new UseSQLDataBase3().connectSQL();
}
}
4. 如何創建Java存儲過程
1、操作系統:windows 2000 Server
2、數 據 庫:Oracle 8i R2 (8.1.7) for NT 企業版
3、安裝路徑:C:\ORACLE
實現方法:
1、 創建一個文件為TEST.java
public class TEST
{
public static void main (String args[])
{
System.out.PRintln("HELLO THIS iS A JAVA PROCEDURE");
}
}
2、 javac TEST.java
3、 java TEST
4、 SQL> conn system/manager
SQL> grant create any Directory to scott;
SQL> conn scott/tiger
SQL> create or replace directory test_dir as 'd:\'
目錄已創建。
SQL> create or replace java class using bfile(test_dir,'TEST.CLASS')
2/
Java 已創建。
SQL> select object_name,object_type,STATUS from user_objects;
SQL> create or replace procere test_java
as language java
name 'TEST.main(java.lang.String[])';
/
過程已創建。
SQL> set serveroutput on size 5000
SQL> call dbms_java.set_output(5000);
調用完成。
SQL> execute test_java;
HELLO THIS iS A JAVA PROCEDURE
PL/SQL 過程已成功完成。
SQL> call test_java();
HELLO THIS iS A JAVA PROCEDURE
調用完成。
5. 用java調用已有的存儲過程創建一個資料庫怎麼寫
就是調用存儲過程,存儲過程創建數據吧;傳入參數,直接調用即可,與調用普通存儲過程相同;只是需要注意你連接資料庫的用戶需要有創建DBA許可權。
6. 執行存儲過程有多少種方法java
Java執行存儲過程的方法:
簡單的老的JDBC通過CallableStatement類支持存儲過程的調用。該類實際上是PreparedStatement的一個子類。假設有一個poets資料庫。資料庫中有一個設置詩人逝世年齡的存儲過程。下面是對老酒鬼Dylan Thomas(old soak Dylan Thomas,不指定是否有關典故、文化,請批評指正。譯注)進行調用的詳細代碼:
try{
intage=39;
StringpoetName="dylanthomas";
CallableStatementproc=connection.prepareCall("{callset_death_age(?,?)}");
proc.setString(1,poetName);
proc.setInt(2,age);
cs.execute();
}catch(SQLExceptione){//....}
傳給prepareCall方法的字串是存儲過程調用的書寫規范。它指定了存儲過程的名稱,?代表了需要指定的參數。
和JDBC集成是存儲過程的一個很大的便利:為了從應用中調用存儲過程,不需要存根(stub)類或者配置文件,除了你的DBMS的JDBC驅動程序外什麼也不需要。
當這段代碼執行時,資料庫的存儲過程就被調用。我們沒有去獲取結果,因為該存儲過程並不返回結果。執行成功或失敗將通過例外得知。失敗可能意味著調用存儲過程時的失敗(比如提供的一個參數的類型不正確),或者一個應用程序的失敗(比如拋出一個例外指示在poets資料庫中並不存在「Dylan Thomas」)
結合SQL操作與存儲過程
映射Java對象到SQL表中的行相當簡單,但是通常需要執行幾個SQL語句;可能是一個SELECT查找ID,然後一個INSERT插入指定ID的數據。在高度規格化(符合更高的範式,譯注)的資料庫模式中,可能需要多個表的更新,因此需要更多的語句。Java代碼會很快地膨脹,每一個語句的網路開銷也迅速增加。
將這些SQL語句轉移到一個存儲過程中將大大簡化代碼,僅涉及一次網路調用。所有關聯的SQL操作都可以在資料庫內部發生。並且,存儲過程語言,例如PL/SQL,允許使用SQL語法,這比Java代碼更加自然。早期的存儲過程,使用Oracle的PL/SQL語言編寫:
createprocereset_death_age(poetVARCHAR2,poet_ageNUMBER)
poet_idNUMBER;
beginSELECTidINTOpoet_idFROMpoetsWHEREname=poet;
INSERTINTOdeaths(mort_id,age)VALUES(poet_id,poet_age);
endset_death_age;
set_death_age幾乎可以肯定是一個很爛的實現。應該在poets表中添加一列來存儲逝世年齡。Java代碼中並不關心資料庫模式是怎麼實現的,因為它僅調用存儲過程。以後可以改變資料庫模式以提高性能,但是不必修改代碼。
下面是調用上面存儲過程的Java代碼:
publicstaticvoidsetDeathAge(PoetdyingBard,intage)throwsSQLException{
Connectioncon=null;
CallableStatementproc=null;
try{
con=connectionPool.getConnection();
proc=con.prepareCall("{callset_death_age(?,?)}");
proc.setString(1,dyingBard.getName());
proc.setInt(2,age);
proc.execute();
}
finally{
try{proc.close();}
catch(SQLExceptione){}
con.close();
}
}
為了確保可維護性,建議使用像這兒這樣的static方法。這也使得調用存儲過程的代碼集中在一個簡單的模版代碼中。如果用到許多存儲過程,就會發現僅需要拷貝、粘貼就可以創建新的方法。因為代碼的模版化,甚至也可以通過腳本自動生產調用存儲過程的代碼。
Functions
存儲過程可以有返回值,所以CallableStatement類有類似getResultSet這樣的方法來獲取返回值。當存儲過程返回一個值時,必須使用registerOutParameter方法告訴JDBC驅動器該值的SQL類型是什麼。也必須調整存儲過程調用來指示該過程返回一個值。
下面接著上面的例子。這次查詢Dylan Thomas逝世時的年齡。這次的存儲過程使用PostgreSQL的pl/pgsql:
createfunctionsnuffed_it_when(VARCHAR)returnsinteger'declare
poet_idNUMBER;
poet_ageNUMBER;
begin
--.
SELECTidINTOpoet_idFROMpoetsWHEREname=$1;
--getandreturntheage.
SELECTageINTOpoet_ageFROMdeathsWHEREmort_id=poet_id;
returnage;
end;'language'pl/pgsql';
另外,注意pl/pgsql參數名通過Unix和DOS腳本的$n語法引用。同時,也注意嵌入的注釋,這是和Java代碼相比的另一個優越性。在Java中寫這樣的注釋當然是可以的,但是看起來很凌亂,並且和SQL語句脫節,必須嵌入到Java String中。
下面是調用這個存儲過程的Java代碼:
connection.setAutoCommit(false);
CallableStatementproc=connection.prepareCall("{?=callsnuffed_it_when(?)}");
proc.registerOutParameter(1,Types.INTEGER);
proc.setString(2,poetName);
cs.execute();
intage=proc.getInt(2);
如果指定了錯誤的返回值類型會怎樣?那麼,當調用存儲過程時將拋出一個RuntimeException,正如你在ResultSet操作中使用了一個錯誤的類型所碰到的一樣。
復雜的返回值
如果這是存儲過程的全部功能,那麼存儲過程就不是其它遠程執行機制的替換方案了。存儲過程的功能比這強大得多。
當執行一個SQL查詢時,DBMS創建一個叫做cursor(游標)的資料庫對象,用於在返回結果中迭代每一行。ResultSet是當前時間點的游標的一個表示。這就是為什麼沒有緩存或者特定資料庫的支持,只能在ResultSet中向前移動。
某些DBMS允許從存儲過程中返回遊標的一個引用。JDBC並不支持這個功能,但是Oracle、PostgreSQL和DB2的JDBC驅動器都支持在ResultSet上打開到游標的指針(pointer)。
設想列出所有沒有活到退休年齡的詩人,下面是完成這個功能的存儲過程,返回一個打開的游標,同樣也使用PostgreSQL的pl/pgsql語言:
createprocerelist_early_deaths()returnrefcursoras'declare
toesuprefcursor;
begin
opentoesupforSELECTpoets.name,deaths.ageFROMpoets,deaths--allentriesindeathsareforpoets.--butthetablemightbecomegeneric.
WHEREpoets.id=deaths.mort_idANDdeaths.age<60;
returntoesup;
end;'language'plpgsql';
下面是調用該存儲過程的Java方法,將結果輸出到PrintWriter:
PrintWriter:
staticvoidsendEarlyDeaths(PrintWriterout){
Connectioncon=null;
CallableStatementtoesUp=null;
try{
con=ConnectionPool.getConnection();
//...con.
setAutoCommit(false);//Setupthecall.
CallableStatementtoesUp=connection.prepareCall("{?=calllist_early_deaths()}");
toesUp.registerOutParameter(1,Types.OTHER);
toesUp.execute();
ResultSetrs=(ResultSet)toesUp.getObject(1);
while(rs.next()){
Stringname=rs.getString(1);
intage=rs.getInt(2);
out.println(name+"was"+age+"yearsold.");
}
rs.close();
}
catch(SQLExceptione){//Weshouldprotectthesecalls.toesUp.close();con.close();
}
}
因為JDBC並不直接支持從存儲過程中返回遊標,使用Types.OTHER來指示存儲過程的返回類型,然後調用getObject()方法並對返回值進行強制類型轉換。
這個調用存儲過程的Java方法是mapping的一個好例子。Mapping是對一個集上的操作進行抽象的方法。不是在這個過程上返回一個集,可以把操作傳送進去執行。本例中,操作就是把ResultSet列印到一個輸出流。這是一個值得舉例的很常用的例子,下面是調用同一個存儲過程的另外一個方法實現:
publicclassProcessPoetDeaths{
publicabstractvoidsendDeath(Stringname,intage);
}
staticvoidmapEarlyDeaths(ProcessPoetDeathsmapper){
Connectioncon=null;
CallableStatementtoesUp=null;
try{
con=ConnectionPool.getConnection();
con.setAutoCommit(false);
CallableStatementtoesUp=connection.prepareCall("{?=calllist_early_deaths()}");
toesUp.registerOutParameter(1,Types.OTHER);
toesUp.execute();
ResultSetrs=(ResultSet)toesUp.getObject(1);
while(rs.next()){
Stringname=rs.getString(1);
intage=rs.getInt(2);
mapper.sendDeath(name,age);
}
rs.close();
}catch(SQLExceptione){//Weshouldprotectthesecalls.toesUp.close();
con.close();
}
}
這允許在ResultSet數據上執行任意的處理,而不需要改變或者復制獲取ResultSet的方法:
staticvoidsendEarlyDeaths(finalPrintWriterout){
ProcessPoetDeathsmyMapper=newProcessPoetDeaths(){
publicvoidsendDeath(Stringname,intage){
out.println(name+"was"+age+"yearsold.");
}
};
mapEarlyDeaths(myMapper);
}
這個方法使用ProcessPoetDeaths的一個匿名實例調用mapEarlyDeaths。該實例擁有sendDeath方法的一個實現,和我們上面的例子一樣的方式把結果寫入到輸出流。當然,這個技巧並不是存儲過程特有的,但是和存儲過程中返回的ResultSet結合使用,是一個非常強大的工具。
7. 如何在Oracle中使用Java存儲過程
通常有三種方法來創建java存儲過程。
1. 使用oracle的sql語句來創建:
e.g. 使用create or replace and compile java source named "<name>" as
後邊跟上java源程序。要求類的方法必須是public static的,才能用於存儲過程。
SQL>"javademo1"
as
importjava.sql.*;
publicclassJavaDemo1
{
publicstaticvoidmain(String[]argv)
{
System.out.println("hello,javademo1");
}
}
/
Java已創建。
SQL>showerrorsjavasource"javademo1"
沒有錯誤。
SQL>
as
languagejavaname'JavaDemo1.main(java.lang.String[])';
/
過程已創建。
SQL>setserveroutputon
SQL>calljavademo1();
調用完成。
SQL>calldbms_java.set_output(5000);
調用完成。
SQL>calljavademo1();
hello,javademo1
調用完成。
SQL>calljavademo1();
hello,javademo1
調用完成。
2. 使用外部class文件來裝載創建
e.g. 這里既然用到了外部文件,必然要將class文件放到oracle Server的某一目錄下邊。
publicclassOracleJavaProc
{
publicstaticvoidmain(String[]argv)
{
System.out.println("It'saJavaOracleprocere.");
}
}
SQL>;
授權成功。
SQL>connscott/[email protected]
已連接。
SQL>createorreplacedirectorytest_diras'd:/oracle';
目錄已創建。
SQL>(test_dir,'OracleJavaProc.CLASS')
2/
Java已創建。
SQL>'OracleJavaProc.main(java.lang.String[])';
2/
過程已創建。
SQL>calltestjavaproc();
調用完成。
SQL>executetestjavaproc;
PL/SQL過程已成功完成。
SQL>setserveroutputonsize5000
SQL>calldbms_java.set_output(5000);
調用完成。
SQL>executetestjavaproc;
It'saJavaOracleprocere.
3. 我推薦的一種方法,直接使用loadjava命令遠程裝載並創建。
先創建一個類, e.g.
importjava.sql.*;
importoracle.jdbc.*;
publicclassOracleJavaProc{
//Addasalgradetothedatabase.
publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal){
System.out.println("...");
try{
Connectionconn=
DriverManager.getConnection("jdbc:default:connection:");
Stringsql=
"INSERTINTOsalgrade"+
"(GRADE,LOSAL,HISAL)"+
"VALUES(?,?,?)";
PreparedStatementpstmt=conn.prepareStatement(sql);
pstmt.setInt(1,grade);
pstmt.setInt(2,losal);
pstmt.setInt(3,hisal);
pstmt.executeUpdate();
pstmt.close();
}
catch(SQLExceptione){
System.err.println("ERROR!AddingSalgrade:"
+e.getMessage());
}
}
}
使用loadjava命令將其裝載到伺服器端並編譯:
D:eclipse3.1workspacedbtest>loadjava-uscott/[email protected]
acleJavaProc.java
arguments:'-u''scott/[email protected]'-v''-resolve''OracleJavaProc.java'
creating:sourceOracleJavaProc
loading:sourceOracleJavaProc
resolving:sourceOracleJavaProc
查詢一下狀態:
連接到:
.2.0.1.0-Proction
WiththePartitioning,
JServerRelease9.2.0.1.0-Proction
SQL>SELECTobject_name,object_type,statusFROMuser_objectsWHEREobject_typeLIKE'JAVA%';
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPESTATUS
--------------------------------------------------
OracleJavaProc
JAVACLASSVALID
OracleJavaProc
JAVASOURCEVALID
測試一下存儲過程:
SQL>createorreplaceprocereadd_salgrade(idnumber,losalnumber,hisalnum
ber)aslanguagejavaname'OracleJavaProc.addSalGrade(int,int,int)';
2/
過程已創建。
SQL>setserveroutputonsize2000
SQL>calldbms_java.set_output(2000);
調用完成。
SQL>executeadd_salgrade(6,10000,15000);
...
PL/SQL過程已成功完成。
SQL>select*fromsalgradewheregrade=6;
GRADELOSALHISAL
------------------------------
61000015000
8. JAVA用代碼操作資料庫創建表,視圖,觸發器,存儲過程等。
create
or
replace
trigger
trg_delete_count
before
delete
on
student
for
each
row
begin
delete
from
成績表
where
成績表.學號=:old.學號;
commit;
end;
想要實現類似的功能,不一定要用觸發器的,可以設置兩個表的主鍵和外鍵,設置級聯刪除關系,刪除主鍵時,外鍵表中的記錄也會自動刪除。
9. 什麼是java中的存儲過程請教高手幫忙
java本身是沒儲存過程的,
存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化後存儲在資料庫伺服器中,使用時只要調用即可。
比如說,在java調用oracle存儲過程。