如何在 ORACLE 中循环 NESTED TABLE for Oracle Forms 基于存储过程的块?
How to loop through NESTED TABLE in ORACLE for Oracle Forms stored procedure based block?
我正在研究 Oracle Forms Builder 10g。在我的应用程序中,我有一个嵌套 table 类型,其中包含一堆 varchar2。是 type my_type_1 is table of 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;
你可以像下面这样循环:
创建类型
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.
我正在研究 Oracle Forms Builder 10g。在我的应用程序中,我有一个嵌套 table 类型,其中包含一堆 varchar2。是 type my_type_1 is table of 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;
你可以像下面这样循环:
创建类型
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.