我创建这个存储过程是为了显示省份中的avg案例。当将有效省(与省表比较)作为参数时,将引发cont变量。当未引发cont=0时,则会引发->异常。如果它被提出,那么->继续使用te程序,它应该输出我用->写的行,它必须显示该省的名称和案例的数量。不管怎样,这不起作用,我也不明白为什么。我得到了06550和00905。
创建或替换过程Media_Casi_totali(Provincia IN PROVINCE.denominazione_provincia%TYPE)作为BEGIN声明Media_dei_casi_totali COVID_PROVINCE.Totale_Casi%TYPE;如果(cont=0),则提高Provincia_Errata,否则从P省内选择轮(AVG(CP.TOTALE_CASI),3)进入Media_dei_casi_totali,加入COVID_PROVINCE CP ON P.CODICE_PROVINCIA=CP.CODICE_PROVINCIA;DBMS_OUTPUT.PUT_LINE('Media极权制‘\’相对论性‘alla alla totali di’而今省( provincia Di):‘END _IF’);END IF;EXCEPTION WHEN WHEN Provincia_Errata DBMS_OUTPUT.PUT_LINE('La Provincia selezionata non‘);END;END Media_Casi_totali;
发布于 2020-07-08 11:33:43
无效语法,在这里:
select count(*| INT) Cont应该是
select count(*) into ContCREATE 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;发布于 2020-07-08 11:37:34
当然,在用没有很好编码的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>问候
https://stackoverflow.com/questions/62793741
复制相似问题