不懂 你為什么要用集合接受起來
你所需要的網(wǎng)站建設服務,我們均能行業(yè)靠前的水平為你提供.標準是產(chǎn)品質(zhì)量的保證,主要從事成都做網(wǎng)站、網(wǎng)站建設、企業(yè)網(wǎng)站建設、手機網(wǎng)站制作設計、網(wǎng)頁設計、品牌網(wǎng)站設計、網(wǎng)頁制作、做網(wǎng)站、建網(wǎng)站。創(chuàng)新互聯(lián)公司擁有實力堅強的技術研發(fā)團隊及素養(yǎng)的視覺設計專才。
首先 你可以把
oracle
分組查新到的數(shù)據(jù)封裝成 一個bean 類
然后把bean類存到 list即可
可以用集合
一,index_by表
TYPE TYPE1 IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
1.使用的時候需要先賦值后讀取,至少也要先初期化一下,否則會出現(xiàn)異常:ORA-01403: no data found。
2.這種數(shù)組不需要事先指定上限,下標可以不連續(xù),可以是0或負數(shù)。
例:v1 TYPE1;
v1(-1) := '-1';
v1(0) := '0';
v1(1) := '1';
DBMS_OUTPUT.put_line(v1(-1)); --訪問合法
DBMS_OUTPUT.put_line(v1(2)); --訪問非法
二:
集合還有很多內(nèi)建函數(shù),這些函數(shù)稱為方法,調(diào)用方法的語法如下:
collection.method
下表中列出oracle中集合的方法
方法 描述 使用限制
COUNT 返回集合中元素的個數(shù)
DELETE 刪除集合中所有元素
DELETE(x) 刪除元素下標為x的元素,如果x為null,則集合保持不變 對VARRAY非法
DELETE(x,y) 刪除元素下標從X到Y(jié)的元素,如果XY集合保持不變 對VARRAY非法
EXIST(x) 如果集合元素x已經(jīng)初始化,則返回TRUE, 否則返回FALSE
EXTEND 在集合末尾添加一個元素 對Index_by非法
EXTEND(x) 在集合末尾添加x個元素 對Index_by非法
EXTEND(x,n) 在集合末尾添加元素n的x個副本 對Index_by非法
FIRST 返回集合中的第一個元素的下標號,對于VARRAY集合始終返回1。
LAST 返回集合中最后一個元素的下標號, 對于VARRAY返回值始終等于COUNT。
LIMIT 返回VARRY集合的最大的元素個數(shù),對于嵌套表和Index_by集合無用。
NEXT(x) 返回在元素x之后及緊挨著它的元素的值,如果該元素是最后一個元素,則返回null。
PRIOR(x) 返回集合中在元素x之前緊挨著它的元素的值,如果該元素是第一個元素,則返回null。
TRIM 從集合末端開始刪除一個元素 對index_by不合法
TRIM(x) 從集合末端開始刪除x個元素 對index_by不合法
============================================================================================================================================
三:舉例
包頭:
create or replace package part_version is
type t_part_id_array is table of part_family.part_id%type index by pls_integer
procedure sameold_part_family(p_part_id in t_sub_part_id_array,
v_out out varchar2);
end appendant_change_part_version;
包體
create or replace package body part_version is
procedure sameold_part_family(p_part_id in t_sub_part_id_array,
v_out out varchar2) is
v_count_old pls_integer;
v_count_min pls_integer;
begin
.....
end;
end appendant_change_part_version;
集合:是具有相同定義的元素的聚合。Oracle有兩種類型的集合:
可變長數(shù)組(VARRAY):可以有任意數(shù)量的元素,但必須預先定義限制值。
嵌套表:視為表中之表,可以有任意數(shù)量的元素,不需要預先定義限制值。
在PL/SQL中是沒有數(shù)組(Array)概念的。但是如果程序員想用Array的話,就得變通一下,用TYPE 和Table of Record來代替多維數(shù)組,一樣挺好用的。
emp_type 就好象一個table 中的一條record 一樣,里面有id, name,gender等。emp_type_array 象個table, 里面含有一條條這樣的record (emp_type),就象多維數(shù)組一樣。
--單維數(shù)組
DECLARE
TYPE emp_ssn_array IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
best_employees emp_ssn_array;
worst_employees emp_ssn_array;
BEGIN
best_employees(1) := '123456';
best_employees(2) := '888888';
worst_employees(1) := '222222';
worst_employees(2) := '666666';
FOR i IN 1..best_employees.count LOOP
DBMS_OUTPUT.PUT_LINE('i='|| i || ', best_employees= ' ||best_employees(i)
|| ', worst_employees= ' ||worst_employees(i));
END LOOP;
END;
--多維數(shù)組
DECLARE
TYPE emp_type IS RECORD
( emp_id employee_table.emp_id%TYPE,
emp_name employee_table.emp_name%TYPE,
emp_gender employee_table.emp_gender%TYPE );
TYPE emp_type_array IS TABLE OF emp_type INDEX BY BINARY_INTEGER;
emp_rec_array emp_type_array;
emp_rec emp_type;
BEGIN
emp_rec.emp_id := 300000000;
emp_rec.emp_name := 'Barbara';
emp_rec.emp_gender := 'Female';
emp_rec_array(1) := emp_rec;
emp_rec.emp_id := 300000008;
emp_rec.emp_name := 'Rick';
emp_rec.emp_gender := 'Male';
emp_rec_array(2) := emp_rec;
FOR i IN 1..emp_rec_array.count LOOP
DBMS_OUTPUT.PUT_LINE('i='||i
||', emp_id ='||emp_rec_array(i).emp_id
||', emp_name ='||emp_rec_array(i).emp_name
||', emp_gender = '||emp_rec_array(i).emp_gender);
END LOOP;
END;
-------------- Result --------------
i=1, emp_id =300000000, emp_name =Barbara, emp_gender = Female
i=2, emp_id =300000008, emp_name =Rick, emp_gender = Male
集合的用法也就是 索引表、嵌套表及數(shù)組(array)的用法,在網(wǎng)上搜搜語法吧。
需要用到動態(tài)sql。
1、首先要給用戶賦予權(quán)限:
grant create any table to 用戶名;
2、創(chuàng)建存儲過程:
create procedure p_create_table
(v_sql varchar2)--輸入建表語句
as
begin
execute immediate v_sql;
end;
3、執(zhí)行:
給你個范例:
CREATE OR REPLACE FUNCTION f_jax_str2tab(p_str IN VARCHAR2,
p_sep varchar2 default ','
) RETURN type_jax_varc2tab IS
/******************************************************************
Ver1.0 Created by jaxzhang on 2009-06-08
把字符串(1*2*3*4*5)轉(zhuǎn)換為內(nèi)存表形式
create or replace type type_jax_varc2tab is table of varchar2(2000);
測試用例:SELECT * FROM TABLE(f_jax_str2tab('1*2*3*4*5','*'));
******************************************************************/
v_str varchar2(2000);
v_cnt NUMBER ;
v_numtab type_jax_varc2tab := type_jax_varc2tab(); --返回內(nèi)存表
BEGIN
select decode(substr(p_str,-1),p_sep,p_str,p_str || p_sep) into v_str from dual;
select length(v_str) - length(REPLACE(v_str, p_sep)) into v_cnt from dual;
FOR i IN 1 .. v_cnt LOOP
v_numtab.EXTEND;
v_numtab(i) := substr(v_str, 1, instr(v_str, p_sep) - 1);
v_str := substr(v_str, instr(v_str,p_sep) + 1);
END LOOP;
RETURN v_numtab;
EXCEPTION
WHEN OTHERS THEN
v_numtab.DELETE;
END;