有人可以告诉我这有什么问题吗我收到消息说 p_var 必须声明 我需要在参数列表中传递数据数组
CREATE OR REPLACE PACKAGE TEST_PKG
IS
type rec_type is RECORD
(
p_var1 varchar2(1),
p_var2 varchar2(2)
);
type rec_array is varray(50) of rec_type;
PROCEDURE TEST_PROC (
p_proc1 IN VARCHAR2,
p_proc2 IN VARCHAR2,
p_var_type IN rec_array
);
END TEST_PKG;
/
CREATE OR REPLACE PACKAGE BODY SICMA."TEST_PKG"
IS
PROCEDURE TEST_PROC (
p_proc1 IN VARCHAR2,
p_proc2 IN VARCHAR2,
p_var_type IN rec_array
)
IS
v_nombre NUMBER;
v_var1 VARCHAR2(2);
v_var2 VARCHAR2(2);
BEGIN
v_nombre := 2;
FOR i IN 1 .. v_nombre
LOOP
v_var1 := p_var_type.p_var1(i);
v_var2 := p_var_type.p_var2(i);
END LOOP;
dbms_output.putline('v_var1' || v_var1);
dbms_output.putline('v_var2' || v_var2);
END TEST_PROC;
END TEST_PKG;
/
能够无错误地编译
您对数组的索引位于错误的位置;您想引用数组的第 n 个元素中的字段,因此可以使用:
v_var1 := p_var_type.p_var1(i);
v_var2 := p_var_type.p_var2(i);
应该是:
v_var1 := p_var_type(i).p_var1;
v_var2 := p_var_type(i).p_var2;
您的
dbms_output
调用也是错误的,目前您正在查看两个数组条目 - 如果数量较少,则会失败 - 并且实际上只对第二个进行任何操作。
您可能想要更多类似的东西:
CREATE OR REPLACE PACKAGE BODY TEST_PKG
IS
PROCEDURE TEST_PROC (
p_proc1 IN VARCHAR2,
p_proc2 IN VARCHAR2,
p_var_type IN rec_array
)
IS
v_var1 VARCHAR2(1);
v_var2 VARCHAR2(2);
BEGIN
FOR i IN 1 .. p_var_type.count
LOOP
v_var1 := p_var_type(i).p_var1;
v_var2 := p_var_type(i).p_var2;
dbms_output.put_line('v_var1: ' || v_var1);
dbms_output.put_line('v_var2: ' || v_var2);
END LOOP;
END TEST_PROC;
END TEST_PKG;
/
它将循环遍历所有元素(通过
count
)。您当前并不真正需要局部变量,但想必您将使用那些比总是直接引用数组元素及其字段更容易的事情。