【问题标题】:How to loop through NESTED TABLE in ORACLE for Oracle Forms stored procedure based block?如何在 ORACLE 中循环 NESTED TABLE for Oracle Forms 基于存储过程的块?
【发布时间】:2026-02-12 01:15:01
【问题描述】:

我正在开发 Oracle Forms Builder 10g。在我的应用程序中,我有一个包含一堆 varchar2 的嵌套表类型。这是type my_type_1 is table of varchar2(255)。我在我的数据库中创建了相同的类型。

现在,我正在创建一个基于存储过程的表单。我想在body中传递一个my_type_1的变量是这样的:

procedure my_proc (my_var_in_out IN OUT some_type, my_var_test IN my_type_1) is

cursor my_cursor(id varchar2(255)) is
select name from emp where emp_id = id;

idx number := 1;

begin

for I in my_cursor(my_var_test )  loop <<< this is where I'm stuck. Can I pass it like that ?
   my_var_in_out (idx) := I;
   idx  := idx  +1;
end loop;
end;

【问题讨论】:

  • for r in (select Column_Value from table(cast(my_var_test as my_type_1))) loop dbms_output.put_line(r.column_value);结束循环;
  • 你可以像上面那样使用

标签: oracle plsql oracleforms


【解决方案1】:

你可以像下面这样循环它:

类型创建

  CREATE OR REPLACE TYPE my_type_1 IS TABLE OF VARCHAR2 (1000);
    /


    CREATE TABLE emp
    (
       fname    VARCHAR2 (100),
       emp_id   VARCHAR2 (10)
    );

SQL> select * from emp;

FNAME                                                                                                EMP_ID
---------------------------------------------------------------------------------------------------- ----------
XXX                                                                                                  1
YYY                                                                                                  2

程序

CREATE OR REPLACE PROCEDURE my_proc (my_var_test IN OUT my_type_1)
IS
   CURSOR my_cursor (my_var_test my_type_1)
   IS
      SELECT fname
        FROM emp
       WHERE emp_id MEMBER OF my_var_test; --<--This is how you implement in clause while using a collection

   v_var   my_type_1 := my_type_1 ();
BEGIN
   OPEN my_cursor (my_var_test);

   FETCH my_cursor BULK COLLECT INTO v_var;

   CLOSE my_cursor;

   FOR rec IN 1 .. v_var.COUNT
   LOOP         
      my_var_test (rec) := v_var (rec);         
   END LOOP;
END;

执行:

DECLARE
   var   my_type_1 := my_type_1 ();
BEGIN
   var.EXTEND(2);

   var (1) := '1';
   var (2) := '2';

   my_proc (MY_VAR_TEST => var);


   FOR i IN 1 .. var.COUNT
   LOOP
      DBMS_OUTPUT.put_line (var (i));
   END LOOP;
END;

输出:

SQL> /
XXX
YYY

PL/SQL procedure successfully completed.

【讨论】: