oracle中如何在参数中传递数组

问题描述 投票:0回答:1

有人可以告诉我这有什么问题吗我收到消息说 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;
/         

能够无错误地编译

oracle-database
1个回答
0
投票

您对数组的索引位于错误的位置;您想引用数组的第 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
)。您当前并不真正需要局部变量,但想必您将使用那些比总是直接引用数组元素及其字段更容易的事情。

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.