oracle PLS-00306: 调用 '*' 的参数数量或类型错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5495657/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
PLS-00306: wrong number or types of arguments in call to '*'
提问by Throoze
im writing a stored procedure in sqlplus. I cant figure out why it keeps telling me there is an error. This is my schema:
我正在用 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)
);
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:
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>
I hope you can help me! thanks in advance!!!
我希望你可以帮助我!提前致谢!!!
回答by Jon Heller
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);