存储过程ora-06550和ora-00905

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

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

yeotifhr1#

无效语法,此处为:

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;
bjp0bcyl

bjp0bcyl2#

当然,在用没有很好编码的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\u application\u error,因为我相信你的情况更复杂。如果有关联的pragma\u exception\u init来控制特定于oracle的异常,我会使用exception。如果是逻辑异常,则要在计数器为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>

当做

相关问题