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

发布于 2024-10-28 12:52:40 字数 3794 浏览 2 评论 0原文

我正在 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> 

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

im writing a stored procedure in sqlplus. I cant figure out why it keeps telling me there is an error. This is my schema:

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)
);

And this is my procedure:

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;
/

The output from sqlplus is:

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> 

I hope you can help me! thanks in advance!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

屋檐 2024-11-04 12:52:40

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

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

应该是

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

I think you need to add the column names (even though there's only one column available).

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

Should be

montoPorRsv := montoPorRsv + (num_dias * tar.TARIFA);
montoPorRsv := (montoPorRsv + cons.MONTO);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文