oracle存儲過程學(xué)習(xí)經(jīng)典[語法+實(shí)例+調(diào)用].doc_第1頁
oracle存儲過程學(xué)習(xí)經(jīng)典[語法+實(shí)例+調(diào)用].doc_第2頁
oracle存儲過程學(xué)習(xí)經(jīng)典[語法+實(shí)例+調(diào)用].doc_第3頁
oracle存儲過程學(xué)習(xí)經(jīng)典[語法+實(shí)例+調(diào)用].doc_第4頁
oracle存儲過程學(xué)習(xí)經(jīng)典[語法+實(shí)例+調(diào)用].doc_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Oracle 存儲過程學(xué)習(xí)目錄Oracle 存儲過程1Oracle存儲過程基礎(chǔ)知識1Oracle存儲過程的基本語法2關(guān)于Oracle存儲過程的若干問題備忘41.在Oracle中,數(shù)據(jù)表別名不能加as。42.在存儲過程中,select某一字段時(shí),后面必須緊跟into,如果select整個(gè)記錄,利用游標(biāo)的話就另當(dāng)別論了。53.在利用o.語法時(shí),必須先確保數(shù)據(jù)庫中有該條記錄,否則會報(bào)出no data found異常。54.在存儲過程中,別名不能和字段名稱相同,否則雖然編譯可以通過,但在運(yùn)行階段會報(bào)錯(cuò)55.在存儲過程中,關(guān)于出現(xiàn)null的問題56.Hibernate調(diào)用Oracle存儲過程6用Java調(diào)用Oracle存儲過程總結(jié)6一、無返回值的存儲過程6二、有返回值的存儲過程(非列表)8三、返回列表9在存儲過程中做簡單動態(tài)查詢11一、本地動態(tài)SQL12二、使用DBMS_SQL包13Oracle存儲過程調(diào)用Java方法16Oracle高效分頁存儲過程實(shí)例17Oracle存儲過程基礎(chǔ)知識商業(yè)規(guī)則和業(yè)務(wù)邏輯可以通過程序存儲在Oracle中,這個(gè)程序就是存儲過程。 存儲過程是SQL, PL/SQL, Java 語句的組合,它使你能將執(zhí)行商業(yè)規(guī)則的代碼從你的應(yīng)用程序中移動到數(shù)據(jù)庫。這樣的結(jié)果就是,代碼存儲一次但是能夠被多個(gè)程序使用。要?jiǎng)?chuàng)建一個(gè)過程對象(procedural object),必須有 CREATE PROCEDURE 系統(tǒng)權(quán)限。如果這個(gè)過程對象需要被其他的用戶schema 使用,那么你必須有 CREATE ANY PROCEDURE 權(quán)限。執(zhí)行 procedure 的時(shí)候,可能需要excute權(quán)限?;蛘逧XCUTE ANY PROCEDURE 權(quán)限。如果單獨(dú)賦予權(quán)限,如下例所示: grant execute on MY_PROCEDURE to Jelly調(diào)用一個(gè)存儲過程的例子: execute MY_PROCEDURE( ONE PARAMETER);存儲過程(PROCEDURE)和函數(shù)(FUNCTION)的區(qū)別。 function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。本質(zhì)上沒有區(qū)別,都是 PL/SQL 程序,都可以有返回值。最根本的區(qū)別是: 存儲過程是命令,而函數(shù)是表達(dá)式的一部分。比如:select max(NAME) FROM但是不能 exec max(NAME) 如果此時(shí)max是函數(shù)。PACKAGE是function,procedure,variables 和sql 語句的組合。package允許多個(gè)procedure使用同一個(gè)變量和游標(biāo)。創(chuàng)建 procedure的語法: CREATE OR REPLACE PROCEDURE cedure (argument IN | OUT | IN OUT NO COPY datatype , argument IN | OUT | IN OUT NO COPY datatype. ) authid current_user | definer is | as pl/sql_subprogram_body | language java name String | c name, name library lib_nameSql 代碼:CREATE PROCEDURE sam.credit (acc_no IN NUMBER, amount IN NUMBER) AS BEGIN UPDATE accounts SET balance = balance + amount WHERE account_id = acc_no; END; 可以使用 create or replace procedure 語句, 這個(gè)語句的用處在于,你之前賦予的excute權(quán)限都將被保留。IN, OUT, IN OUT用來修飾參數(shù)。IN 表示這個(gè)變量必須被調(diào)用者賦值然后傳入到PROCEDURE進(jìn)行處理。OUT 表示PRCEDURE 通過這個(gè)變量將值傳回給調(diào)用者。IN OUT 則是這兩種的組合。authid代表兩種權(quán)限:定義者權(quán)限(difiner right 默認(rèn)),執(zhí)行者權(quán)限(invoker right)。定義者權(quán)限說明這個(gè)procedure中涉及的表,視圖等對象所需要的權(quán)限只要定義者擁有權(quán)限的話就可以訪問。執(zhí)行者權(quán)限則需要調(diào)用這個(gè) procedure的用戶擁有相關(guān)表和對象的權(quán)限。Oracle存儲過程的基本語法1. 基本結(jié)構(gòu)CREATE OR REPLACE PROCEDURE 存儲過程名字( 參數(shù)1 IN NUMBER, 參數(shù)2 IN NUMBER) AS變量1 INTEGER :=0;變量2 DATE;BEGINEND 存儲過程名字2. SELECT INTO STATEMENT將select查詢的結(jié)果存入到變量中,可以同時(shí)將多個(gè)列存儲多個(gè)變量中,必須有一條 記錄,否則拋出異常(如果沒有記錄拋出NO_DATA_FOUND)例子:BEGIN SELECT col1,col2 into 變量1,變量2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; .3. IF 判斷IF V_TEST=1 THEN BEGIN do something END; END IF;4. while 循環(huán)WHILE V_TEST=1 LOOP BEGINXXXX END; END LOOP;5. 變量賦值V_TEST := 123;6. 用for in 使用cursor. IS CURSOR cur IS SELECT * FROM xxx; BEGINFOR cur_result in cur LOOPBEGINV_SUM :=cur_result.列名1+cur_result.列名2END;END LOOP; END;7. 帶參數(shù)的cursorCURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; OPEN C_USER(變量值); LOOPFETCH C_USER INTO V_NAME;EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER;8. 用pl/sql developer debug 連接數(shù)據(jù)庫后建立一個(gè)Test WINDOW 在窗口輸入調(diào)用SP的代碼,F9開始debug,CTRL+N單步調(diào)試9. Pl/Sql中執(zhí)行存儲過程在sql*plus中: declare -必要的變量聲明,視你的過程而定 begin execute yourprocudure(parameter1,parameter2,.); end / 在SQL/PLUS中調(diào)用存儲過程,顯示結(jié)果: SQLset serveoutput on -打開輸出 SQLvar info1 number; -輸出1 SQLvar info2 number; -輸出2 SQLdeclare var1 varchar2(20); -輸入1 var2 varchar2(20); -輸入2 var3 varchar2(20); -輸入2 BEGIN pro(var1,var2,var3,:info1,:info2); END; / SQLprint info1; SQLprint info2;注:在EXECUTE IMMEDIATE STR語句是SQLPLUS中動態(tài)執(zhí)行語句,它在執(zhí)行中會自動提交,類似于DP中FORMS_DDL語句,在此語句中str是不能換行的,只能通過連接字符|,或著在在換行時(shí)加上-連接字符。 關(guān)于Oracle存儲過程的若干問題備忘1. 在Oracle中,數(shù)據(jù)表別名不能加as。如:selecta.appnamefromappinfoa;- 正確selecta.appnamefromappinfoasa;- 錯(cuò)誤也許,是怕和Oracle中的存儲過程中的關(guān)鍵字as沖突的問題吧2. 在存儲過程中,select某一字段時(shí),后面必須緊跟into,如果select整個(gè)記錄,利用游標(biāo)的話就另當(dāng)別論了。selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=fid; -有into,正確編譯selectaf.keynodefromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=fid;-沒有into,編譯報(bào)錯(cuò),提示:CompilationError:PLS-00428:anINTOclauseisexpectedinthisSELECTstatement3. 在利用o.語法時(shí),必須先確保數(shù)據(jù)庫中有該條記錄,否則會報(bào)出no data found異常??梢栽谠撜Z法之前,先利用select count(*) from 查看數(shù)據(jù)庫中是否存在該記錄,如果存在,再利用o.4. 在存儲過程中,別名不能和字段名稱相同,否則雖然編譯可以通過,但在運(yùn)行階段會報(bào)錯(cuò)selectkeynodeintoknfromAPPFOUNDATIONwhereappid=aidandfoundationid=fid;-正確運(yùn)行selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=appidandaf.foundationid=foundationid;-運(yùn)行階段報(bào)錯(cuò),提示:ORA-01422:exactfetchreturnsmorethanrequestednumberofrows5. 在存儲過程中,關(guān)于出現(xiàn)null的問題假設(shè)有一個(gè)表A,定義如下:createtableA(idvarchar2(50)primarykeynotnull,vcountnumber(8)notnull,bidvarchar2(50)notnull-外鍵);如果在存儲過程中,使用如下語句:selectsum(vcount)intofcountfromAwherebid=xxxxxx;如果A表中不存在bid=xxxxxx的記錄,則fcount=null(即使fcount定義時(shí)設(shè)置了默認(rèn)值,如:fcount number(8):=0依然無效,fcount還是會變成null),這樣以后使用fcount時(shí)就可能有問題,所以在這里最好先判斷一下:iffcountisnullthenfcount:=0;endif;這樣就一切ok了。6. Hibernate調(diào)用Oracle存儲過程 this.pnumberManager.getHibernateTemplate().execute( new HibernateCallback() . public Object doInHibernate(Session session) throws HibernateException, SQLException . CallableStatement cs = session .connection() .prepareCall(call modifyapppnumber_remain(?); cs.setString(1, foundationid); cs.execute(); return null; );用Java調(diào)用Oracle存儲過程總結(jié) 一、 無返回值的存儲過程測試表:- Create tablecreate table TESTTB( ID VARCHAR2(30), NAME VARCHAR2(30)tablespace BOM pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited );例: 存儲過程為(當(dāng)然了,這就先要求要建張表TESTTB,里面兩個(gè)字段(I_ID,I_NAME)。):CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2, PARA2 IN VARCHAR2) ASBEGIN INSERT INTO BOM.TESTTB(ID, NAME) VALUES (PARA1, PARA2);END TESTA;在Java里調(diào)用時(shí)就用下面的代碼:package cedure.test;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 TestProcedureDemo1 public TestProcedureDemo1() public static void main(String args) String driver = Oracle.jdbc.driver.OracleDriver;String strUrl = jdbc:Oracle:thin:0:1521:vasms;Statement stmt = null;ResultSet rs = null;Connection conn = null;CallableStatement proc = null;try Class.forName(driver);conn = DriverManager.getConnection(strUrl, bom, bom);proc = conn.prepareCall( call BOM.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) 二、 有返回值的存儲過程(非列表)例:存儲過程為:CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2, PARA2 OUT VARCHAR2) ASBEGIN SELECT NAME INTO PARA2 FROM TESTTB WHERE ID = PARA1;END TESTB;在Java里調(diào)用時(shí)就用下面的代碼:package cedure.test;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.sql.Types;public class TestProcedureDemo2 public static void main(String args) String driver = Oracle.jdbc.driver.OracleDriver;String strUrl = jdbc:Oracle:thin:0:1521:vasms;Statement stmt = null;ResultSet rs = null;Connection conn = null;CallableStatement proc = null;try Class.forName(driver);conn = DriverManager.getConnection(strUrl, bom, bom);proc = conn.prepareCall( call BOM.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并非任意的,而是和存儲過程中的out列對應(yīng)的,如果out是在第一個(gè)位置,那就是proc.getString(1),如果是第三個(gè)位置,就是proc.getString(3),當(dāng)然也可以同時(shí)有多個(gè)返回值,那就是再多加幾個(gè)out參數(shù)了。三、 返回列表由于Oracle存儲過程沒有返回值,它的所有返回值都是通過out參數(shù)來替代的,列表同樣也不例外,但由于是集合,所以不能用一般的參數(shù),必須要用pagkage了.所以要分兩部分,1. 建一個(gè)程序包。如下: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) ISBEGIN OPEN P_CURSOR FOR SELECT * FROM BOM.TESTTB;END TESTC;可以看到,它是把游標(biāo)(可以理解為一個(gè)指針),作為一個(gè)out 參數(shù)來返回值的。在Java里調(diào)用時(shí)就用下面的代碼:在這里要注意,在執(zhí)行前一定要先把Oracle的驅(qū)動包放到class路徑里,否則會報(bào)錯(cuò)的。package cedure.test;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 TestProcedureDemo3 public static void main(String args) String driver = Oracle.jdbc.driver.OracleDriver;String strUrl = jdbc:Oracle:thin:0:1521:vasms;Statement stmt = null;ResultSet rs = null;Connection conn = null;CallableStatement proc = null;try Class.forName(driver);conn = DriverManager.getConnection(strUrl, bom, bom);proc = conn.prepareCall( call bom.testc(?) );proc.registerOutParameter(1, Oracle.jdbc.OracleTypes.CURSOR);proc.execute();rs = (ResultSet) proc.getObject(1);while (rs.next() System.out.println( + rs.getString(1) + + rs.getString(2) + ); 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) 在存儲過程中做簡單動態(tài)查詢在存儲過程中做簡單動態(tài)查詢代碼,例如: CREATE OR REPLACE procedure ZXM_SB_GZ_GET(p_table in varchar2,p_name in varchar2,p_value in varchar2,outpara out lntxdba.zxm_pag_cs_power.c_type)asbegindeclarewherevalue varchar2(200);beginwherevalue:=select * from |p_table| where |p_name|=|p_value;open outpara forwherevalue;end;end;一般的PL/SQL程序設(shè)計(jì)中,在DML和事務(wù)控制的語句中可以直接使用SQL,但是DDL語句及系統(tǒng)控制語句卻不能在PL/SQL中直接使用,要想實(shí)現(xiàn)在PL/SQL中使用DDL語句及系統(tǒng)控制語句,可以通過使用動態(tài)SQL來實(shí)現(xiàn)。首先我們應(yīng)該了解什么是動態(tài)SQL,在Oracle數(shù)據(jù)庫開發(fā)PL/SQL塊中我們使用的SQL分為:靜態(tài)SQL語句和動態(tài)SQL語句。所謂靜態(tài)SQL指在PL/SQL塊中使用的SQL語句在編譯時(shí)是明確的,執(zhí)行的是確定對象。而動態(tài)SQL是指在PL/SQL塊編譯時(shí)SQL語句是不確定的,如根據(jù)用戶輸入的參數(shù)的不同而執(zhí)行不同的操作。編譯程序?qū)討B(tài)語句部分不進(jìn)行處理,只是在程序運(yùn)行時(shí)動態(tài)地創(chuàng)建語句、對語句進(jìn)行語法分析并執(zhí)行該語句。Oracle中動態(tài)SQL可以通過本地動態(tài)SQL來執(zhí)行,也可以通過DBMS_SQL包來執(zhí)行。下面就這兩種情況分別進(jìn)行說明:一、 本地動態(tài)SQL本地動態(tài)SQL是使用EXECUTE IMMEDIATE語句來實(shí)現(xiàn)的。1、 本地動態(tài)SQL執(zhí)行DDL語句:需求:根據(jù)用戶輸入的表名及字段名等參數(shù)動態(tài)建表。create or replace procedure proc_test( table_name in varchar2, -表名 field1 in varchar2, -字段名 datatype1 in varchar2, -字段類型 field2 in varchar2, -字段名 datatype2 in varchar2 -字段類型) as str_sql varchar2(500);begin str_sql:=create table |table_name|(|field1| |datatype1|,|field2| |datatype2|);execute immediate str_sql; -動態(tài)執(zhí)行DDL語句exception when others then null;end ;以上是編譯通過的存儲過程代碼。下面執(zhí)行存儲過程動態(tài)建表。SQL execute proc_test(dinya_test,id,number(8) not null,name,varchar2(100);PL/SQL procedure successfully completedSQL desc dinya_test;Name Type Nullable Default Comments - - - - - IDNUMBER(8)NAME VARCHAR2(100) YSQL到這里,就實(shí)現(xiàn)了我們的需求,使用本地動態(tài)SQL根據(jù)用戶輸入的表名及字段名、字段類型等參數(shù)來實(shí)現(xiàn)動態(tài)執(zhí)行DDL語句。2、 本地動態(tài)SQL執(zhí)行DML語句。需求:將用戶輸入的值插入到上例中建好的dinya_test表中。create or replace procedure proc_insert(id in number, -輸入序號name in varchar2 -輸入姓名) as str_sql varchar2(500);begin str_sql:=insert into dinya_test values(:1,:2);execute immediate str_sql using id,name; -動態(tài)執(zhí)行插入操作exception when others then null;end ;執(zhí)行存儲過程,插入數(shù)據(jù)到測試表中。SQL execute proc_insert(1,dinya);PL/SQL procedure successfully completedSQL select * from dinya_test;IDNAME 1 dinya在上例中,本地動態(tài)SQL執(zhí)行DML語句時(shí)使用了using子句,按順序?qū)⑤斎氲闹到壎ǖ阶兞?,如果需要輸出參?shù),可以在執(zhí)行動態(tài)SQL的時(shí)候,使用RETURNING INTO 子句,如:declare p_id number:=1; v_count number;begin v_string:=select count(*) from table_name a where a.id=:id;execute immediate v_string into v_count using p_id;end ;二、 使用DBMS_SQL包使用DBMS_SQL包實(shí)現(xiàn)動態(tài)SQL的步驟如下:A、先將要執(zhí)行的SQL語句或一個(gè)語句塊放到一個(gè)字符串變量中。B、使用DBMS_SQL包的parse過程來分析該字符串。C、使用DBMS_SQL包的bind_variable過程來綁定變量。D、使用DBMS_SQL包的execute函數(shù)來執(zhí)行語句。1、使用DBMS_SQL包執(zhí)行DDL語句需求:使用DBMS_SQL包根據(jù)用戶輸入的表名、字段名及字段類型建表。create or replace procedure proc_dbms_sql( table_name in varchar2, -表名 field_name1 in varchar2, -字段名 datatype1 in varchar2, -字段類型 field_name2 in varchar2, -字段名 datatype2 in varchar2 -字段類型)as v_cursor number; -定義光標(biāo) v_string varchar2(200); -定義字符串變量 v_row number; -行數(shù)begin v_cursor:=dbms_sql.open_cursor; -為處理打開光標(biāo) v_string:=create table |table_name|(|field_name1| |datatype1|,|field_name2| |datatype2|); dbms_sql.parse(v_cursor,v_string,dbms_sql.native); -分析語句 v_row:=dbms_sql.execute(v_cursor); -執(zhí)行語句 dbms_sql.close_cursor(v_cursor); -關(guān)閉光標(biāo)exceptionwhen others then dbms_sql.close_cursor(v_cursor); -關(guān)閉光標(biāo)raise;end;以上過程編譯通過后,執(zhí)行過程創(chuàng)建表結(jié)構(gòu):SQL execute proc_dbms_sql(dinya_test2,id,number(8) not null,name,varchar2(100);PL/SQL procedure successfully completedSQL desc dinya_test2;Name Type Nullable Default Comments - - - - - IDNUMBER(8)NAME VARCHAR2(100) YSQL2、 使用DBMS_SQL包執(zhí)行DML語句需求:使用DBMS_SQL包根據(jù)用戶輸入的值更新表中相對應(yīng)的記錄。查看表中已有記錄:SQL select * from dinya_test2;ID NAME 1 Oracle 2 CSDN 3 ERPSQL建存儲過程,并編譯通過:create or replace procedure proc_dbms_sql_update(id number,name varchar2)as v_cursor number; -定義光標(biāo) v_string varchar2(200); -字符串變量 v_row number; -行數(shù)begin v_cursor:=dbms_sql.open_cursor; -為處理打開光標(biāo) v_string:=update dinya_test2 a set =:p_name where a.id=:p_id; dbms_sql.parse(v_cursor,v_string,dbms_sql.native); -分析語句 dbms_sql.bind_variable(v_cursor,:p_name,name); -綁定變量 dbms_sql.bind_variable(v_cursor,:p_id,id); -綁定變量 v_row:=dbms_sql.execute(v_cursor);-執(zhí)行動態(tài) dbms_sql.close_cursor(v_cursor); -關(guān)閉光標(biāo)exceptionwhen others then dbms_sql.close_cursor(v_cursor); -關(guān)閉光標(biāo)raise;end;執(zhí)行過程,根據(jù)用戶輸入的參數(shù)更新表中的數(shù)據(jù):SQL execute proc_dbms_sql_update(2,csdn_dinya);PL/SQL procedure successfully completedSQL select * from dinya_test2;ID NAME 1 Oracle 2 csdn_dinya 3 ERPSQL執(zhí)行過程后將第二條的name字段的數(shù)據(jù)更新為新值csdn_dinya。這樣就完成了使用dbms_sql包來執(zhí)行DML語句的功能。使用DBMS_SQL中,如果要執(zhí)行的動態(tài)語句不是查詢語句,使用DBMS_SQL.Execute或DBMS_SQL.Variable_Value來執(zhí)行,如果要執(zhí)行動態(tài)語句是查詢語句,則要使用DBMS_SQL.define_column定義輸出變量,然后使用DBMS_SQL.Execute, DBMS_SQL.Fetch_Rows, DBMS_SQL.Column_Value及DBMS_SQL.Variable_Value來執(zhí)行查詢并得到結(jié)果??偨Y(jié)說明:在Oracle開發(fā)過程中,我們可以使用動態(tài)SQL來執(zhí)行DDL語句、DML語句、事務(wù)控制語句及系統(tǒng)控制語句。但是需要注意的是,PL/SQL塊中使用動態(tài)SQL執(zhí)行DDL語句的時(shí)候與別的不同,在DDL中使用綁定變量是非法的(bind_variable(v_cursor,:p_name,name)),分析后不需要執(zhí)行DBMS_SQL.Bind_Variable,直接將輸入的變量加到字符串中即可。另外,DDL是在調(diào)用DBMS_SQL.PARSE時(shí)執(zhí)行的,所以DBMS_SQL.EXECUTE也可以不用,即在上例中的v_row:=dbms_sql.execute(v_cursor)部分可以不要。Oracle存儲過程調(diào)用Java方法存儲過程中調(diào)用Java程序段軟件環(huán)境:1、 操作系統(tǒng):Windows2000Server2、 數(shù)據(jù)庫:Oracle8iR2(8.1.7)forNT企業(yè)版3、 安裝路徑:C:ORACLE實(shí)現(xiàn)方法:1、 創(chuàng)建一個(gè)文件為Test.javapublic class Test public static void main(String args) System.out.println(HELLO THIS iS A Java PROCEDURE);2、 javacTest.java3、 javaTest4、 SQLconnsystem/managerSQLgrantcreateanydirectorytoscott;SQLconnscott/tigerSQLcreateorreplacedirectorytest_dirasd:;目錄已創(chuàng)建。SQLcreateorreplacejavaclassusingbfile(test_dir,TEST.CLASS)2/Java已創(chuàng)建。SQLselectobject_name,object_type,STATUSfromuser_objects;SQLcreateo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論