设为首页 收藏本站
查看: 2052|回复: 0

[经验分享] Oracle索引表、集合 [实例]

[复制链接]

尚未签到

发表于 2016-7-19 09:56:05 | 显示全部楼层 |阅读模式
--索引表的用法
--使用binary_integer

declare
type ename_table_type is table of scott.emp.ename%type
      index by binary_integer;
type ehiredate_table_type is table of scott.emp.hiredate%type
       index by binary_integer;
ename_table ename_table_type;
ehiredate_table ehiredate_table_type;
begin
select ename,hiredate into ename_table(0),ehiredate_table(0) from scott.emp
where scott.emp.empno=7369;
dbms_output.put_line(ename_table(0));
dbms_output.put_line(to_char(ehiredate_table(0),'yyyy-mm-dd hh24:mi:ss'));
end;

-- 使用 varchar2 索引表时

DECLARE

TYPE area_table_type IS TABLE OF NUMBER INDEX BY varchar(20);
area_index_table area_table_type;
BEGIN

area_index_table('上海') :=1;
area_index_table('北京') :=2;
area_index_table('天津') :=3;
dbms_output.put_line('地点 : '|| area_index_table.first );
dbms_output.put_line('地点 : '|| area_index_table('北京') );
dbms_output.put_line('地点 : '|| area_index_table.last );
END;



--   使用 嵌套表
-- 索引表的类型不能作为表列的类型,而嵌套表的类型可以作为表列的类型
DECLARE
TYPE ename_table_type IS TABLE OF SCOTT.emp.ename%TYPE;
ename_nest_table ename_table_type;
BEGIN
ename_nest_table :=ename_table_type('dongguoh','hello','third','hello','third'); -- 要使用 嵌套表,必需先初始化,下标从 1 开始
SELECT ename INTO ename_nest_table(2) FROM SCOTT.emp WHERE empno=&no;
dbms_output.put_line('雇员名 : ' || ename_nest_table(2));
END;


-- 在表列中使用 嵌套表作为表中的一个成员,那么必需先创建这个被嵌套表的类型    ,p166

CREATE TYPE phone_type IS TABLE OF VARCHAR2(20);

CREATE TABLE employee (
id NUMBER (4),
name VARCHAR2(10),
sal NUMBER(6,2),
phone phone_type    -- 注意这句
) NESTED TABLE phone STORE AS phone_table;

--在 嵌套表中插入数据 如下
BEGIN
      INSERT INTO employee VALUES(1,'dongguoh2',1000,phone_type('0471-345678','34567976')); -- 注意这里
END;
   
   
   
    --在 嵌套表中 检索 数据 ,先定义变量接收数据 ,如下 P167

DECLARE
   phone_table phone_type ;
BEGIN
   SELECT phone INTO phone_table FROM employee WHERE id=1;
   For i IN 1..phone_table.COUNT LOOP
       dbms_output.put_line('电话号码为 : '|| phone_table(i));   
   END LOOP;
END ;


--更新嵌套表列的数据 ,定义 变量 ,并用构造方法初始化


DECLARE
   phone_table phone_type := phone_type('0872-567890','5678906789','5678-567895678','5678957895');
BEGIN
   phone_table(1) :='123456789';
   phone_table(2) :='987643';
   UPDATE employee SET phone=phone_table WHERE id=1;
END ;



-- 使用可变数组 VARRAY

DECLARE
   TYPE ename_table_type IS VARRAY(20) OF emp.ename%TYPE;
   ename_table ename_table_type :=ename_table_type('dong'); -- 必需初始化
BEGIN
   SELECT ename INTO ename_table(1) FROM emp WHERE empno=&no;
   dbms_output.put_line('名字为 : ' || ename_table(1));    -- 注意下标不要超出范围
END ;

-- 多维集合的应用 P169

DECLARE
   TYPE array1 IS VARRAY(20) OF INT ;
   TYPE array2 IS VARRAY(10) OF array1;
   
   towArray array2 :=array2(array1(100,101,102),
                            array1(201,202),
                            array1(301,302,303,304));
BEGIN
FOR i IN 1..towArray.COUNT LOOP
      FOR j IN 1..towArray(i).COUNT LOOP
          DBMS_OUTPUT.PUT_LINE('ARRAY( ' || i || ',' || j || ') = ' || towArray(i)(j));   -- 注意 towArray(i)(j) 的写法
      END LOOP;
END LOOP;

END;


SELECT * FROM emp;
-- PL/SQL 记录表

DECLARE
TYPE emp_table_type IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
emp_table emp_table_type;
CURSOR cur_emp_table(v_empno NUMBER) IS SELECT * FROM emp WHERE empno<v_empno;
v_incr INT :=1;
BEGIN
-- 用FOR 语句的时候 隐式
/*
FOR i_cur IN cur_emp_table(&no) LOOP
     emp_table(v_incr) :=i_cur;
     DBMS_OUTPUT.PUT_LINE('编号 :'|| emp_table(v_incr).empno || ' 名称 :' || emp_table(v_incr).ename);
     v_incr:=v_incr+1;     
END LOOP;
*/
-- 显示的 LOOP

/*
OPEN cur_emp_table(&no);
LOOP
       FETCH cur_emp_table INTO emp_table(v_incr);
       v_incr:=v_incr+1;     
       EXIT WHEN cur_emp_table%NOTFOUND;

END LOOP;
CLOSE cur_emp_table;
*/

OPEN cur_emp_table(&1);
    FETCH cur_emp_table INTO emp_table(v_incr);
     v_incr:=v_incr+1;
   
    while cur_emp_table%FOUND LOOP
       FETCH cur_emp_table INTO emp_table(v_incr);
       v_incr:=v_incr+1;      
    END LOOP;
CLOSE cur_emp_table;
DBMS_OUTPUT.PUT_LINE('emp_table.first:'|| emp_table.first || ' 名称 :' || emp_table.LAST || '   v_incr: ' ||   v_incr);
     
FOR i IN emp_table.first..emp_table.LAST LOOP -- 注意这里的范围,当你取出的数据为空的时候会报错
     DBMS_OUTPUT.PUT_LINE('编号 :'|| emp_table(i).empno || ' 名称 :' || emp_table(i).ename);
END LOOP;
END ;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-246157-1-1.html 上篇帖子: oracle常见缩写含义 下篇帖子: oracle 查询日期实用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表