博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PL/SQL数组 二
阅读量:2505 次
发布时间:2019-05-11

本文共 3894 字,大约阅读时间需要 12 分钟。

使用字符串索引的关联数组的一个有趣的特性是它们自动地通过当前的国际语言支持(NLS)设置排序。FIRSTLAST函数返回数组中以字典序排列的第一个和最后一个健值。NEXTPRIOR允许你以字典序获取下一个和前一个键。

  

  set serveroutput on

  declare

   type valtbl is table of varchar2(50) index by varchar2(50);

   mytbl valtbl;

   key varchar2(50);

  begin

   mytbl('b') := 'two';

   mytbl('a') := 'one';

   mytbl('c') := 'three';

   key := mytbl.first;

   while key is not null loop

   dbms_output.put_line(mytbl(key));

   key := mytbl.next(key);

   end loop;

  end;

  /

  

  因为Oracle可以自动地将任何的数据类型转换为字符串类型,所以能以字符串作为索引意味着可以以任何数据类型作为索引。你可以使用这个方法把日期、浮点值、行二进制值和对象引用作为索引。

  

  set serveroutput on

  declare

   type timetbl is table of integer index by varchar2(8);

   mytbl timetbl;

   key varchar2(50);

  begin

   for row in (select * from emp) loop

   key := to_char(row.hiredate,'YYYYMMDD');

   if not mytbl.exists(key) then

   mytbl(key) := 0;

   end if;

   mytbl(key) := mytbl(key) + 1;

   end loop;

   dbms_output.put_line('hiring barchart:');

   dbms_output.put_line('----------------');

   key := mytbl.first;

   while key is not null loop

   dbms_output.put_line(

   to_char(to_date(key,'YYYYMMDD'),'DD MON, YYYY')

   ||': '||rpad('#',mytbl(key),'#'));

   key := mytbl.next(key);

   end loop;

  end;

  /

  

  键值必须是唯一的并且是大小写敏感的。在运行时改变NLS值可能会产生运行时错误。对于关联数组的每一个操作NLS设置必须保持相同。

  

  关联数组必须在PL/SQL代码中手工建立。其它的程序开发语言和接口不能把主机数组绑定到并联数组,所以你就不能用字符串索引的关联数组使用BULK COLLECT

 

 

 

DECLARE

   -- Local variables here

   ID VARCHAR2(20) := '9020071025101010';

   TEMPID VARCHAR2(20) := '';

    --定义VARCHAR2的数组以及大小

   TYPE ARRSYVAR IS VARRAY(2) OF VARCHAR2(30);

   ARRAYPARA ARRSYVAR; --数组变量

 BEGIN

   -- Test statements here

   ARRAYPARA := ARRSYVAR('1234567', '2345678'); --数组初始化

   FOR K IN 1 .. 2 LOOP

     -- calculate pi with 100 terms

     TEMPID := ID || TO_CHAR(K);

     INSERT INTO TI_ORDER_CD  (ORDERID,MSISDN,SWITCHID,PRIORITY,STATE,CREATE_TIME)

     VALUES(TEMPID,ARRAYPARA(K),'PHS','0','K',SYSDATE);

     INSERT INTO TI_ORDER_SERV_CD(ORDERID, SERVID, SERVCODE) VALUES(TEMPID, '0', 'CG001');

     INSERT INTO TI_ORDER_VAR_CD(ORDERID, PARACODE, PARAVALUE) VALUES(TEMPID, 'X009', ARRAYPARA(K)); --数组取值

   END LOOP;

 END;

 

 

中的数组的使用 (单维和多维)

 

因为在PL/SQL 中并没有数组, 只好用TYPE.  以下是 我查资料找的范例和自己写的范例.

---------------------- 单维数组 ------------------------

 

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;

 

---------------------- 多维数组 ------------------------

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

 

:在PL/SQL 中是没有数组(Array) 概念的. 但是如果程序员想用Array 的话, 就得变通一下, TYPE Table of Record 来代替多维数组, 一样挺好用的。

emp_type 就好象一个table 中的一条record 一样, 里面有id, name,gender等。emp_type_array 象个table, 里面含有一条条这样的record (emp_type),就象多维数组一样。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12330444/viewspace-448415/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12330444/viewspace-448415/

你可能感兴趣的文章
NGINX、PHP-FPM开机自动启动
查看>>
python 递归求阶乘
查看>>
ERROR: child process failed, exited with error number 100
查看>>
Java计算器源代码
查看>>
SQLServer视图
查看>>
《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型...
查看>>
入门阶段
查看>>
游戏制作人的职能
查看>>
学生信息管理系统应用ios源码iPad版
查看>>
Android中使用http协议访问网络
查看>>
ASP.NET Core 菜鸟之路:从Startup.cs说起
查看>>
vs win32 & MFC 指针默认位置
查看>>
Join 与 CountDownLatch 之间的区别
查看>>
js存cookie
查看>>
vc6下dll调试
查看>>
Ubuntu apt常用命令
查看>>
struts2 配置(部分)
查看>>
python代码迷之错误(ModuleNotFoundError: No module named 'caffe.proto')
查看>>
nodejs adm-zip 解压文件 中文文件名乱码 问题解决
查看>>
阿里程序员:我年薪260万+3000万期权,协和医生一辈子都赚不到
查看>>