首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储过程ora-06550和ora-00905

存储过程ora-06550和ora-00905
EN

Stack Overflow用户
提问于 2020-07-08 11:24:59
回答 2查看 114关注 0票数 0

我创建这个存储过程是为了显示省份中的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;

EN

回答 2

Stack Overflow用户

发布于 2020-07-08 11:33:43

无效语法,在这里:

代码语言:javascript
复制
select count(*| INT) Cont

应该是

代码语言:javascript
复制
select count(*) into Cont

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-07-08 11:37:34

当然,在用没有很好编码的cont变量解决这个问题之后,我会让它变得更简单。

更新有一个缺失的结尾

代码语言:javascript
复制
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;

然后运行它

代码语言:javascript
复制
 SQL> SET SERVEROUTPUT ON 
 SQL> EXEC Media_Casi_totali ( Provincia => xxxx );

我更喜欢使用RAISE_APPLICATION_ERROR,因为在您的情况下,我相信它更容易使用。如果我有一个与之关联的pragma_exception_init来控制Oracle特定的异常,我会使用异常。在您的情况下是逻辑异常,如果计数器为0,则要引发错误。

测试用例

代码语言:javascript
复制
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>

问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62793741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档