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

[经验分享] 11.PL_SQL——PL_SQL中的复合数据类型之COLLECTION(联合数组(Associative Arrays))

[复制链接]

尚未签到

发表于 2018-10-24 06:58:51 | 显示全部楼层 |阅读模式
DSC0000.jpg

DSC0001.png

DSC0002.jpg

DSC0003.png

  SQL> edit
  DECLARE
  TYPE list_of_names_t IS TABLEOF employees.first_name%TYPE
  INDEX BY PLS_INTEGER;
  happyfamily list_of_names_t;
  l_row PLS_INTEGER;
  BEGIN
  happyfamily(2020202020) :='Eli';
  happyfamily(-15070) :='Steven';
  happyfamily(-90900) :='Chris';
  happyfamily(88) := 'Veva';
  l_row := happyfamily.FIRST;
  WHILE (l_row IS NOT NULL)
  LOOP
  DBMS_OUTPUT.PUT_LINE(l_row|| '-->' || happyfamily(l_row));
  l_row :=happyfamily.NEXT(l_row);
  END LOOP;
  l_row := 88;
  IF happyfamily.EXISTS(l_row)THEN
  DBMS_OUTPUT.PUT_LINE(' Itis here! --> ' || happyfamily(l_row));
  ELSE
  DBMS_OUTPUT.PUT_LINE(' Itis not here! --> ' || happyfamily(l_row));
  END IF;
  END;
  /
  SQL> @notes/s44.sql
  -90900-->Chris
  -15070-->Steven
  88-->Veva
  2020202020-->Eli
  It is here! --> Veva
  PL/SQLprocedure successfully completed
DSC0004.png

DSC0005.jpg

  ================Example1=================
  SQL> edit
  DECLARE
  TYPE dept_table_type IS TABLEOF
  departments%ROWTYPE INDEXBY PLS_INTEGER;
  dept_tabledept_table_type;
  -- Each element ofdept_table is a record
  BEGIN
  SELECT * INTO dept_table(1)
  FROM departments
  WHERE department_id = 10;
  DBMS_OUTPUT.PUT_LINE(dept_table(1).department_id ||' ' ||dept_table(1).department_name ||' '||
  dept_table(1).manager_id);
  END;
  /
  SQL> @notes/s45.sql
  10 Administration 200
  PL/SQL procedure successfully completed.
  ================Example2=================
  SQL> edit
  DECLARE
  TYPE emp_table_type IS TABLEOF
  employees%ROWTYPE INDEX BYPLS_INTEGER;
  my_emp_tableemp_table_type;
  max_count NUMBER(3) :=104;
  BEGIN
  FOR i IN 100..max_count
  LOOP
  SELECT * INTOmy_emp_table(i)
  FROM employees
  WHERE employee_id = i;
  END LOOP;
  FOR i INmy_emp_table.FIRST..my_emp_table.LAST
  LOOP
  DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);
  END LOOP;
  END;
  /
  SQL> @notes/s46.sql
  King
  Kochhar
  De Haan
  Hunold
  Ernst
  PL/SQLprocedure successfully completed
DSC0006.jpg

  SQL> edit
  DECLARE
  SUBTYPE location_t ISVARCHAR2(64);
  TYPE population_type IS TABLEOF NUMBER
  INDEX BY location_t;
  l_country_populationpopulation_type;
  l_count PLS_INTEGER;
  l_location location_t;
  BEGIN
  l_country_population('GreenLand') := 100000;
  l_country_population('USA') :=300000000;
  l_country_population('IceLand') := 750000;
  l_country_population('Australia') := 23000000;
  l_country_population('usa') :=400000000;
  l_count :=l_country_population.COUNT;
  DBMS_OUTPUT.PUT_LINE('COUNT =' || l_count);
  l_location :=l_country_population.FIRST;
  DBMS_OUTPUT.PUT_LINE('FirstRow = ' || l_location);
  DBMS_OUTPUT.PUT_LINE('Firstvalue = ' || l_country_population(l_location));
  l_location :=l_country_population.LAST;
  DBMS_OUTPUT.PUT_LINE('LastRow = ' || l_location);
  DBMS_OUTPUT.PUT_LINE('Last Value = ' ||l_country_population(l_location));
  END;
  /
  SQL> @notes/s47.sql
  COUNT = 5
  First Row = Australia
  First value = 23000000
  Last Row = usa
  Last Value = 400000000
  PL/SQLprocedure successfully completed
DSC0007.jpg

