【问题标题】:Can't figure why i get ORA-24344: success with compilation error不知道为什么我得到 ORA-24344:编译错误成功
【发布时间】:2021-04-09 11:22:17
【问题描述】:

我是 pl sql 的新手,这是我为学校项目创建的第一个包。我正在使用 oracle apex,浏览器版本来编译这段代码,我得到了上面提到的错误,不幸的是我不知道如何调试它。我尝试自己运行每个过程和函数,看看它们是否有效,我总是得到“PLS-00103:遇到符号“文件结尾”。

CREATE OR REPLACE PACKAGE package_farmacie AS
procedure stergere_angajat(nr_angajat angajati_f.ID%type);
procedure stergere;
function salariu_mediu return number;
procedure afisare;
numar_angajati_stersi integer;
sal_mediu number;
end;
CREATE OR REPLACE PACKAGE BODY package_farmacie AS
procedure produse;
procedure salariu_angajat;
procedure salariu_angajat is
    cursor c1 is select * from angajati_f where salariu <(select avg(salariu) from angajati_f) order by salariu;
    cursor c2 is select * from angajati_f where salariu >(select avg(salariu) from anagajati_f) order by salariu;
begin
dbms_output.put_line(‘Angajati cu salariu mai mic decat media’);
for i in c1 loop
dbms_output.put_line(i.ID||’ ‘||i.prenume||i.salariu);
exit when c1%notfound;
end loop;
dbms_output.put_line(‘Angajati cu salariu peste medie’);
for i in c2 loop
dbms_output.put_line(i.ID||’ ‘||i.prenume||i.salariu);
end loop;
end;


procedure stergere is
numar_angajati_stersi angajati_f.ID%type;
    begin
            select count(ID)
        into numar_angajati_stersi
        from sefi_schimb;
        delete from sefi_schimb;
        dbms_output.put_line('Au fost stersi '|| numar_angajati_stersi ||' angajati!');
    end;


function salariu_mediu return number is
    sal_mediu angajati_f.salariu%type;
    begin
       select avg(salariu)
       into sal_mediu
       from angajati_f;
       dbms_output.put_line('Salariul mediu este: '||sal_mediu);
       return sal_mediu;
       salariu_angajat();
    end;


function afisare_angajati return nume is
cursor afisare is SELECT nume FROM angajati_f;
nume_angajat angajati_f.nume%type;
begin 
open afisare;
loop
fetch afisare into nume_angajat;
if afisare%NOTFOUND then 
exit;
end if;
Dbms_output.put_line(‘Angajati gasiti:’||nume_angajat);
end loop;
close afisare;
end;


procedure stergere_angajat(nr_angajat angajati_f.ID%type) is
id_angajat angajati_f.ID%type;
    begin
            select ID
        into id_angajat
        from angajati_f
            where ID = nr_angajat;
            delete from angajati_f
            where ID = nr_angajat;
        dbms_output.put_line('Stergere cu succes!');
dbms_output.put_line('A(u)fost sters( e) '|| SQL%ROWCOUNT ||' rand(uri)!');
    exception
        when no_data_found then
           dbms_output.put_line('Id-ul angajatului nu exista!');
angajati := afisare_angajati();
dbms_output.put_line(angajati); 
    end;


procedure produse is
cursor c_produse (cod_produse_in IN varchar2)
is 
    select denumire
    from produse_f
    where cod = cod_produse_in;
prod_denumire produse_f.denumire%type;
begin
      dbms_output.put_line('Lista produselor in functie de cod: '||cod_produse_in);
open c_produse(cod_produse_in);
loop 
    fetch c_produse
          into prod_denumire;
          if (c_produse%notfound = true) then
                 close c_produse;
             return; 
          end if;
  dbms_output.put_line(prod_denumire);
end loop;     
end;      


procedure afisare is
    begin 
        produse();
    end;
end;


我检查了表格和列名中的拼写错误,它们写得正确,是语法还是整个代码一团糟?

【问题讨论】:

  • 我不熟悉使用 Apex 创建包。包和包主体语句之间是否需要一些分隔符?很多工具都可以。
  • 我没有将它们一起执行,我只是把它们放在这里以防万一
  • 你到底是在哪里运行这段代码的?
  • 该错误消息通常意味着您向数据库提交了一些尚未正确结束的内容。在这里,您需要分别提交包规范和包体。我不使用 APEX SQL gui 来运行 SQL,但我想您想在单独的行中的每个块之后粘贴 / 以提交它们。或者,您只想提交包规范代码,然后只需提交包主体代码。
  • 这就是我提交它的方式,首先是规范代码,然后是正文。仅在执行正文时出现错误

标签: oracle plsql package oracle-apex


【解决方案1】:

当我从您的问题中复制/粘贴时,您使用的是引号 ‘’,而您应该使用单引号 '。确保您用于创建包的任何用户界面都没有将单直引号 ' 替换为斜引号。

还有:

  • function afisare_angajati return nume
    

    应该返回一个数据类型而不是一个列标识符;如:

    function afisare_angajati return angajati_f.nume%TYPE
    
  • angajati := afisare_angajati();
    

    angajati 变量未声明;您可以将该行与下一行结合起来,不使用中间变量:

    dbms_output.put_line(afisare_angajati());
    
  • 此外,cod_produse_in 也未在游标外声明,即使您尝试将其用作游标外的 PL/SQL 变量。

(注意:我只是寻找语法错误,并没有试图理解代码的作用。)

【讨论】:

  • 谢谢,我更正了我的代码仍然得到同样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多