2011-03-31 129 views
2

即時編寫sqlplus中的存儲過程。我無法弄清楚它爲什麼一直告訴我有一個錯誤。這是我的架構:PLS-00306:調用'*'時參數的數量或類型錯誤

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> 

我希望你能幫幫我!提前致謝!!!

回答

2

我認爲你需要添加列名(即使只有一列可用)。

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

應該

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

YES!它的工作,並解決了編譯錯誤! =)謝謝!我不能投票,但我會! – Throoze 2011-03-31 06:19:50

相關問題