当前位置: 首页 > 知识库问答 >
问题:

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

潘俊楚
2023-03-14

ODI-1228:Task START_JC(过程)在目标ORACLE连接OJC上失败。
由:java.sql.sqlexception:ORA-06502:PL/SQL:numeric or value错误:NULL索引表键值
ORA-06512:at“OJC.JC_master”,第129行
ORA-06512:at“OJC.JC_master”,第689行
ORA-06512:at“OJC.JC_master”导致。

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个答案

章心水
2023-03-14

如果p_string是一个完全不包含等号的非空值,或者包含任何以等号开头的分号分隔的部分,则会出现错误。它由您指示的行后面的行抛出(如果p_string有最后一个分号,则为循环内的等效行)。

如果根本没有等号,那么

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

给出零,这意味着你根本不经历循环;这意味着当您到达最后一个赋值时v_temp_parameter_name从未设置过。

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

还没有实际的错误,因此它再次计算v_pos,并根据是否有结束分号得到零或非零。

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

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

程序不是我写的,我得运行它。它应该是语法正确的

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

 类似资料:
  • 我在执行触发器时遇到以下错误: 请说明问题的原因。 编辑 数据类型:

  • 我实现了一个返回clob数据类型的函数,我希望在DBMS输出中打印结果。不幸的是,我得到了ORA-06502:PL/SQL:numeric或value错误,我认为这是由于dbms_output的大小造成的。 这是密码。 这里有一些东西可以帮助您理解这个问题 1)添加了以下内容来设置缓冲区的大小不受限制,但不起作用… 3)我可以通过执行以下操作来解决这个问题,但我认为这不是一个好的解决方案,因为它执

  • 我得到了 ORA-06502:PL/SQL:以下代码中出现数值或值错误:

  • 我做了一些研究,有一个建议可以使用双重 但是现在我得到了ORA-06502/ORA-06512错误: ORA-06502:PL/SQL:erreur numérique ou erreur sur une valeur ORA-06512:àsys.xmltype“,ligne 272 ORA-06512:àligne 1 06502。00000-“PL/SQL:数值或值错误%s” *原因:出现算

  • 正如您所知,由于Oracle11g不支持json,我使用CLOB创建json数据,因为varchar2(32767)大小,但此时我得到了ORA-06502:PL/SQL:numeric或value错误。同时,数据大小为68075。为什么我得到错误,尽管Clob是支持4 gb的数据?

  • 我有一个向CLOB追加字符串的场景。我遇到的问题是,一旦CLOB达到一定大小,如果我试图向CLOB追加更多内容,就会出现ORA-06502:PL/SQL:numeric或value错误。我假设它的大小已经用完了,但我不知道如何克服这个问题(即指定如何使clob变大)。 有人能帮帮我吗。 我就是这样宣布我的衣服的... 然后我像这样插入它.... 谢谢