ORA-06502: PL/SQL: numeric or value error: NULL index table key value ORA-06512: at "OJC.JC_MASTER", line 129

ORA-06502: PL/SQL: numeric or value error: NULL index table key value ORA-06512: at "OJC.JC_MASTER", line 129

我正在尝试 运行 ODI 11g 中的接口。当我调用该过程时出现此错误:

ODI-1228: Task START_JC (Procedure) fails on the target ORACLE connection OJC.
Caused By: java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error: NULL index table key value
ORA-06512: at "OJC.JC_MASTER", line 129
ORA-06512: at "OJC.JC_MASTER", line 689
ORA-06512: at line 9

sql代码

 PROCEDURE string_to_aa_parameter_type (
   p_string                             VARCHAR2,
   p_out_aa_parameter_values   IN OUT   aa_parameter_type
)
AS
   v_start                  INTEGER         := 1;
   v_pos                    INTEGER         := 0;
   v_counter                INTEGER         := 0;
   v_temp_parameter_name    VARCHAR2 (4000);
   v_temp_parameter_value   VARCHAR2 (4000);
BEGIN
   IF p_string IS NULL
   THEN
      RETURN;
   END IF;

   -- determine first chuck of string
   v_pos := INSTR (p_string, '=', v_start);

   -- while there are chunks left, loop
   WHILE (v_pos != 0)
   LOOP
      v_counter := v_counter + 1;

      -- create array
      IF MOD (v_counter, 2) = 1
      THEN
         v_temp_parameter_name :=
                               SUBSTR (p_string, v_start, v_pos - v_start);
         v_start := v_pos + 1;
         v_pos := INSTR (p_string, ';', v_start);
      ELSE
         v_temp_parameter_value :=
                               SUBSTR (p_string, v_start, v_pos - v_start);

         p_out_aa_parameter_values (trim(v_temp_parameter_name)) :=
                                                    trim(v_temp_parameter_value);

         v_start := v_pos + 1;
         v_pos := INSTR (p_string, '=', v_start);

      END IF;
   END LOOP;

   -- IN THE FOLLOWING LINE I GET THE ERROR 
   v_temp_parameter_value := SUBSTR (p_string, v_start);

   p_out_aa_parameter_values (trim(v_temp_parameter_name)) :=
                                             trim(v_temp_parameter_value);

END;

谁能帮我找出问题所在?

如果 p_string 是一个完全不包含等号的非空值,或者任何以等号开头的分号分隔部分,您将收到该错误。它由您指定的行之后的行抛出(或循环内的等效行,如果 p_string 有最后一个分号)。

如果根本没有等号那么

v_pos := INSTR (p_string, '=', v_start);

给出零,这意味着你根本没有经过循环;这意味着当您到达最终作业时 v_temp_parameter_name 从未设置过。

如果 key/value 对没有密钥,假设 p_string'x=y;=z' 你就进入了循环,在这个例子中,第一个 key/value 对被添加到数组中;但是 v_startv_pos 最终得到相同的值(在本例中为 5,都指向第二个 =)。下一次循环:

         v_temp_parameter_name :=
                               SUBSTR (p_string, v_start, v_pos - v_start);

计算为 SUBSTR(p_string, 5, 0)(第三个参数为零,因为这两个变量相同),它始终为空字符串或 null。

目前还没有真正的错误,所以它再次评估 v_pos,然后得到零或非零,这取决于是否有终止分号。

如果它不是零,那么它会再次循环;如果它为零,它就会退出。无论哪种方式,它都有最后一次尝试获得匹配值——是否设置为任何值都没有关系。但是,当它尝试将元素添加到数组时,名称仍然为空,并且您会从它命中的两个数组赋值中的任何一个中得到该错误。

您可以在过程中进行额外的测试和处理以发现和丢弃空键,但是

i didn't write the procedure,i have to run it . It is supposed to be syntax correct

所以你需要弄清楚为什么 Java 代码传递了一个过程无法处理的值 - 即为什么它发送不完整的 key/value 对。