/*
PL/SQL集合
1.
RECORD
由单行多列的标量构成的复合结构。可以看做是一种用户自定义数据类型。
01.TYPE t_emp IS RECORD( 其中TYPE,IS,RECORD为关键字,record_name为变量名称
field1 type [NOT NULL][:=expr1], 每个等价的成员间用逗号分隔
field2 type [NOT NULL][:=expr2], 如果一个字段限定NOT NULL,那么它必须拥有一个初始值
fieldn type [NOT NULL][:=exprn] 所有没有初始化的字段都会初始为NULL
)
2.
%ROWTYPE
返回一个基于数据库定义的类型
3.TABLE 类型
TYPE tabletype IS TABLE OF type(类型名,要保存成的数据类型) INDEX BY BINARY_INTEGER
*/
---------RECORD 实验---------------------------------------------------------------------
CREATE TABLE USERS(ID NUMBER(4),LOGIN NUMBER(4),NAME VARCHAR2(10));
INSERT INTO USERS VALUES(1,1,'1');
INSERT INTO USERS VALUES(12,12,'12');
INSERT INTO USERS VALUES(11,11,'11');
INSERT INTO USERS VALUES(14,14,'14');
INSERT INTO USERS VALUES(15,15,'15');
COMMIT;
--存储过程
CREATE OR REPLACE PROCEDURE TEST_RECORD AS
TYPE USER_RECORD_TYPE IS RECORD(
MYID USERS.ID%TYPE,--[变量名] [表名.字段名] [%TYPE],表示变量具有与数据库的表中某一字段相同的类型
MYLOGIN USERS.LOGIN%TYPE,
MYNAME USERS.NAME%TYPE);
U_R_T USER_RECORD_TYPE;
BEGIN
FOR RECD IN (SELECT * FROM USERS) LOOP
SELECT ID, LOGIN, NAME INTO U_R_T FROM USERS WHERE ID = RECD.ID;
DBMS_OUTPUT.put_line('ID:' || U_R_T.MYID || ',LOGIN_ID:' ||
U_R_T.MYLOGIN || ',NAME:' || U_R_T.MYNAME);
END LOOP;
END;
--打印结果
admin@ORCL> EXEC TEST_RECORD;
ID:15,LOGIN_ID:15,NAME:15
ID:1,LOGIN_ID:1,NAME:1
ID:12,LOGIN_ID:12,NAME:12
ID:11,LOGIN_ID:11,NAME:11
ID:14,LOGIN_ID:14,NAME:14
PL/SQL 过程已成功完成。
--使用一下 ROWTYPE
CREATE OR REPLACE PROCEDURE TEST_RECORD AS
U_R_T USERS%ROWTYPE;--相当于RECORD的简化版,集合的属性直接根据表结构来定
BEGIN
FOR RECD IN (SELECT * FROM USERS) LOOP
SELECT ID, LOGIN, NAME INTO U_R_T FROM USERS WHERE ID = RECD.ID;
DBMS_OUTPUT.put_line('ID:' || U_R_T.ID || ',LOGIN_ID:' ||
U_R_T.LOGIN || ',NAME:' || U_R_T.NAME);
END LOOP;
END;
--打印结果
admin@ORCL> exec TEST_RECORD;
ID:15,LOGIN_ID:15,NAME:15
ID:1,LOGIN_ID:1,NAME:1
ID:12,LOGIN_ID:12,NAME:12
ID:11,LOGIN_ID:11,NAME:11
ID:14,LOGIN_ID:14,NAME:14
PL/SQL 过程已成功完成。
--再来看个调用输出的过程
CREATE OR REPLACE PROCEDURE TEST_RECORD (VAL_RETURN OUT USERS%ROWTYPE)AS
U_R_T USERS%ROWTYPE;--相当于RECORD的简化版,集合的属性直接根据表结构来定
BEGIN
SELECT ID, LOGIN, NAME INTO U_R_T FROM USERS WHERE ID = 12;
VAL_RETURN := U_R_T;
END;
admin@ORCL> DECLARE
2 ID USERS%ROWTYPE;
3 BEGIN
4 TEST_RECORD(ID);
5 DBMS_OUTPUT.PUT_LINE('ID IS: '||ID.ID||',NAME IS: '||ID.NAME);
6 END;
7 /
ID IS: 12,NAME IS: 12
PL/SQL 过程已成功完成。
---------TABLE 实验------------------------------------------------------------------
DECLARE
TYPE T_TAB IS TABLE OF USERS%ROWTYPE;
V_TAB T_TAB;
I INT := 0;
V_COUNT INT := 0;
BEGIN
V_TAB := T_TAB(); --用不带参数的构造函数初始化一个空表,这个步骤为必须。否者会报错 ORA-06531: 引用未初始化的收集
DBMS_OUTPUT.PUT_LINE('表USERS共有' || V_COUNT || '条记录');
FOR REC IN (SELECT * FROM USERS) LOOP
I := I + 1;
V_TAB.EXTEND; --增加一条空表
SELECT * INTO V_TAB(I) FROM USERS WHERE ID = REC.ID;
END LOOP;
V_COUNT := V_TAB.COUNT;
DBMS_OUTPUT.PUT_LINE('元素个数' || V_COUNT);
DBMS_OUTPUT.PUT_LINE('第一个元素' || V_TAB.FIRST);
DBMS_OUTPUT.PUT_LINE('最后一个元素' || V_TAB.LAST);
FOR N IN 1 .. V_COUNT LOOP
DBMS_OUTPUT.PUT_LINE(V_TAB(N).ID || ',' || V_TAB(N).LOGIN);
END LOOP;
DBMS_OUTPUT.PUT_LINE('---------------------------');
END;
/
表USERS共有0条记录
元素个数5
第一个元素1
最后一个元素5
10,10
15,15
12,12
11,11
14,14
---------------------------
PL/SQL 过程已成功完成。
--------REF CURSOR实验-----------------------------------------------------------------
http://wenku.baidu.com/view/dd3d0e305a8102d276a22f5a.html
-------TABLE 集合-------------------------------------------------------------------
http://www.cnblogs.com/JavaCharp/archive/2010/03/26/1697266.html