我创建了这个存储过程以便显示某省的平均情况。 当它获得一个有效的省(与PROVINCE表进行比较)作为参数时,将引发cont变量。 如果没有提高cont = 0,则->异常。 如果它升高了,则->继续执行te过程,该过程应该将我用 DBMS_OUTPUT.PUT_LINE 编写的行输出给我,并且必须显示省名和病例数。 无论如何,这是行不通的,我也无法理解为什么。我收到ora-06550和ora-00905。
CREATE OR REPLACE PROCEDURE Media_Casi_totali(Provincia IN PROVINCE.denominazione_provincia%TYPE) AS BEGIN DECLARE Media_dei_casi_totali COVID_PROVINCE.Totale_Casi%TYPE; Cont INTEGER; Provincia_Errata EXCEPTION; BEGIN select count(*| INT) Cont from PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA where p.denominazione_provincia=Provincia; IF (cont=0) then Raise Provincia_Errata; ELSE select ROUND(AVG(CP.TOTALE_CASI),3) INTO Media_dei_casi_totali FROM PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA=CP.CODICE_PROVINCIA WHERE P.DENOMINAZIONE_PROVINCIA=Provincia; DBMS_OUTPUT.PUT_LINE('Media dei casi totali' || 'relativi alla provincia di' || Provincia || ':' || Media_dei_casi_totali); END IF; EXCEPTION WHEN Provincia_Errata THEN DBMS_OUTPUT.PUT_LINE('La Provincia selezionata non esiste'); END; END Media_Casi_totali;
答案 0 :(得分:1)
无效的语法,在这里:
select count(*| INT) Cont
应该是
select count(*) into Cont
CREATE OR REPLACE PROCEDURE Media_Casi_totali (
Provincia IN PROVINCE.denominazione_provincia%TYPE)
AS
BEGIN
DECLARE
Media_dei_casi_totali COVID_PROVINCE.Totale_Casi%TYPE;
Cont INTEGER;
Provincia_Errata EXCEPTION;
BEGIN
SELECT COUNT (*)
INTO Cont
FROM PROVINCE P
INNER JOIN COVID_PROVINCE CP
ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA
WHERE p.denominazione_provincia = Provincia;
IF (cont = 0)
THEN
RAISE Provincia_Errata;
ELSE
SELECT ROUND (AVG (CP.TOTALE_CASI), 3)
INTO Media_dei_casi_totali
FROM PROVINCE P
INNER JOIN COVID_PROVINCE CP
ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA
WHERE P.DENOMINAZIONE_PROVINCIA = Provincia;
DBMS_OUTPUT.PUT_LINE (
'Media dei casi totali'
|| 'relativi alla provincia di'
|| Provincia
|| ':'
|| Media_dei_casi_totali);
END IF;
EXCEPTION
WHEN Provincia_Errata
THEN
DBMS_OUTPUT.PUT_LINE ('La Provincia selezionata non esiste');
END;
END Media_Casi_totali;
答案 1 :(得分:0)
当然,在用编码错误的cont变量解决问题之后,我将使其变得更加简单。
更新结尾丢失了
CREATE OR REPLACE PROCEDURE Media_Casi_totali(Provincia IN PROVINCE.denominazione_provincia%TYPE)
AS
BEGIN
DECLARE
Media_dei_casi_totali COVID_PROVINCE.Totale_Casi%TYPE;
Cont INTEGER;
BEGIN
dbms_output.enable(null);
select count(*) into Cont
from PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA
where p.denominazione_provincia=Provincia;
IF cont=0 then
raise_application_error(-20001,'Error here - counter is 0');
ELSE
select ROUND(AVG(CP.TOTALE_CASI),3) INTO Media_dei_casi_totali
FROM PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA=CP.CODICE_PROVINCIA
WHERE P.DENOMINAZIONE_PROVINCIA=Provincia;
DBMS_OUTPUT.PUT_LINE('Media dei casi totali' || 'relativi alla provincia di' || Provincia || ':' || Media_dei_casi_totali);
END IF;
END;
EXCEPTION
when others then raise;
END Media_Casi_totali;
然后运行它
SQL> SET SERVEROUTPUT ON
SQL> EXEC Media_Casi_totali ( Provincia => xxxx );
我更喜欢使用RAISE_APPLICATION_ERROR,因为在您的情况下,它更加可靠,我相信。如果我有关联的pragma_exception_init来控制特定于Oracle的异常,我将使用异常。如果您的情况是逻辑上的异常,则您希望在计数器为0时引发错误。
测试用例
SQL> create table province ( codice_provincia number , denominazione_provincia varchar2(100) );
Table created.
SQL> create table COVID_PROVINCE ( codice_provincia number , Totale_Casi number );
Table created.
SQL> CREATE OR REPLACE PROCEDURE Media_Casi_totali(Provincia IN PROVINCE.denominazione_provincia%TYPE)
AS
BEGIN
DECLARE
Media_dei_casi_totali COVID_PROVINCE.Totale_Casi%TYPE;
Cont INTEGER;
BEGIN
dbms_output.enable(null);
select count(*) into Cont
from PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA
where p.denominazione_provincia=Provincia;
IF cont=0 then
raise_application_error(-20001,'Error here - counter is 0');
ELSE
select ROUND(AVG(CP.TOTALE_CASI),3) INTO Media_dei_casi_totali
FROM PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA=CP.CODICE_PROVINCIA
WHERE P.DENOMINAZIONE_PROVINCIA=Provincia;
DBMS_OUTPUT.PUT_LINE('Media dei casi totali' || 'relativi alla provincia di' || Provincia || ':' || Media_dei_casi_totali);
END IF;
EXCEPTION
when others then raise;
end;
23 END Media_Casi_totali;
24 /
Procedure created.
SQL>
致谢