【问题标题】:plsql table type with index of is complaining带有索引的plsql表类型正在抱怨
【发布时间】:2014-03-28 14:42:37
【问题描述】:

PL/SQL: 意图:我的意图是通过使用 key 作为employee_id 来访问定义为光标下方的员工元组对象。

问题:我创建了一个游标 - *l_employees_cur* 并想创建如下类型 *l_employees_t* 的类型表,如下所示,但编译器抱怨说 PLS-00315 实现限制不受支持的表索引类型。强>

CURSOR l_employees_cur
  IS
    SELECT employee_id,manager_id,first_name,last_name FROM employees;
type l_employees_t
IS
  TABLE OF l_employees_cur%rowtype INDEX BY employees.employee_id%TYPE;

employees.employee_id的定义是:

EMPLOYEE_ID    NUMBER(6) NOT NULL

为什么我不能这样做?还是我做错了什么。

【问题讨论】:

  • 我们可以退一步吗?您想用这种方法解决什么问题?
  • 我只是想知道像在其他编程语言中一样,我们是否可以通过查询 with 键来访问该值。

标签: oracle types plsql


【解决方案1】:

来自Oracle Documenation:

关联数组

关联数组(以前称为 PL/SQL 表或索引表)是一组键值对。每个键都是一个唯一的索引,用于定位关联值,语法为variable_name(index)。

索引的数据类型可以是字符串类型,也可以是PLS_INTEGER。索引是按排序顺序存储的,而不是按创建顺序存储的。对于字符串类型,排序顺序由初始化参数 NLS_SORT 和 NLS_COMP 决定。

【讨论】:

    【解决方案2】:

    我认为你的错误是plsql表的声明。

    为什么不试试下一个:

    type l_employees_t
    IS
      TABLE OF l_employees_cur%rowtype INDEX BY pls_integer;
    

    我还有一个问题要问你: 你上面的代码中EMPLOYEE_ID NOT NULL NUMBER(6)是什么意思?

    问候 卡洛斯

    【讨论】:

      【解决方案3】:

      在 PL/SQL 集合中存储和检索 SQL 查询输出

      OP 中的示例看起来很像 Oracle 的新示例 HR 数据模式。 (对于那些知道的老手,SCOTT-TIGER 数据模型的继承者)。此解决方案是在 Oracle 11g R2 实例上开发的。

      演示表设计 - EMP

      演示目标

      这个例子将展示如何从对象TYPE 定义创建一个PL/SQL 集合。复杂数据类型派生自以下游标定义:

       CURSOR l_employees_cur IS
          SELECT emp.empno as EMPLOYEE_ID, emp.mgr as MANAGER_ID, emp.ename as LAST_NAME
            FROM EMP;
      

      在将游标内容加载到索引集合变量后,存储过程的后半部分包含一个可选步骤,该步骤循环返回集合并通过DBMS_OUTPUT 或在另一个表上的 INSERT DML 操作显示数据.

      存储过程示例源代码

      这是用于查询演示表 EMP 的存储过程。

       create or replace procedure zz_proc_employee is
      
            CURSOR l_employees_cur IS
               SELECT emp.empno as EMPLOYEE_ID, emp.mgr as MANAGER_ID, emp.ename as LAST_NAME
                 FROM EMP;
       
            TYPE employees_tbl_type IS TABLE OF l_employees_cur%ROWTYPE INDEX BY PLS_INTEGER;  
      
            employees_rec_var   l_employees_cur%ROWTYPE;
            employees_tbl_var   employees_tbl_type;
      
            v_output_string     varchar2(80);
            c_output_template   constant   varchar2(80):= 
               'Employee: <<EMP>>; Manager: <<MGR>>; Employee Name: <<ENAME>>'; 
      
            idx       integer;
            outloop   integer;
      
       BEGIN
            idx:= 1;
            OPEN l_employees_cur;
            FETCH l_employees_cur INTO employees_rec_var;
      
               WHILE l_employees_cur%FOUND LOOP
              
               employees_tbl_var(idx):= employees_rec_var;
      
               FETCH l_employees_cur INTO employees_rec_var;        
      
               idx:= idx + 1;
            END LOOP;
      
            CLOSE l_employees_cur;
      
       -- OPTIONAL (below) Output Loop for Displaying The Array Contents
       -- At this point, employees_tbl_var can be handed off or returned
       -- for additional processing.
      
       FOR outloop IN 1 .. idx LOOP
            -- Build the output string: 
      
            v_output_string:= replace(c_output_template, '<<EMP>>', 
                to_char(employees_tbl_var(outloop).employee_id));
      
            v_output_string:= replace(v_output_string, '<<MGR>>', 
                to_char(employees_tbl_var(outloop).manager_id));
      
            v_output_string:= replace(v_output_string, '<<ENAME>>', 
                employees_tbl_var(outloop).last_name);
      
            -- dbms_output.put_line(v_output_string);
      
            INSERT INTO zz_output(output_string, output_ts)
                VALUES(v_output_string, sysdate);
      
            COMMIT;
      
       END LOOP;
      
       END zz_proc_employee;
      

      由于我无法控制的服务器配置问题,我注释掉了dbms_output 调用。输出表的备用insert 命令是一种直观地验证 EMP 表中的数据是否成功进入声明的集合变量的快速方法。

      解决方案的结果与讨论

      这是调用过程并查询输出表后的输出:

      虽然在 OP 的非常简洁的细节中并不清楚访问此表的实际目的,但我认为第一种方法是尝试了解使用集合和自定义数据类型来进行有效的数据提取和从诸如 PL/SQL 游标之类的结构中进行处理。

      这个示例过程的一部分非常可重用,初始步骤代表了一种制作和加载 PL/SQL 集合的工作方式。如果您注意到,即使您自己的 EMP 表版本不同,唯一需要重新定义的地方就是游标本身。

      从长远来看,使用类型、数组、嵌套表和其他集合类型实际上会简化工作,因为它们具有动态特性。

      【讨论】:

        猜你喜欢
        • 2019-05-23
        • 2017-04-05
        • 2015-07-02
        • 1970-01-01
        • 2021-02-21
        • 2021-01-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多