PLS-00306:调用“*”时参数的数量或类型错误

Posted

技术标签:

【中文标题】PLS-00306:调用“*”时参数的数量或类型错误【英文标题】:PLS-00306: wrong number or types of arguments in call to '*' 【发布时间】:2011-03-31 05:27:22 【问题描述】:

我在 sqlplus 中编写了一个存储过程。我不明白为什么它一直告诉我有一个错误。这是我的架构:

CREATE TABLE HABITA(
    NUMERO      CHAR(4)         NOT NULL,
    TARIFA      NUMBER(10,2)    NOT NULL,
    CONSTRAINT PK_HABITA PRIMARY KEY (NUMERO)
);


CREATE TABLE RESERVA_CIERRE(
    CODIGO CHAR(4) NOT NULL,
    FECHA_CIERRE DATE NOT NULL,
    MONTO_TOTAL NUMBER(10,2) NOT NULL,
    CONSTRAINT PK_RESERVA_CIERRE  PRIMARY KEY (CODIGO, FECHA_CIERRE)
);

CREATE TABLE SERVICIO(    
    ID      CHAR(4)             NOT NULL,
    NOMBRE          VARCHAR2(50)        NOT NULL, 
    CONSTRAINT  PK_SERVICIO PRIMARY KEY (ID)
);

CREATE TABLE RESERVA(
    CODIGO              CHAR(4)         NOT NULL,
    FECHA_INGRESO       DATE            NOT NULL,
    FECHA_EGRESO        DATE            NOT NULL,
    CEDULA              VARCHAR2(10)    NOT NULL,
    NOMBRE              VARCHAR2(50)    NOT NULL,
    NUM_PERSONAS        NUMBER(2),
    CONSTRAINT PK_RESERVA PRIMARY KEY (CODIGO)
);

CREATE TABLE ASIGNA (
    NUMERO_HAB  CHAR(4)     NOT NULL,
    CODIGO_RES          CHAR(4) NOT NULL,
    NUM_AD              NUMBER(2)   NOT NULL,
    NUM_NI              NUMBER(2)   NOT NULL,
    CONSTRAINT PK_ASIGNA PRIMARY KEY (NUMERO_HAB, CODIGO_RES)
);

CREATE TABLE CONSUMO (
    NUMERO_HAB  CHAR(4)     NOT NULL,
    CODIGO_RES  CHAR(4) NOT NULL,
    ID_SERVICIO CHAR(4) NOT NULL,
    TIPO_PAGO   CHAR(3) NULL,
    MONTO       NUMBER(10,2) NOT NULL,
    FECHA_HORA  DATE    NOT NULL,
    NUM_FACTURA VARCHAR2(10)NOT NULL,
    CONSTRAINT PK_CONSUMO PRIMARY KEY (NUM_FACTURA)
);

这是我的程序:

CREATE OR REPLACE PROCEDURE realiza_cierre(fechaCierre IN CONSUMO.FECHA_HORA%TYPE) AS
    res RESERVA.CODIGO%TYPE;
    ingreso RESERVA.FECHA_INGRESO%TYPE;
    num_dias HABITA.TARIFA%TYPE;
    montoPorRsv HABITA.TARIFA%TYPE;
    hola RESERVA.CODIGO%TYPE;
    /* Todas las reservas activas para la fechaCierre*/
    CURSOR reservas IS
        SELECT R.CODIGO
        FROM RESERVA R
        WHERE R.FECHA_INGRESO <= fechaCierre AND fechaCierre <= R.FECHA_EGRESO;

    /* Tarifas de cada habitacion para una reserva dada */
    CURSOR montosHab (rsv RESERVA.CODIGO%TYPE) IS
        SELECT H.TARIFA
        FROM HABITA H, ASIGNA A
        WHERE H.NUMERO = A.NUMERO_HAB AND A.CODIGO_RES = rsv;

    /* Consumos para una reserva dada */
    CURSOR montosCons (rsv RESERVA.CODIGO%TYPE, fecha CONSUMO.FECHA_HORA%TYPE )IS
        SELECT C.MONTO
        FROM CONSUMO C
        WHERE C.CODIGO_RES = rsv AND C.FECHA_HORA < fecha;
BEGIN
    OPEN reservas;
    LOOP
        FETCH reservas INTO res;
        EXIT WHEN reservas%NOTFOUND;

        /* Calculo el numero de dias que lleva activa la reserva 'res' */
        SELECT FECHA_INGRESO INTO ingreso
        FROM RESERVA
        WHERE CODIGO = res;        
        num_dias := fechaCierre - ingreso;

        /* Calculo y almaceno los montos por habitaciones de esta reserva*/
        FOR tar IN montosHab(res) LOOP
            montoPorRsv := montoPorRsv + (num_dias * tar);
        END LOOP;

        /* Calculo y almaceno los montos por consumo de esta reserva */
        FOR cons IN montosCons(res,fechaCierre) LOOP
            montoPorRsv := (montoPorRsv + cons);
        END LOOP;

        INSERT INTO RESERVA_CIERRE VALUES (res,fechaCierre,montoPorRsv);
    END LOOP;
    CLOSE reservas;
END realiza_cierre;
/

sqlplus 的输出是:

SQL> show errors;
Errors for PROCEDURE REALIZA_CIERRE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
38/13    PL/SQL: Statement ignored
38/43    PLS-00306: wrong number or types of arguments in call to '*'
43/13    PL/SQL: Statement ignored
43/29    PLS-00306: wrong number or types of arguments in call to '+'
SQL> 

我希望你能帮助我!提前谢谢!!!

【问题讨论】:

【参考方案1】:

我认为您需要添加列名(即使只有一列可用)。

montoPorRsv := montoPorRsv + (num_dias * tar);
montoPorRsv := (montoPorRsv + cons);

应该是

montoPorRsv := montoPorRsv + (num_dias * tar.TARIFA);
montoPorRsv := (montoPorRsv + cons.MONTO);

【讨论】:

是的!它工作并解决了编译错误!!! =) 谢谢!我还不能投票,但我愿意!

以上是关于PLS-00306:调用“*”时参数的数量或类型错误的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00306:调用 oracle 函数时参数的数量或类型错误

PLS-00306:调用过程 PROC_T 时参数的数量或类型错误

PLS-00306:函数调用中的参数数量或类型错误

PLS-00306:调用“ADD_MONTHS”时参数的数量或类型错误

ORA-06550:PLS-00306: 调用中的参数数量或类型错误;ORA-06550:

PLS-00306:调用 'GET_LINE' 时参数的数量或类型错误。在 PL/SQL 中的函数中传递字符串参数时出现此错误