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

Posted

技术标签:

【中文标题】ORA-06502:PL/SQL:数字或值错误:NULL 索引表键值 ORA-06512:在“OJC.JC_MASTER”,第 129 行【英文标题】:ORA-06502: PL/SQL: numeric or value error: NULL index table key value ORA-06512: at "OJC.JC_MASTER", line 129 【发布时间】:2018-02-14 14:47:40 【问题描述】:

我正在尝试在 ODI 11g 中运行一个接口。当我调用该程序时,我收到此错误:

ODI-1228:任务 START_JC(过程)在目标 ORACLE 连接 OJC 上失败。 原因:java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error: NULL index table key value ORA-06512:在“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;

有人可以帮我找出问题所在吗?

【问题讨论】:

你怎么称呼它,你传入了什么?你确定是那一行而不是下一行,这对错误更有意义吗? v_temp_parameter_name 似乎最终为 null,那么您为 p_string 提供的值不是 null 但没有等号吗? 是的,错误来自最后一行。我没有写程序,我必须运行它。它应该是语法正确的。 语法正确并不意味着逻辑正确或完整。它似乎并不期望必须处理您实际发送的数据。这甚至不一定意味着它是错误的或损坏的——写它的人可能会说你的代码不是他们的问题。取决于商定的规范... 【参考方案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 代码会传递过程无法处理的值 - 即为什么它会发送不完整的键/值对。

【讨论】:

我必须找出如何在不更改代码的情况下修复错误。我收到以下错误 > ORA-20000: S:Server - javax.xml.bind.UnmarshalException - 带有链接异常:[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[14,385] 消息:属性名称“PRM”与元素类型“STARTUP”相关联。后面必须跟‘’ ='字符。] @eda - 该错误似乎并非来自您发布的代码。你是在调用这个调用该过程并将数组转换为 XML 的东西吗?看起来仍然是数据问题,您需要查看p_string 实际发送的内容。 是的,这正是我想要做的。这是一个接口,在调用另一个具有此过程的 ODI 项目时运行它。 问题似乎仍然是 p_string 中的内容。不知道你在里面放了什么,或者如果你不直接提供它是如何生成的,我不确定你可以如何继续。而且我们看不到所涉及的步骤或数据/值的来源。 我通过在此之前调用另一个过程来修复它。谢谢思考

以上是关于ORA-06502:PL/SQL:数字或值错误:NULL 索引表键值 ORA-06512:在“OJC.JC_MASTER”,第 129 行的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06502: PL/SQL: 数字或值错误: 字符到数字的转换错误

ORA-06502: PL/SQL: 数字或值错误: NULL 索引表键值

ORA-06502: PL/SQL: 数字或值错误: 数字精度太大

获取 ORA-06502:PL/SQL:数字或值错误:SQL 触发器中的字符到数字转换错误

oracle ORA-06502:PL/SQL:数字或值错误:批量绑定:截断绑定

ORA - 06502:PL/SQL:数字或值错误:批量绑定:截断绑定