Oracle如何定義集合 oracle定義集合數(shù)組

如何在ORACLE中定義一個(gè)數(shù)組

集合:是具有相同定義的元素的聚合。Oracle有兩種類(lèi)型的集合:

專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)樂(lè)業(yè)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

可變長(zhǎng)數(shù)組(VARRAY):可以有任意數(shù)量的元素,但必須預(yù)先定義限制值。

嵌套表:視為表中之表,可以有任意數(shù)量的元素,不需要預(yù)先定義限制值。

在PL/SQL中是沒(méi)有數(shù)組(Array)概念的。但是如果程序員想用Array的話(huà),就得變通一下,用TYPE

和Table

of

Record來(lái)代替多維數(shù)組,一樣挺好用的。

emp_type

就好象一個(gè)table

中的一條record

一樣,里面有id,

name,gender等。emp_type_array

象個(gè)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

oracle怎么使用數(shù)組

除了構(gòu)造函數(shù)外,集合還有很多內(nèi)建函數(shù),這些函數(shù)稱(chēng)為方法。

調(diào)用方法的語(yǔ)法如下:

collection.method

下表中列出oracle中集合的方法

方法 描述 使用限制

COUNT 返回集合中元素的個(gè)數(shù)

DELETE 刪除集合中所有元素

DELETE() 刪除元素下標(biāo)為x的元素,如果x為null,則集合保持不變

對(duì)VARRAY非法

DELETE(,) 刪除元素下標(biāo)從X到Y(jié)的元素,如果XY集合保持不變

對(duì)VARRAY非法

EXIST() 如果集合元素x已經(jīng)初始化,則返回TRUE, 否則返回FALSE

EXTEND 在集合末尾添加一個(gè)元素

對(duì)Index_by非法

EXTEND() 在集合末尾添加x個(gè)元素

對(duì)Index_by非法

EXTEND(,) 在集合末尾添加元素n的x個(gè)副本

對(duì)Index_by非法

FIRST 返回集合中的第一個(gè)元素的下標(biāo)號(hào),對(duì)于VARRAY集合始終返回1。

LAST 返回集合中最后一個(gè)元素的下標(biāo)號(hào), 對(duì)于VARRAY返回值始終等于COUNT.

LIMIT 返回VARRY集合的最大的元素個(gè)數(shù),對(duì)于嵌套表和對(duì)于嵌套表和Index_by為null Index_by集合無(wú)用

NEXT() 返回在元素x之后及緊挨著它的元素的值,如果該元素是最后一個(gè)元素,則返回null.

PRIOR() 返回集合中在元素x之前緊挨著它的元素的值,如果該元素是第一個(gè)元素,則返回null。

TRI M 從集合末端開(kāi)始刪除一個(gè)元素

對(duì)于index_by不合法

TRIM() 從集合末端開(kāi)始刪除x個(gè)元素

對(duì)index_by不合法

使用實(shí)例:

Set serveroutput on

Declare

type my_text_table_type is table of

varchar2(200)

index by binary_integer;

l_text_table

my_text_table_type;

l_index number;

begin

for emp_rec in (select *

from emp) loop

l_text_table(emp_rec.empno):=emp_rec.ename;

end

loop;

l_index:= l_text_table.first;--使用first方法

loop

exit

when l_index is null;

dbms_output.put_line(l_index ||’:’||

l_text_table(l_index));

l_index :=l_text_table.next(l_index);

end loop;

end;

實(shí)例:

CREATE OR REPLACE PROCEDURE sample

is

TYPE

R_REC IS RECORD(INT NUMBER(6,2), CHR VARCHAR2(100));

TYPE T_REC IS

TABLE OF R_REC INDEX BY BINARY_INTEGER;

A_ZEI T_REC;

IX

NUMBER(10);

BEGIN

FOR IX IN 1..1000 LOOP

A_ZEI(IX).INT :=

IX;

A_ZEI(IX).CHR := TO_CHAR(A_ZEI(IX).INT,'9,999,999.99');

END

LOOP;

END;

CREATE OR REPLACE PROCEDURE P_EMP

IS

TYPE T_EMP

IS TABLE OF EMP%ROWTYPE INDEX BY BINARY_INTEGER;

A_EMP T_EMP;

I

BINARY_INTEGER := 0;

BEGIN

FOR REC IN (SELECT EMPNO,ENAME FROM EMP)

LOOP

I := I + 1;

A_EMP(I).EMPNO := REC.EMPNO;

A_EMP(I).ENAME := REC.ENAME;

END LOOP;

FOR K IN 1..I LOOP

DBMS_OUTPUT.PUT_LINE( A_EMP(K).EMPNO || ' ' || A_EMP(K).ENAME);

END

LOOP;

END;

集合:是具有相同定義的元素的聚合。Oracle有兩種類(lèi)型的集合:

可變長(zhǎng)數(shù)組(VARRAY):可以有任意數(shù)量的元素,但必須預(yù)先定義限制值。

嵌套表:視為表中之表,可以有任意數(shù)量的元素,不需要預(yù)先定義限制值。

在PL/SQL中是沒(méi)有數(shù)組(Array)概念的。但是如果程序員想用Array的話(huà),就得變通一下,用TYPE 和Table of

