ORA-06502:PL / SQL:数字或值错误:NULL索引表键值ORA-06512:at" OJC.JC_MASTER",第129行

时间:2018-02-14 14:47:41

标签: plsql oracle12c oracle-data-integrator

我试图在ODI 11g中运行一个界面。当我调用该程序时,我收到此错误:

  

ODI-1228:任务START_JC(过程)在目标ORACLE连接OJC上失败。   引发者:java.sql.SQLException:ORA-06502:PL / SQL:数值或值错误:NULL索引表键值   ORA-06512:at" OJC.JC_MASTER",第129行   ORA-06512:在" OJC.JC_MASTER",第689行   ORA-06512:第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;

有人可以帮我弄清楚问题是什么吗?

1 个答案:

答案 0 :(得分:1)

如果p_string是非空值,根本不包含等号,或者以等号开头的任何以分号分隔的部分,则会出现该错误。如果p_string有一个最后的分号,它会在您指定的行之后(或循环内的等效行)抛出。

如果根本没有等号,那么

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

给出零,这意味着你根本没有完成循环;这意味着当你完成最终作业时v_temp_parameter_name从未被设定过。

如果键/值对没有键,则说p_string'x=y;=z',你进入循环,并用该例子将第一个键/值对添加到数组中;但随后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,并且要么为零,要么为非零,具体取决于是否存在终止分号。

如果它不为零,那么它再次绕过循环;如果它为零则退出。无论哪种方式,它都有获得匹配值的最后一点 - 如果将其设置为任何值,则无关紧要。但是,当它试图将元素添加到数组时,名称仍然为null,并且从它命中的两个数组赋值中获得该错误。

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

  

我没有写程序,我必须运行它。它应该是语法正确的

因此,您需要弄清楚为什么Java代码传递的过程无法处理的值 - 即为什么它发送不完整的键/值对。