【问题标题】:pl/sql collections limitations - in comparision to java collectionspl/sql 集合限制 - 与 java 集合相比
【发布时间】:2014-05-19 21:29:53
【问题描述】:

关于 pl/sql 集合的问题:

我正在为hr员工表生成工资数据的频率分布表,如下所示:

  1. 我正在创建一个表类型class_intervals,它包含低频、高频和包含emp_recs 的表,用于type emp_recs_tb

现在要插入class_intervals,我必须从class_intervals 获取上面生成的相应范围条目。

我该怎么做?

在 java 中,我们有 HashTable,因为我可以查询哈希表以获取密钥。我应该如何在 pl/sql 中实现同样的效果。

而且我大部分时间都受到限制,因为我不能将index of 用于任何对象,因为它限制了我的 pls_integer。

请添加您的想法。

CREATE OR replace PROCEDURE Hr_stat_ci
AS

  CURSOR emp_cur IS
    SELECT first_name,
           salary
    FROM   employees;

  emps            emp_cur%ROWTYPE;
  min_sal         NUMBER(8, 2);
  count_sals      NUMBER;
  max_sal         NUMBER(8, 2);
  avg_sal         NUMBER(8, 2);
  sal_range       NUMBER(8, 2);

  TYPE emp_rec_t IS RECORD (
    emp_name employees.first_name%TYPE,
    emp_sal employees.salary%TYPE);
  emp_record      EMP_REC_T;

  TYPE emp_recs_tb
    IS TABLE OF EMP_REC_T INDEX BY PLS_INTEGER;

  TYPE ci_rec_t IS RECORD (
    ci_low NUMBER(8, 2),
    ci_high NUMBER(10, 2),
    employee EMP_REC_T);
  class_interval  CI_REC_T;

  TYPE ci_table_tb
    IS TABLE OF CI_REC_T INDEX BY PLS_INTEGER;
  class_intervals CI_TABLE_TB;

  i               NUMBER := 1;
BEGIN
    SELECT Min(salary),
           Max(salary),
           Avg(salary),
           Count(salary)
    INTO   min_sal, max_sal, avg_sal, count_sals
    FROM   employees;

    sal_range := max_sal - min_sal / count_sals;

    dbms_output.Put_line('employee details');

    FOR i IN 1..count_sals LOOP
        class_interval.ci_low := min_sal;

        class_interval.ci_high := min_sal + sal_range;

        min_sal := class_interval.ci_high;

        Class_intervals(i) := class_interval;
    END LOOP;

END hr_stat_ci;  

【问题讨论】:

    标签: oracle collections plsql


    【解决方案1】:

    你可以使用

     TYPE <your_array> IS TABLE OF <your base type> INDEX BY VARCHAR2(32767);
    

    这足以保存长达 32 K 长度的哈希字符串作为索引。要循环这个集合,你需要使用 first-while not last-next 循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多