Record來(lái)代替多維數(shù)組,一樣挺好用的。

emp_type 就好象一個(gè)table 中的一條record 一樣,里面有id, name,gender等。emp_type_array 象個(gè)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

用下面語(yǔ)句聲明數(shù)組類(lèi)型

type intarray is varry(30) of integer;

用下面語(yǔ)句聲明一個(gè)數(shù)組變量

declare

A intarray;用下面語(yǔ)句聲明數(shù)組類(lèi)型

type intarray is varry(30) of integer;

用下面語(yǔ)句聲明一個(gè)數(shù)組變量

declare

A intarray;用下面語(yǔ)句聲明數(shù)組類(lèi)型

type intarray is varry(30) of integer;

用下面語(yǔ)句聲明一個(gè)數(shù)組變量

declare

A intarray;

Oracle中存儲(chǔ)過(guò)程返回自定義的集合類(lèi)型,Java中使用mybatis返回List集合類(lèi)型

存儲(chǔ)過(guò)程我不太熟,給你一個(gè)調(diào)用儲(chǔ)存過(guò)程mybatis的實(shí)例參考:

mapper?namespace="entity.puserMapper"

!--?調(diào)用存儲(chǔ)過(guò)程--

select?id="getCount"?parameterMap="getUserCountMap"?statementType="CALLABLE"

CALL?mybaits.ges_user_count(?,?)

/select

parameterMap?type="java.util.Map"?id="getUserCountMap"

parameter?property="sexid"?mode="IN"?jdbcType="INTEGER"/

parameter?property="usercount"?mode="OUT"?jdbcType="INTEGER"/

/parameterMap

/mapper

主要是定義好parameterMap就行了

如何在Oracle中用GROUPING SETS分組自定義匯總

GROUP BY中每個(gè)唯一的列組合生成一個(gè)總數(shù),但這些總數(shù)不會(huì)“累加”到更高一級(jí)的總數(shù)中。要實(shí)現(xiàn)這一點(diǎn),你可以用GROUP BY ROLLUP或GROUP BY CUBE替代GROUP BY,不過(guò)它們會(huì)生成所有可能的總數(shù),而你可能不需要全部總數(shù)。對(duì)GROUP BY CUBE而言,將會(huì)生成2^n組總數(shù),這里的n是GROUP BY中列的數(shù)目。查看下面的查詢(xún),它使用了SH樣本模式:SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)FROM salesWHERE cust_id 3GROUP BY CUBE (prod_id, cust_id, channel_id)這將生成8組總數(shù):所有行的總和每個(gè)通道,包括所有產(chǎn)品和顧客每個(gè)顧客,包括所有產(chǎn)品和通道每項(xiàng)產(chǎn)品,包括所有顧客和通道每個(gè)通道/顧客組合,包括所有產(chǎn)品每個(gè)通道/產(chǎn)品組合,包括所有顧客每個(gè)產(chǎn)品/顧客組合,包括所有通道每個(gè)產(chǎn)品、顧客和通道組合可能的組合非常多。GROUP BY CUBE中每增加一列,生成的總數(shù)就會(huì)翻一番??梢杂肎ROUP BY GROUPING SETS來(lái)代替GROUP BY CUBE。你可以應(yīng)用來(lái)指定你感興趣的總數(shù)組合。因?yàn)樗槐赜?jì)算它不需要集合(也不會(huì)產(chǎn)生太多結(jié)果),所以對(duì)SQL引擎來(lái)說(shuō)更為高效。其格式為:GROUP BY GROUPING SETS ((list), (list) ... )這里(list)是圓括號(hào)中的一個(gè)列序列,這個(gè)組合生成一個(gè)總數(shù)。要增加一個(gè)總和,必須增加一個(gè)(NUlL)分組集。例如,如果只要生成每項(xiàng)產(chǎn)品(包括所有顧客和通道)和每個(gè)顧客/通道組合(包括所有產(chǎn)品)的總數(shù),可以輸入:SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)FROM salesWHERE cust_id 3GROUP BY GROUPING SETS ((prod_id), (cust_id, channel_id));這種方法將這個(gè)數(shù)據(jù)集生成的總數(shù)數(shù)量從180個(gè)減少到37個(gè),并幫助你著重回答你希望解答的問(wèn)題。

如何定義一個(gè)集合,集合中元素為指定數(shù)據(jù)

1、定義一個(gè)set對(duì)象 Set h=new HashSet();2、往set中添加數(shù)據(jù) h.add("1st");//往里添加一個(gè)字符串Set是最簡(jiǎn)單的一種集合。集合中的對(duì)象不按特定的方式排序,并且沒(méi)有重復(fù)對(duì)象。 Set接口主要實(shí)現(xiàn)了兩個(gè)實(shí)現(xiàn)類(lèi): HashSet : HashSet類(lèi)按照哈希算法.

oracle 集合使用

給你個(gè)范例:

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);

測(cè)試用例: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;

網(wǎng)站題目:Oracle如何定義集合 oracle定義集合數(shù)組
標(biāo)題鏈接:http://www.muchs.cn/article20/hhioco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站制作、網(wǎng)站制作、做網(wǎng)站、微信小程序、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司