当前位置: 首页 > 知识库问答 >
问题:

如何循环通过嵌套表在ORACLE为Oracle窗体存储过程基于块?

郭子航
2023-03-14

我正在开发Oracle Forms Builder 10g。在我的应用程序中,我有一个嵌套的表类型,其中包含一堆varchar2。它是类型my\u type\u 1是varchar2(255)的表。我在数据库中创建了相同的类型。

现在,我正在创建一个基于存储过程的表单。我想传递一个变量的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;

共有1个答案

姬向明
2023-03-14

您可以像下面这样循环:

创建的类型

  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.
 类似资料:
  • 如何使用表(X)作为输入参数编写Oracle存储过程,并且在过程中使用表X与另一个表Y联接? 表X将有数千条记录。 不希望将表名传递为varchar,然后使用动态SQL(因此,此选项不在画面中)

  • 我可以在Oracle中通过ODBC执行一批存储过程吗?存储过程具有我使用参数标记绑定的输入参数。 在SQLServer中,我有这个功能,在DB2中,我只能进行批处理插入/更新,但我不能从ODBC/C代码批处理存储过程。 Oracle似乎支持插入语句的批处理,如果使用JDBC,也可以批处理存储过程。 是否可以做同样的事情,但使用对存储过程和ODBC的调用? 谢谢

  • 问题内容: 简而言之:我正在尝试在Entity Framework中运行Oracle存储过程(我知道这听起来很奇怪,但是在一般应用程序中使用Entity Framework,但是由于修改密钥的限制,EF无法处理此特定命令。值)。 过程具有一些参数(仅IN),并更新表中的值。我通过运行测试了它: 它工作正常。 我的参数定义如下: 我的查询是: 我正在尝试从C#代码执行它。即通过运行: 我收到错误OR

  • 下面是我的Oracle存储过程, 我得到以下异常:hibernate:{CALL REPORT_HIBERNATE(?)}org.hibernate.exception.GenericJDBcException:无法执行查询...并且由:java.sql.sqlException:无效的列索引引起 Plz让我知道在Spring中我将如何使用Hibernate注释调用这个存储过程??

  • 本文向大家介绍asp.net中oracle 存储过程(图文),包括了asp.net中oracle 存储过程(图文)的使用技巧和注意事项,需要的朋友参考一下 在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。 ORACLE代码 C#代码 调用方法 以上内容是通过代码介绍了asp.net中oracle存储过程。 接下来通过第二种的方式

  • 我一直试图使用Hibernate执行Oracle存储过程。这不是用于生产,而是用于我正在研究的Java源代码解析项目。简单地说,我不能从Oracle存储过程返回值。 我搜索并阅读了SO、Hibernate Community/Documentations(原生SQL章节)链接中的所有相关链接,并尝试了这些建议,但不知何故无法让它们发挥作用。以下是我的来源--我只包括相关的部分。