我有一个带游标的功能。在这个游标中我想得到另一个传递参数的游标。此参数是主游标的值。我的逻辑是这样的:
CURSOR cursor1 IS
SELECT * FROM SCHEMAP.TABLA1 ;
registro cursor1%ROWTYPE;
CURSOR cursor2 (parametro IN NUMBER) IS
SELECT * FROM SCHEMAP.TABLA2 WHERE CAMPO_1 = parametro;
registroVac cursor2%ROWTYPE;
..........
BEGIN
.......
OPEN cursor1;
FETCH cursor1 INTO registro;
WHILE cursor1%found
LOOP
dbms_output.put_line('VARIABLE1:' + registro.VARIABLE1 );
OPEN cursor2(registro.VARIABLE1);
FETCH cursor2 INTO registroVac;
WHILE cursor2%found
LOOP
SELECT HC3PKDMUTILITIES.GET_DIAGNOSTIC_CODE_VAC(registro.VARIABLE1,registroVac.VAC_DOS,registroVac.VAC_CVH)
into v_diagnostic_code
from DUAL;
dbms_output.put_line('v_diagnostic_code -->' || v_diagnostic_code);
FETCH cursor2 INTO registroVac;
END LOOP;
CLOSE cursor2;
FETCH cursor1 INTO registro;
END LOOP;
CLOSE cursor1;
当我运行该过程时,我在cursor2中有一个错误:
ORA-06502:PL / SQL:数字或值错误:字符到数字转换错误CAMPO_1:102435313
CAMPO_1被证明是一个数字数据库和registro.VARIABLE1。如何解决这个问题呢?。感谢。
答案 0 :(得分:0)
这只是代码剪切,您的应用程序中是否有更多代码?
如果没有,那么你可以在一个更快更短的时间里完成所有这些:
CURSOR All_in_one IS
SELECT VARIABLE1,
HC3PKDMUTILITIES.GET_DIAGNOSTIC_CODE_VAC(registro.VARIABLE1,registroVac.VAC_DOS,registroVac.VAC_CVH) AS v_diagnostic_code
FROM SCHEMAP.TABLA2 t registroVac
RIGHT OUTER JOIN SCHEMAP.TABLA1 registro ON CAMPO_1 = VARIABLE1;
答案 1 :(得分:0)
您的代码存在许多问题。
首先让我感到震惊的是你打开了cursor1,打开,获取和关闭了cursor2,然后然后从cursor1获取。这似乎不正确!
其次,为什么要打扰两个游标并重新创建嵌套循环连接? SQL完全能够处理连接,并且优化器非常擅长决定使用哪个连接(散列连接,嵌套循环等)。
第三,如果HC3PKDMUTILITIES.GET_DIAGNOSTIC_CODE_VAC是一个函数,为什么要从双重选择它(因此引入PL / SQL和SQL引擎之间的上下文切换),而不是简单地为变量赋值函数的返回值?
我认为您可以简单地重写上述代码:
declare
v_diagnostic_code varchar2(100); -- wasn't sure of the correct datatype; this is just a guess
begin
for rec in (select t1.variable1,
t2.vac_dos,
t2.vac_cvh
from schemap.tabla1 t1
inner join schemap.tabla2 t2 on (t2.campo_1 = t1.variable1))
loop
v_diagnostic_code := hc3pkdmutilities.get_diagnostic_code_vac(rec.variable1,rec.vac_dos,rec.vac_cvh);
dbms_output.put_line('variable1 --> '||rec.variable1||', v_diagnostic_code -->' || v_diagnostic_code);
end loop;
end;
/