Ошибка компиляции хранимой процедуры SQL: неверный номер или типы аргументов в вызове - PullRequest
1 голос
/ 13 июня 2011

Я создал эту хранимую процедуру.Однако я получаю эту ошибку

ORA-06550: строка 14, столбец 3: PLS-00306: неверный номер или типы аргументов при вызове 'CHALLENGEUPDATE', когда переданы значения CUSTID: = '400800500';POLICYNAME: = 'POLICY';CHALLENGEID: = 'CHALLENGEID1';PINPOSITIONS: = 'PINPOS';

Код:

create or replace
procedure ChallengeUpdate  
(
   CustID        IN   SEC_CHALLENGE.CUSTOMERID%TYPE,
   PolicyName      IN   SEC_CHALLENGE.POLICY_NAME%TYPE,
   ChallengeId       IN   SEC_CHALLENGE.CHALLENGE_ID%TYPE,
   PinPositions       IN   SEC_CHALLENGE.PINPOSITIONS%TYPE,
   o_result   OUT  INTEGER,
   o_code OUT INTEGER,
   o_c OUT INTEGER
)
as
        c integer;
    begin
        select count(*) into c  from SEC_CHALLENGE xyz where xyz.CUSTOMERID=CustID and 
            xyz.POLICY_NAME=PolicyName;

        if c = 0 then
           INSERT INTO SEC_CHALLENGE(CUSTOMERID,CHALLENGE_ID,PINPOSITIONS,POLICY_NAME)
            VALUES (CustID,ChallengeId, PinPositions, PolicyName);

        else
            UPDATE RBSSEC_CHALLENGE 
            SET CHALLENGE_ID=ChallengeId, PINPOSITIONS=PinPositions
            WHERE CUSTOMERID=CustID and POLICY_NAME = PolicyName;
        end if;
        commit;
        o_result:=0;
        o_c:=c;
        exception when others then 
        o_result:=-1; 
        o_c:=c;
        rollback;
        o_code :=SQLCODE;
    end ChallengeUpdate;

Таблица SEC_CHALLENGE такая

CREATE TABLE "MUJEEB"."RBSSEC_CHALLENGE"
  (
    "CUSTOMERID"   VARCHAR2(9 BYTE) NOT NULL ENABLE,
    "CHALLENGE_ID" VARCHAR2(50 BYTE),
    "PINPOSITIONS" VARCHAR2(20 BYTE) NOT NULL ENABLE,
    "POLICY_NAME"  VARCHAR2(50 BYTE) NOT NULL ENABLE,
    CONSTRAINT "RBSSEC_CHALLENGE1_PK" PRIMARY KEY ("CHALLENGE_ID")
)

вот как я ее запускаю:

DECLARE CUSTID VARCHAR2(9); 
        POLICYNAME VARCHAR2(50); 
        CHALLENGEID VARCHAR2(50); 
        PINPOSITIONS VARCHAR2(20); 
        O_RESULT NUMBER; 
        O_CODE NUMBER; 
BEGIN   CUSTID :='400800500' ; 
        POLICYNAME := 'POLICY'; 
        CHALLENGEID := 'CHALLENGEID1'; 
        PINPOSITIONS := 'PINPOS'; 
        CHALLENGEUPDATE( CUSTID => CUSTID, POLICYNAME => POLICYNAME, CHALLENGEID => CHALLENGEID, PINPOSITIONS => PINPOSITIONS, O_RESULT => O_RESULT, O_CODE => O_CODE ); 
        DBMS_OUTPUT.PUT_LINE('O_RESULT = ' || O_RESULT); 
        DBMS_OUTPUT.PUT_LINE('O_CODE = ' || O_CODE); 
END;

Ответы [ 3 ]

3 голосов
/ 13 июня 2011

Если вы используете выходные параметры, помеченные ключевым словом «out», вы должны передать переменную для этого параметра. Выходные параметры не являются обязательными. Из ошибки я понимаю, что вы этого не сделали.

2 голосов
/ 13 июня 2011

если вы используете жабу, попробуйте это так:

var o_result integer;
var ocode integer;
var oc integer;
exec ChallengeUpdate  ('400800500', 'POLICY', 'CHALLENGEID1', 'PINPOS', :o_result, :ocode, :oc  );
print o_result;
print ocode ;
print oc;
0 голосов
/ 08 апреля 2016

Из декларации:

procedure ChallengeUpdate  
(
 CustID        IN   SEC_CHALLENGE.CUSTOMERID%TYPE,
 PolicyName      IN   SEC_CHALLENGE.POLICY_NAME%TYPE,
 ChallengeId       IN   SEC_CHALLENGE.CHALLENGE_ID%TYPE,
 PinPositions       IN   SEC_CHALLENGE.PINPOSITIONS%TYPE,
 o_result          OUT INTEGER,
 o_code            OUT INTEGER,
 o_c               OUT INTEGER
) as

В вашем вызове CHALLENGEUPDATE отсутствует выходная переменная для o_c OUT INTEGER. Вы можете попробовать ниже:

 exec CHALLENGEUPDATE( 
  CUSTID => CUSTID
, POLICYNAME => POLICYNAME
, CHALLENGEID => CHALLENGEID
, PINPOSITIONS => PINPOSITIONS
, O_RESULT => O_RESULT
, O_CODE => O_CODE 
, O_C => O_C_tobedeclared); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...