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_start
和v_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 触发器中的字符到数字转换错误