PLS-00306:调用“*”时参数的数量或类型错误
我正在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为您需要添加列名称(即使只有一列可用)。
应该是
I think you need to add the column names (even though there's only one column available).
Should be