存储过程ora-06550和ora-00905

时间:2020-07-08 11:24:59

标签: sql oracle stored-procedures datagrip

我创建了这个存储过程以便显示某省的平均情况。 当它获得一个有效的省(与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;

2 个答案:

答案 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>

致谢