带有变量的游标作为参数Oracle

时间:2015-10-01 08:12:14

标签: database oracle cursor

我有一个带游标的功能。在这个游标中我想得到另一个传递参数的游标。此参数是主游标的值。我的逻辑是这样的:

  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。如何解决这个问题呢?。感谢。

2 个答案:

答案 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;
/