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_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
,然后得到零或非零,这取决于是否有终止分号。
如果它不是零,那么它会再次循环;如果它为零,它就会退出。无论哪种方式,它都有最后一次尝试获得匹配值——是否设置为任何值都没有关系。但是,当它尝试将元素添加到数组时,名称仍然为空,并且您会从它命中的两个数组赋值中的任何一个中得到该错误。
您可以在过程中进行额外的测试和处理以发现和丢弃空键,但是
i didn't write the procedure,i have to run it . It is supposed to be syntax correct
所以你需要弄清楚为什么 Java 代码传递了一个过程无法处理的值 - 即为什么它发送不完整的 key/value 对。
我正在尝试 运行 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_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
,然后得到零或非零,这取决于是否有终止分号。
如果它不是零,那么它会再次循环;如果它为零,它就会退出。无论哪种方式,它都有最后一次尝试获得匹配值——是否设置为任何值都没有关系。但是,当它尝试将元素添加到数组时,名称仍然为空,并且您会从它命中的两个数组赋值中的任何一个中得到该错误。
您可以在过程中进行额外的测试和处理以发现和丢弃空键,但是
i didn't write the procedure,i have to run it . It is supposed to be syntax correct
所以你需要弄清楚为什么 Java 代码传递了一个过程无法处理的值 - 即为什么它发送不完整的 key/value 对。