sql >> データベース >  >> RDS >> Oracle

Oracleのストアド関数が目的のテーブルに値を挿入しない

    まず、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 、シーケンスから値を取得するものが他にない限り。



    1. 接続された.mdfデータベースを使用するためのWeb.configのDB接続文字列が機能しない

    2. エラー:列インデックスが範囲外です:1、列数:0

    3. ストアドプロシージャを挿入して更新する

    4. OracleDatabaseでNLSパラメータの値を確認する方法