10

助けが必要です。(私はたくさん検索し、さらに混乱します。)

私はToad 9.7.25を使用しており、この手順を(パッケージで)作成しました

PROCEDURE ReportaCC(pfcorte IN DATE, lcursor  IN OUT  SYS_REFCURSOR)
IS
BEGIN
    OPEN lcursor FOR
        select c1, c3, c3 from table1 where hdate = pfcorte;
    close lcursor;
END;

ヒキガエルの sql エディターで、その手順を実行し、カーソルの結果をヒキガエルのデータグリッドに表示したいと思います。


--- I WANT THIS CODE CAN EXECUTE IN TOAD'S SQL EDITOR.

    DECLARE 
      PFCORTE DATE;
      LCURSOR SYS_REFCURSOR;
    BEGIN 

        PFCORTE := '31/08/2012';
        -- LCURSOR := NULL;  -- Modify the code to initialize this parameter

        mypaq.REPORTACC( TO_DATE(PFCORTE,'DD/MM/YYYY') , LCURSOR );

        :to_grid := LCURSOR;

        COMMIT;

    END;

スクリプト (F9) を実行し、変数 :to_grid タイプのカーソルを設定すると、次のエラーが発生します。

「ORA-24338: 文ハンドルが実行されていません」

何が問題になる可能性がありますか

前もって感謝します。


あなたの投稿に感謝します...うまくいきました!

しかし、別の質問があります...単純なクエリ(テーブルからc1、c2、c3を選択...)を次のようなモルコンプレックスに置き換えると:

  PROCEDURE ReportaCC(pfcorte IN DATE,  lcursor OUT SYS_REFCURSOR)
    IS           
    BEGIN

        OPEN lcursor FOR

            SELECT ENC.CVEOTORGANTE, ENC.NOMBREOTORGANTE, ENC.IDENDINTIFICADORDEMEDIO, TO_CHAR(SYSDATE, 'YYYYMMDD') AS FECHAEXT, ENC.NOTAOTORGANTE, 
                   CIRCRED.valida_cc.QUITASIGNOS(VCL.APELLIDOPATERNO) AS VAL_APELLIDOPATERNO, 
                   CIRCRED.valida_cc.QUITASIGNOS(VCL.APELLIDOMATERNO) AS VAL_APMATERNO, 
                   CIRCRED.valida_cc.QUITASIGNOS(VCL.APELLIDOADICIONAL) AS APELLIDOADICIONAL , 
                   CIRCRED.valida_cc.QUITASIGNOS(VCL.NOMBRES) AS NOMBRES, 
                   VCL.FECHANACIMIENTO, 
                   circred.valida_cc.valida_rfc(Vcl.rfc,'CORRIGE') AS VALRFC,  
                   circred.valida_cc.valida_curp(VCL.CURP,'CORRIGE') AS VALCURP, VCL.NACIONALIDAD,
                   circred.valida_cc.valida_RESIDENCIA('ESIACOM', SC.TIPOVIV ) AS VAL_RESIDENCIA, VCL.NUMEROLICENCIACONDUCIR, 
                   circred.valida_cc.valida_EDOCIVIL('ESIACOM', VCL.ESTADOCIVIL) AS VAL_ESTADOCIVIL, VCL.SEXO, 
                   circred.valida_cc.valida_IFE(VCL.CLAVEELECTORIFE,'CORRIGE') AS CLAVEELECTORIFE, 
                   VCL.NUMERODEPENDIENTES,
                   VCL.FECHADEFUNCION, VCL.INDICADORDEFUNCION, VCL.TIPOPERSONA,
                   CIRCRED.valida_cc.QUITASIGNOS(VCL.DIRECCION) AS DIRECCION, 
                   CIRCRED.valida_cc.QUITASIGNOS(VCL.COLONIAPOBLACION) AS COLONIAPOBLACION, 
                   CIRCRED.valida_cc.QUITASIGNOS(VCL.DELEGACIONMUNICIPIO) AS DELEGACIONMUNICIPIO, 
                   CIRCRED.valida_cc.QUITASIGNOS(VCL.CIUDAD) AS CIUDAD, 
                   VCL.ESTADO, circred.valida_cc.valida_cp(VCL.CP, VCL.CDGEF) AS VAL_CP, VCL.FECHARESIDENCIA,
                   circred.valida_cc.valida_TEL(VCL.NUMEROTELEFONO,'CORRIGE') AS VAL_TEL, circred.valida_cc.valida_TIPODOMICILIO('ESIACOM', 'C') AS VAL_TIPODOMICILIO, VCL.TIPOASENTAMIENTO,    
                   EMP.*,
                   ENC.CVEOTORGANTE CVEACTUAL, ENC.NOMBREOTORGANTE, SAL.CUENTAACTUAL, SAL.TIPORESPONSABILIDAD, SAL.TIPOCUENTA, SAL.TIPOCONTRA, SAL.CLAVEUNIDADMONETARIA, SAL.VALORACTIVOVALUACION,
                   SAL.NUMPAGOS, SAL.FREQPAGOS,SAL.PAGOPACCL, SAL.FECHAAPERTURACUENTA, 
                   TO_CHAR(circred.valida_cc.FUN_FULTDEPCL(sal.CLNS, sal.CDGNS, sal.CDGNS, sal.CDGCL, sal.CICLO, SAL.INICICLO, SAL.FREQPAGOS, pfcorte ), 'YYYYMMDD') AS FULTPAGO,  
                   SAL.FECHAULTIMACOMPRA,  SAL.FECHACIERRECUENTA, SAL.FECHACORTE, SAL.GARANTIA, SAL.CREDITOMAXIMO,
                   SAL.SALDOCL, SAL.limitecredito, SAL.SDOVENCL, SAL.NUMPAGVEN, SAL.pagoactual,  SAL.HISTORICOPAG, SAL.CLAVEPREVENCION, SAL.TOTPAGREP, SAL.CLAVEANTERIOROTORGANTE, 
                   SAL.NOMBREANTERIOROTORGANTE, SAL.NUMEROCUENTAANTERIOR,
                   SAL.SUMSALDO, SAL.sumsdoven, SAL.numcred, SAL.numdirecc, SAL.numempleo, SAL.numctas, ENC.NOMBREOTORGANTE, NULL AS DOMDEVOL       
            FROM
                CIRCRED.VW_ENCABEZADO ENC,
                circred.VW_DATOSPERDOM  VCL,
                ICARO.VW_PROYINVE  SC,
                CIRCRED.EMPLEO  EMP,
                CIRCRED.VW_SALDOINCOB    SAL
            WHERE SAL.FUENTEBD = 'ESIACOM' 
                AND SAL.CDGCL = VCL.CDGCL  
                AND SAL.CDGCL = SC.CDGCL(+) AND SAL.CICLO = SC.CICLO(+) and SAL.INICICLO = SC.INICIO(+)
                AND SAL.FCORTE = pfcorte
                AND SAL.STATUSCC IN ('INCOB', 'CIERR', 'CEROS')  ;                       

    END ReportaCC;

