sql >> Databáze >  >> RDS >> Oracle

Uložená funkce v Oracle nevkládá hodnoty do požadované tabulky

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.



  1. Efektivní čtení a import souborů CSV v Oracle PL/SQL

  2. Oracle Install for SSIS konektivita (a ovladače 32 64 bit)

  3. Jak získat výsledek funkce databáze Oracle přes ODBC?

  4. Zabránit automatickému potvrzení Oracle Connection pro zdroj dat JNDI na JBoss 7 (Jeeves DBMS)