PLS-00306:调用“*”时参数的数量或类型错误
Posted
技术标签:
【中文标题】PLS-00306:调用“*”时参数的数量或类型错误【英文标题】:PLS-00306: wrong number or types of arguments in call to '*' 【发布时间】:2011-03-31 05:27:22 【问题描述】:我在 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>
我希望你能帮助我!提前谢谢!!!
【问题讨论】:
【参考方案1】:我认为您需要添加列名(即使只有一列可用)。
montoPorRsv := montoPorRsv + (num_dias * tar);
montoPorRsv := (montoPorRsv + cons);
应该是
montoPorRsv := montoPorRsv + (num_dias * tar.TARIFA);
montoPorRsv := (montoPorRsv + cons.MONTO);
【讨论】:
是的!它工作并解决了编译错误!!! =) 谢谢!我还不能投票,但我愿意!以上是关于PLS-00306:调用“*”时参数的数量或类型错误的主要内容,如果未能解决你的问题,请参考以下文章
PLS-00306:调用 oracle 函数时参数的数量或类型错误
PLS-00306:调用过程 PROC_T 时参数的数量或类型错误
PLS-00306:调用“ADD_MONTHS”时参数的数量或类型错误
ORA-06550:PLS-00306: 调用中的参数数量或类型错误;ORA-06550:
PLS-00306:调用 'GET_LINE' 时参数的数量或类型错误。在 PL/SQL 中的函数中传递字符串参数时出现此错误