まず、DML を使用して関数を呼び出すことはできません。 selectステートメントでその中に。次のように、出力をPL/SQLブロックの変数に割り当てる必要があります。
declare
l_output number;
begin
l_output := my_function(variable1, variable2);
end;
関数でDMLを実行することは悪い習慣です。それはあなたが遭遇しているエラーを引き起こすという理由もあります。以下に詳述する手順を使用する必要があります。これのもう1つの理由は、常にnullを返すため、何も返す必要がないことです。
create or replace procedure my_procedure ( <variables> ) is
begin
insert into employees( <columns> )
values ( <values > );
end;
エラーの具体的な理由は次の行です:
tBirthdate := to_date('pBirthdate','dd/mm/yyyy');
pBirthdate
すでに文字列です。 '
を置くことによって その周りに文字列'pBirthdate'
を渡します 関数to_date
へ Oracleはこの文字列を日、月、または年に変換できないため、失敗します。
これは次のように書く必要があります:
tBirthdate := to_date(pBirthdate,'dd/mm/yyyy');
また、number(38,0)
を指定する必要はありません。 、number
と書くだけです 代わりに。
out
を使用して、プロシージャから値を返すことができます。 キーワード。 empid
を返したいと仮定した場合 あなたが書くことができるのは次のようなものです:
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;
プロシージャを実行するには、次のように呼び出します。
begin
A1SF_ADDEMP( EmpName, TaxFileNo, Gender
, Salary, Birthdate);
commit;
end;
empid
を返したい場合 次に、次のように呼び出すことができます:
declare
l_empid number;
begin
l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
, Salary, Birthdate);
commit;
end;
commit
をどのように移動したかに注目してください 最高レベルでは、これは、やらなければならないことがもっとあるかもしれないときに、すべての手順で何かをコミットすることを避けるためです。
ちなみに、Oracle 11gを使用している場合は、値A1Seq_Emp.nextval
を割り当てる必要はありません。 変数に。 values
のテーブルに直接挿入するだけです。 リスト。もちろん、返品することはできませんが、A1Seq_Emp.curval
、シーケンスから値を取得するものが他にない限り。