我试图在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;
有人可以帮我弄清楚问题是什么吗?
答案 0 :(得分: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代码传递的过程无法处理的值 - 即为什么它发送不完整的键/值对。