2014-04-07 91 views
1

問題關於PL/SQL集合:PL/SQL集合的限制 - 在比較到Java集合

我生成頻數分佈表中的工資數據爲HR員工表如下:

  1. 我創建一個表格類型class_intervals,其中包含emp_recstype 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; 

回答

0

可以使用

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

這是足以容納散列字符串,最多32千長度作爲指標。爲了循環這個集合,你需要首先使用,而不是最後的下一個循環。