【问题标题】:Stored Procedure ora-06550 and ora-00905存储过程 ora-06550 和 ora-00905
【发布时间】:2020-07-08 11:24:59
【问题描述】:

我创建了这个存储过程来显示一个省的平均病例。 当它获得一个有效的省份(与 PROVINCE 表比较)作为参数时,将引发 cont 变量。 如果未引发 cont=0 则 -> 异常。 如果它被提出然后 -> 继续执行程序,它应该输出我用 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;

【问题讨论】:

  • 您在begin 上方声明变量。如果你真的想用declare开始另一个块,你需要结束它以及过程。

标签: sql oracle stored-procedures datagrip


【解决方案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;

【讨论】:

  • 它编译但是当我这样做时:begin Media_Casi_totali('Napoli'); end; 我可以在控制台上看到正确的执行,但我看不到任何输出。我试图插入一个错误的省份,但它仍然编译没有给我例外。
  • 如果你看不到任何输出,你是set serveroutput on吗?如果没有,请这样做。否则你不会看到DBMS_OUTPUT.PUT_LINE的结果
  • 我试过了,但它是一个 SQL plus 函数,在 datagrip 上我不能使用它
  • 我不知道“datagrip”是什么,所以我不知道具体要做什么,但是 - 它应该有一些选项来显示输出;也许它是一个启用它的按钮,或者另一个选项卡,或者......我不知道是什么。
  • 是的,我找到了一个显示输出缓冲区的按钮,感谢您的帮助!
【解决方案2】:

当然,在解决了没有很好编码的 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>

问候

【讨论】:

  • PLS-00103:找到符号“文件结尾”而不是其中一个拖鞋:--( begin case declare end exception exit for goto if loop mod -- null pragma raise return select update while with -- -- --
  • 感谢您的评论,我编辑了答案并为您提供了一个测试示例
猜你喜欢
  • 2018-06-12
  • 2013-12-02
  • 2011-06-06
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2010-11-22
  • 1970-01-01
相关资源
最近更新 更多