gpt4 book ai didi

sql - PLS-00306 : wrong number or types of arguments in call to '*'

转载 作者:行者123 更新时间:2023-12-04 06:30:23 25 4
gpt4 key购买 nike

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

我希望你可以帮助我!提前致谢!!!

最佳答案

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

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

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

关于sql - PLS-00306 : wrong number or types of arguments in call to '*' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5495657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com