結果を表示できないのはなぜですか?
(TOAD SQLエディターで直接実行すると、クエリは正常に機能します)

再度、感謝します....!!!

4

2 に答える 2

25

[変数] ダイアログが表示されたらF9、ドロップダウン リストから [Type=Cursor] を選択し、[OK] を押します。

タイプ=カーソルを選択

「ORA-24338: ステートメント ハンドルが実行されていません」というエラーが発生する理由は、アクセスする前にカーソルを閉じているためです。

これは起こっているプロセスです:

  1. 実行手順
  2. OPEN ステートメントは、メモリ内の結果セットへのポインターを返します (ただし、データは返しません)。
  3. CLOSE ステートメントは、アクセスされる前に結果を破棄します
  4. 手続き呼び出し終了
  5. クライアントの呼び出し元 (この場合は TOAD) が結果ストリームにアクセスしようとしますが、ポインターが無効であるため、何も読み取ることができず、エラーがスローされます

close lcursor;解決策:ステートメントを削除します。

于 2012-10-05T16:29:22.560 に答える
1

あなたの手順は選択ステートメントのみを実行しているため、次のような関数を使用することをお勧めします

CREATE or REPLACE function ReportaCC(pfcorte IN DATE) 
RETURN SYS_REFCURSOR
AS
   lcursor   SYS_REFCURSOR;
BEGIN
   OPEN lcursor FOR
     select c1, c3, c3 from table1 where hdate = pfcorte;
   RETURN lcursor ;
END;
/

ここで lcursor を閉じないでください。呼び出しステートメントから閉じてください。lcursor を閉じると結果が表示されなくなるからです。

そして、次のように実行します

select ReportaCC(<>) from dual

ヒキガエルから、データグリッドでカーソルをダブルクリックして結果を確認します。

于 2012-10-05T15:37:16.993 に答える