Za prvé nemůžete volat funkci pomocí DML v něm ve vybraném příkazu. Výstup musíte přiřadit proměnné v bloku PL/SQL, něco jako:
declare
l_output number;
begin
l_output := my_function(variable1, variable2);
end;
Dělat DML ve funkci je špatná praxe; částečně proto, že způsobuje chyby, na které narazíte. Měli byste použít postup popsaný níže. Dalším důvodem je to, že jako vždy vracíte hodnotu null a není třeba vracet vůbec nic!
create or replace procedure my_procedure ( <variables> ) is
begin
insert into employees( <columns> )
values ( <values > );
end;
Konkrétním důvodem vaší chyby je tento řádek:tBirthdate := to_date('pBirthdate','dd/mm/yyyy');
pBirthdate
je již řetězec; vložením '
kolem něj předáváte řetězec 'pBirthdate'
na funkci to_date
a Oracle nedokáže tento řetězec převést na den, měsíc nebo rok, takže selhává.
Měli byste to napsat jako:tBirthdate := to_date(pBirthdate,'dd/mm/yyyy');
Také nemusíte zadávat number(38,0)
, stačí napsat number
místo toho.
Je možné vrátit hodnotu z procedury pomocí out
klíčové slovo. Pokud předpokládáme, že chcete vrátit empid
můžete napsat něco takového:
create or replace procedure A1SF_ADDEMP (
pEmpName in varchar2
, pTaxFileNo in varchar2
, pGender in varchar2
, pSalary in number
, pBirthdate in varchar2
, pEmpid out number
) return varchar2 is
begin
pempid := A1Seq_Emp.nextval;
Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
Values ( pEmpId, pEmpName, pTaxFileNo, pGender
, pSalary, to_date(pBirthdate,'dd/mm/yyyy');
end;
Chcete-li pouze provést proceduru, zavolejte ji takto:
begin
A1SF_ADDEMP( EmpName, TaxFileNo, Gender
, Salary, Birthdate);
commit;
end;
Pokud chcete vrátit empid
pak to můžete nazvat takto:
declare
l_empid number;
begin
l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
, Salary, Birthdate);
commit;
end;
Všimněte si, jak jsem přesunul commit
na nejvyšší úroveň, je to proto, abyste se vyhnuli spáchání věcí v každé proceduře, když můžete mít více věcí, které musíte udělat.
Mimochodem, pokud používáte Oracle 11g, není třeba přiřazovat hodnotu A1Seq_Emp.nextval
do proměnné. Stačí jej vložit přímo do tabulky v values
seznam. Samozřejmě to nebudete moci vrátit, ale můžete vrátit A1Seq_Emp.curval
, pokud nic jiného nezíská hodnoty ze sekvence.