Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Gespeicherte Funktion in Oracle fügt keine Werte in die gewünschte Tabelle ein

Erstens können Sie keine Funktion mit DML aufrufen darin in einer ausgewählten Anweisung. Sie müssen die Ausgabe einer Variablen in einem PL/SQL-Block zuweisen, etwa so:

declare
  l_output number;
begin
  l_output := my_function(variable1, variable2);
end;

Es ist keine gute Praxis, DML in einer Funktion auszuführen; teilweise, weil es die Fehler verursacht, auf die Sie stoßen. Sie sollten ein Verfahren wie unten beschrieben verwenden. Der andere Grund dafür ist, dass Sie wie immer null zurückgeben, es besteht keine Notwendigkeit, überhaupt etwas zurückzugeben!

create or replace procedure my_procedure ( <variables> ) is
begin

   insert into employees( <columns> )
   values ( <values > );

end;

Der genaue Grund für Ihren Fehler ist diese Zeile:
tBirthdate := to_date('pBirthdate','dd/mm/yyyy');

pBirthdate ist bereits eine Zeichenfolge; durch Setzen eines ' darum herum übergeben Sie den String 'pBirthdate' zur Funktion to_date und Oracle kann diesen String nicht in einen Tag, Monat oder Jahr umwandeln, also schlägt es fehl.

Sie sollten dies folgendermaßen schreiben:
tBirthdate := to_date(pBirthdate,'dd/mm/yyyy');

Sie müssen auch nicht number(38,0) angeben , Sie können einfach number schreiben stattdessen.

Mit out ist es möglich, einen Wert aus einer Prozedur zurückzugeben Stichwort. Wenn wir davon ausgehen, dass Sie empid zurückgeben möchten könntest du etwa so schreiben:

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;

Um die Prozedur einfach auszuführen, rufen Sie sie wie folgt auf:

begin

    A1SF_ADDEMP( EmpName, TaxFileNo, Gender
               , Salary, Birthdate);
    commit;

end;

Wenn Sie die empid zurückgeben möchten dann kannst du es so nennen:

declare

   l_empid number;

begin

   l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
                         , Salary, Birthdate);
   commit;
end;

Beachten Sie, wie ich das commit verschoben habe Auf der höchsten Ebene bedeutet dies, zu vermeiden, dass Sie in jedem Verfahren Dinge festschreiben, wenn Sie möglicherweise mehr Dinge zu tun haben.

Übrigens, wenn Sie Oracle 11g verwenden, müssen Sie den Wert A1Seq_Emp.nextval nicht zuweisen zu einer Variablen. Sie können es einfach direkt in die Tabelle in den values einfügen aufführen. Sie können es natürlich nicht zurückgeben, aber Sie könnten A1Seq_Emp.curval , solange nichts anderes Werte aus der Sequenz erhält.