oracle存儲過程數組定義
1. oracle 存儲過程 數組循環
declare
type typ_rec is record of (student.name%type, student.age%type); --集合變數
type typ_tab is table of typ_rec index by binary_integer; --以集合變數為單位的table數組
rec_sql typ_rec;
another_rec student%rowtype; --跟rec_sql一樣
begin
--for循環里的rec_tmp不用定義,可以自動生成的
for rec_tmp in (select t.name, t.age from student t) loop
dbms_output.putline(rec_tmp.name || ' ''s age + 1 = ' || to_char(rec_tmp.age + 1) );
end loop;
exception
when others then
return;
end;
2. java調用存儲過程,Oracle自定義類型作參數怎麼寫法
1. 存儲過程以及類型定義如下:
--The array in oracle
CREATE OR REPLACE TYPE idArray AS TABLE OF VARCHAR2(20);
--package header
CREATE OR REPLACE PACKAGE Lib_Package AS
PROCEDURE Book_Check_Procere(ids IN idArray, exist OUT NUMBER);
END Lib_Package;
--package body
CREATE OR REPLACE PACKAGE BODY Lib_Package AS
PROCEDURE Book_Check_Procere( ids IN idArray, exist OUT NUMBER) AS v_Index BINARY_INTEGER; BEGIN v_Index:= ids.FIRST; LOOP SELECT COUNT(*) INTO exist FROM Lib_Duplicate WHERE status='Lent' AND book_id=ids(v_Index); EXIT WHEN v_Index=ids.LAST OR exist>0; v_Index:= ids.NEXT(v_Index); END LOOP;END Book_Check_Procere;
END Lib_Package;
2.在Java中調用上面的存儲過程
(1) 在Oracle中定義數組類型idArray (2) 在java構造數組並轉換成Oracle中定義的數組類型,調用存儲過程
/** * 當要刪除圖書時,檢查是否仍然有圖書復本處於借出狀態 */ public boolean checkBookStatus(String[] bookIds) throws DataAccessException {
boolean flag = false; Connection conn = null; OracleCallableStatement cstmt = null; ArrayDescriptor desc = null; ARRAY bookIdArray = null; int count = 0; String sql = "{call LIB_PACKAGE.Book_Check_Procere(?,?)}";
DbDriverManager dbManager = DbDriverManager.getInstance(); conn = dbManager.getConnection(Constants.DATABASE);
try { cstmt = (OracleCallableStatement) conn.prepareCall(sql);
//定義oracle中的數組類型 desc = ArrayDescriptor.createDescriptor("IDARRAY", conn); bookIdArray = new ARRAY(desc, conn, bookIds);
cstmt.setObject(1, bookIdArray, oracle.jdbc.OracleTypes.ARRAY); cstmt.registerOutParameter(2, Types.INTEGER); cstmt.execute(); count = cstmt.getInt(2);
log.info(this.getClass() + ".checkBookStatus: count = " + count);
DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); } catch (SQLException e) {
log.error(this.getClass() + ".checkBookStatus-->SQLException: " + e.getMessage()); DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); throw new DataAccessException( "When check the books, there is a SQLException: " + e.getMessage(), e.getCause()); }
if (count > 0) {
flag = true; }
return flag; }
3. oracle中存儲過程怎麼定義一個數組
在PL/SQL中是沒有數組(Array)概念的。但是如果程序員想用Array的話,就得變通一下,用TYPE 和Table of Record來代替多維數組
4. oracle存儲過程有沒有對象的概念 就是在定義參數的時候能不能定義一個對象呢
你說一個對象 是一個類嘛 還是一個結果集。比如游標就算是滴,行對象讀取
--For 循環游標--(1)定義游標--(2)定義游標變數--(3)使用for循環來使用這個游標declare --類型定義
cursor c_job
is
select empno,ename,job,sal from emp where job='MANAGER';
--定義一個游標變數v_cinfo c_emp%ROWTYPE ,該類型為游標c_emp中的一行數據類型
c_row c_job%rowtype;
begin
for c_row in c_job
loop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
end;
5. oracle 存儲過程,如何傳入一個數組
這個是不行的,數組內容必須首先在存儲過程里定義好數組類型,然後給予定義好的數據類型定義數組型變數。存儲過程的入參是做不到的。一般情況下,採用字元串的方式,並給每項用特定的分隔符的方式傳入,然後在存儲過程中按照分隔符解析出每一項,插到存儲過程的定義的數組的每一項上去。