我是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变量。
(注意:我只查找了语法错误,没有试图理解代码的作用。(