存储过程ora-06550和ora-00905

hfyxw5xn  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(471)

我创建这个存储过程是为了显示一个省的平均值案例。当它获得一个有效的省(与省表比较)作为参数时,cont变量被提升。如果未引发cont=0,则->异常。如果它被提出,那么->继续te程序,它应该输出我用dbms\u output.put\u行写的行,它必须显示省的名称和案例数。不管怎样,它不起作用,我不明白为什么。我得到了ora-06550和ora-00905。

  1. CREATE OR REPLACE PROCEDURE Media_Casi_totali(Provincia IN PROVINCE.denominazione_provincia%TYPE)
  2. AS
  3. BEGIN
  4. DECLARE
  5. Media_dei_casi_totali COVID_PROVINCE.Totale_Casi%TYPE;
  6. Cont INTEGER;
  7. Provincia_Errata EXCEPTION;
  8. BEGIN
  9. select count(*| INT) Cont
  10. from PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA
  11. where p.denominazione_provincia=Provincia;
  12. IF (cont=0) then
  13. Raise Provincia_Errata;
  14. ELSE
  15. select ROUND(AVG(CP.TOTALE_CASI),3) INTO Media_dei_casi_totali
  16. FROM PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA=CP.CODICE_PROVINCIA
  17. WHERE P.DENOMINAZIONE_PROVINCIA=Provincia;
  18. DBMS_OUTPUT.PUT_LINE('Media dei casi totali' || 'relativi alla provincia di' || Provincia || ':' || Media_dei_casi_totali);
  19. END IF;
  20. EXCEPTION
  21. WHEN Provincia_Errata THEN
  22. DBMS_OUTPUT.PUT_LINE('La Provincia selezionata non esiste');
  23. END;
  24. END Media_Casi_totali;
yeotifhr

yeotifhr1#

无效语法,此处为:

  1. select count(*| INT) Cont

应该是

  1. select count(*) into Cont
  1. CREATE OR REPLACE PROCEDURE Media_Casi_totali (
  2. Provincia IN PROVINCE.denominazione_provincia%TYPE)
  3. AS
  4. BEGIN
  5. DECLARE
  6. Media_dei_casi_totali COVID_PROVINCE.Totale_Casi%TYPE;
  7. Cont INTEGER;
  8. Provincia_Errata EXCEPTION;
  9. BEGIN
  10. SELECT COUNT (*)
  11. INTO Cont
  12. FROM PROVINCE P
  13. INNER JOIN COVID_PROVINCE CP
  14. ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA
  15. WHERE p.denominazione_provincia = Provincia;
  16. IF (cont = 0)
  17. THEN
  18. RAISE Provincia_Errata;
  19. ELSE
  20. SELECT ROUND (AVG (CP.TOTALE_CASI), 3)
  21. INTO Media_dei_casi_totali
  22. FROM PROVINCE P
  23. INNER JOIN COVID_PROVINCE CP
  24. ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA
  25. WHERE P.DENOMINAZIONE_PROVINCIA = Provincia;
  26. DBMS_OUTPUT.PUT_LINE (
  27. 'Media dei casi totali'
  28. || 'relativi alla provincia di'
  29. || Provincia
  30. || ':'
  31. || Media_dei_casi_totali);
  32. END IF;
  33. EXCEPTION
  34. WHEN Provincia_Errata
  35. THEN
  36. DBMS_OUTPUT.PUT_LINE ('La Provincia selezionata non esiste');
  37. END;
  38. END Media_Casi_totali;
展开查看全部
bjp0bcyl

bjp0bcyl2#

当然,在用没有很好编码的cont变量解决问题之后,我会使它变得更简单。
更新缺少一个结尾

  1. CREATE OR REPLACE PROCEDURE Media_Casi_totali(Provincia IN PROVINCE.denominazione_provincia%TYPE)
  2. AS
  3. BEGIN
  4. DECLARE
  5. Media_dei_casi_totali COVID_PROVINCE.Totale_Casi%TYPE;
  6. Cont INTEGER;
  7. BEGIN
  8. dbms_output.enable(null);
  9. select count(*) into Cont
  10. from PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA
  11. where p.denominazione_provincia=Provincia;
  12. IF cont=0 then
  13. raise_application_error(-20001,'Error here - counter is 0');
  14. ELSE
  15. select ROUND(AVG(CP.TOTALE_CASI),3) INTO Media_dei_casi_totali
  16. FROM PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA=CP.CODICE_PROVINCIA
  17. WHERE P.DENOMINAZIONE_PROVINCIA=Provincia;
  18. DBMS_OUTPUT.PUT_LINE('Media dei casi totali' || 'relativi alla provincia di' || Provincia || ':' || Media_dei_casi_totali);
  19. END IF;
  20. END;
  21. EXCEPTION
  22. when others then raise;
  23. END Media_Casi_totali;

那就开始吧

  1. SQL> SET SERVEROUTPUT ON
  2. SQL> EXEC Media_Casi_totali ( Provincia => xxxx );

我更喜欢用raise\u application\u error,因为我相信你的情况更复杂。如果有关联的pragma\u exception\u init来控制特定于oracle的异常,我会使用exception。如果是逻辑异常,则要在计数器为0时引发错误。
测试用例

  1. SQL> create table province ( codice_provincia number , denominazione_provincia varchar2(100) );
  2. Table created.
  3. SQL> create table COVID_PROVINCE ( codice_provincia number , Totale_Casi number );
  4. Table created.
  5. SQL> CREATE OR REPLACE PROCEDURE Media_Casi_totali(Provincia IN PROVINCE.denominazione_provincia%TYPE)
  6. AS
  7. BEGIN
  8. DECLARE
  9. Media_dei_casi_totali COVID_PROVINCE.Totale_Casi%TYPE;
  10. Cont INTEGER;
  11. BEGIN
  12. dbms_output.enable(null);
  13. select count(*) into Cont
  14. from PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA = CP.CODICE_PROVINCIA
  15. where p.denominazione_provincia=Provincia;
  16. IF cont=0 then
  17. raise_application_error(-20001,'Error here - counter is 0');
  18. ELSE
  19. select ROUND(AVG(CP.TOTALE_CASI),3) INTO Media_dei_casi_totali
  20. FROM PROVINCE P INNER JOIN COVID_PROVINCE CP ON P.CODICE_PROVINCIA=CP.CODICE_PROVINCIA
  21. WHERE P.DENOMINAZIONE_PROVINCIA=Provincia;
  22. DBMS_OUTPUT.PUT_LINE('Media dei casi totali' || 'relativi alla provincia di' || Provincia || ':' || Media_dei_casi_totali);
  23. END IF;
  24. EXCEPTION
  25. when others then raise;
  26. end;
  27. 23 END Media_Casi_totali;
  28. 24 /
  29. Procedure created.
  30. SQL>

当做

展开查看全部

相关问题