-2

以下の手順を正しい方法で処理していますか?コンパイル エラーがいくつかあります。

create or replace PROCEDURE CRangeproc(in_termid IN VARCHAR2,in_cardno IN VARCHAR2,outcount OUT NUMBER,outissu OUT VARCHAR2,outacq OUT VARCHAR2,CIssuer OUT SYS_REFCURSOR,CAcquirer OUT SYS_REFCURSOR)
AS
BEGIN
select count(*) into outcount from cardrangetable where PAN_LOW <= in_cardno AND  PAN_HIGH >=  in_cardno and terminal_id = in_termid;
if outCount = 1 then
select ISSUERTABLEID into outissu,ACQUIRERTABLEID into outacq from cardrangetable where PAN_LOW <= in_cardno AND  PAN_HIGH >= in_cardno and terminal_id = in_termid;
Open CIssuer FOR
select * from Issuer_tble where TERMINAL_ID = in_termid and ISSUERTABLEID = outissu;
CLOSE CIssuer;
Open CAcquirer FOR
select * from ACQUIRERTABLE where TERMINAL_ID = in_termid and ACQUIRERID = outacq;
CLOSE CAcquirer;
end if;
End CRangeproc;

ありがとうございました

4

2 に答える 2

0

SELECT ステートメントごとに INTO 句が 1 つあります。この関数で REF CURSOR を閉じないでください。それらを消費するプログラムは、それらを処理する必要があります。

これはあなたのコードが好きなものです:

create or replace PROCEDURE CRangeproc
    (in_termid IN VARCHAR2
    ,in_cardno IN VARCHAR2
    ,outcount OUT NUMBER
    ,outissu OUT VARCHAR2
    ,outacq OUT VARCHAR2
    ,CIssuer OUT SYS_REFCURSOR
    ,CAcquirer OUT SYS_REFCURSOR)
AS
BEGIN
    select count(*) 
    into outcount 
      from cardrangetable 
    where PAN_LOW <= in_cardno 
    AND  PAN_HIGH >=  in_cardno 
    and terminal_id = in_termid;

    if outCount = 1 then
        select ISSUERTABLEID,ACQUIRERTABLEID 
        into outissu, outacq 
                from cardrangetable 
        where PAN_LOW <= in_cardno 
        AND  PAN_HIGH >= in_cardno 
        and terminal_id = in_termid;
        Open CIssuer FOR
            select * from Issuer_tble 
                          where TERMINAL_ID = in_termid 
                          and ISSUERTABLEID = outissu;
        Open CAcquirer FOR
            select * from ACQUIRERTABLE 
                          where TERMINAL_ID = in_termid 
                          and ACQUIRERID = outacq;
    end if;
End CRangeproc;

コードのレイアウトを改善するには、キャリッジ リターンの使い方を学ぶ必要があると思います。

于 2012-11-01T12:44:06.913 に答える
0

こんにちは、この部分でエラーが表示されます

 if Outcount = 1 then
select Issuertableid
  into Outissu, Acquirertableid
  into Outacq 
 from Cardrangetable
 where Pan_Low <= In_Cardno
   and Pan_High >= In_Cardno
   and Terminal_Id = In_Termid;

このようにする必要があります

 if Outcount = 1 then
select Issuertableid,  Acquirertableid
  into Outissu, Outacq
 from Cardrangetable
 where Pan_Low <= In_Cardno
   and Pan_High >= In_Cardno
   and Terminal_Id = In_Termid;

オープン/クローズが間違って使用されている (カーソルを使用しようとしている可能性があります)

 open Cissuer for
   ------
close Cissuer;
open Cacquirer for
     ----
close Cacquirer;
于 2012-11-01T11:36:36.217 に答える