DSC0008.png

  SQL> edit
  DECLARE
  TYPEpopulation_type IS TABLE OF NUMBER
  INDEX BYVARCHAR2(64);
  city_populationpopulation_type;
  i VARCHAR2(64);
  BEGIN
  city_population('Smallville') := 2000;
  city_population('Midland') := 75000;
  city_population('Megalopolis') := 1000000;
  -- Change valueassocaited with key 'Samllville':
  city_population('Smallville'):= 2001;
  -- Print associatearray:
  i :=city_population.FIRST;
  -- Get the firstelement of array
  WHILE i IS NOTNULL
  LOOP
  DBMS_OUTPUT.PUT_LINE('Popultaion of ' || i || ' is ' ||city_population(i));
  i := city_population.NEXT(i);
  -- Get thenext element of array
  END LOOP;
  END;
  /
  SQL> @notes/s48.sql
  Popultaion of Megalopolis is 1000000
  Popultaion of Midland is 75000
  Popultaion of Smallville is 2001
  PL/SQLprocedure successfully completed
DSC0009.png

  ================Example3=================
  SQL> edit
  DECLARE
  TYPEemp_table_type IS TABLE OF
  employees%ROWTYPE INDEX BY PLS_INTEGER;
  my_emp_tableemp_table_type;
  max_countNUMBER(3) := 104;
  BEGIN
  FOR i IN100..max_count
  LOOP
  SELECT * INTOmy_emp_table(i)
  FROM employees
  WHEREemployee_id = i;
  END LOOP;
  FOR i INmy_emp_table.FIRST..my_emp_table.LAST
  LOOP
  DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);
  END LOOP;
  END;
  /
  SQL> @notes/s49.sql
  King
  Kochhar
  De Haan
  Hunold
  Ernst
  PL/SQL procedure successfully completed.
  ================Example4=================
  SQL> edit
  DECLARE
  SUBTYPE name_t ISVARCHAR2(32);
  TYPE lookup_t IS TABLE OFname_t INDEX BY PLS_INTEGER;
  name_tab        lookup_t;
  name    name_t := 'Frank';
  l_index PLS_INTEGER;
  l_found BOOLEAN := FALSE;
  BEGIN
  -- Populate the lookup table first
  name_tab(0) := 'Wiley';
  name_tab(1) := 'Mickey';
  name_tab(2) := 'Simon';
  name_tab(3) := 'Neal';
  name_tab(4) := 'Frank';
  name_tab(5) := 'Darius';
  name_tab(6) := 'Patrick';
  -- Lookup the name in the lookup table
  l_index := name_tab.FIRST;
  LOOP
  IF l_index IS NULL THEN
  EXIT;
  END IF;
  IF name =name_tab(l_index) THEN
  l_found :=TRUE;
  EXIT;
  END IF;
  l_index := name_tab.NEXT(l_index);
  END LOOP;
  IF l_found THEN
  DBMS_OUTPUT.PUT_LINE('I found it: ' || l_index || ' --> ' || name);
  ELSE
  DBMS_OUTPUT.PUT_LINE('I cannot find it. Sorry!');
  END IF;
  END;
  /
  SQL> @notes/s50.sql
  I found it: 4 --> Frank
  PL/SQL procedure successfully completed.
  ================Example5=================
  SQL> edit
  DECLARE
  SUBTYPE name_t ISVARCHAR2(32);
  SUBTYPE value_t IS VARCHAR2(32);
  TYPE lookup_t IS TABLE OFvalue_t INDEX BY name_t;
  name_tab        lookup_t;
  name    name_t := 'Frank';
  BEGIN
  -- Populate the lookup table first
  name_tab('Wiley') := 'Wu';
  name_tab('Mickey') := 'Wu';
  name_tab('Simon') :='Beaker';
  name_tab('Neal') :='Caffery';
  name_tab('Frank') :='Zhou';
  name_tab('Darius') :='Florizk';
  name_tab('Patrick') :='Jane';
  -- Lookup the name in the lookup table
  IFname_tab.EXISTS(name) THEN
  DBMS_OUTPUT.PUT_LINE('I found it: ' || name || ' --> ' ||name_tab(name));
  ELSE
  DBMS_OUTPUT.PUT_LINE('I cannot find it. Sorry!');
  END IF;
  END;
  /
  SQL> @notes/s51.sql
  I found it: Frank --> Zhou
  PL/SQLprocedure successfully completed
DSC00010.png

DSC00011.png

DSC00012.png

DSC00013.png



运维网声明 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-625608-1-1.html 上篇帖子: 10.PL_SQL——PL_SQL中的复合数据类型之RECORDS 下篇帖子: 12.PL_SQL——游标CURSOR
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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