Database 以变量作为参数的游标

Database 以变量作为参数的游标,database,oracle,cursor,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; registroV

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

  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中出现如下错误:

  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;
ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误CAMPO_1:102435313


CAMPO_1被证明是一个数字数据库和registro.VARIABLE1。如何解决这个问题?。谢谢。

这只是一个被剪掉的代码吗?您的应用程序中有更多的代码吗

如果没有,那么您可以一次完成所有任务,这应该更快、更短:

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;

你的代码有很多错误

首先让我印象深刻的是,您正在打开cursor1,打开、获取和关闭cursor2,然后从cursor1获取。这似乎不正确

其次,为什么要费心拥有两个游标并自己重新创建嵌套循环联接呢?SQL完全能够处理连接,优化器非常擅长决定使用哈希连接、嵌套循环等连接

第三,如果hc3pkdulities.GET_DIAGNOSTIC_CODE_VAC是一个函数,为什么要从dual中选择它,从而在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;
/
尝试在SCHEMAP.TABLA2.CAMPO_1%类型中使用游标游标游标2参数