无法弄清楚为什么我得到ORA-24344:编译错误成功



我是pl-sql的新手,这是我为学校项目创建的第一个包。我正在使用浏览器版本oracleapex编译这段代码,我收到了上面提到的错误,不幸的是,我不知道如何调试它。我试着自己运行每个过程和函数,看看它们是否有效,我总是得到";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;

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

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

还有:

  • 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变量。

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

最新更新