0

で、パッケージを使用して従業員の給与を計算する必要があるシナリオがあります。これにより、前払いがある場合に正規従業員の残りの給与が得られ、計算された値が別のパッケージを使用して従業員によって指定された通貨に変換されます。

私がこれを行っている方法は次のとおりです。

CASE
  WHEN ( ai.employee_type = 'PERMANENT' and ai.payment_status_flag='Y')
  THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
  ELSE ail.amount_remaining
END amount_remaining,
CASE
  WHEN ( ai.salary_currency_code = NVL(find_currency('EMP_COMMON_CURRENCY'),ai.EMP_CURRENCY_CODE))
  THEN CASE
             WHEN ( ai.employee_type = 'PERMANENT' and ai.payment_status_flag='Y')
                THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
             ELSE ail.amount_remaining
  END
  ELSE EMP_API.convert_closest_amount_sql( x_from_currency => ai.EMP_CURRENCY_CODE ,x_to_currency => find_currency('EMP_COMMON_CURRENCY') ,x_amount =>( CASE
             WHEN ( ai.employee_type = 'PERMANENT' and ai.payment_status_flag='Y')
                THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
             ELSE ail.amount_remaining
END) ,x_max_roll_days => -1)
END EMP_CONVERTED_AMOUNT_REMAINING, 

クエリで以下の条件を 3 回繰り返しました。

WHEN ( ai.employee_type = 'PERMANENT' and ai.payment_status_flag='Y')
   THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
   ELSE ail.amount_remaining

このためのより簡単なアプローチはありますか?このようなコードの繰り返しを避けることはできますか?

4

2 に答える 2

0

すでに関数を使用しているEMP_UTILS_PKG.get_pay_amount_remainingため、ロジックをカプセル化する PL/SQL 関数を作成し、それを複数の場所で呼び出すだけです。

于 2013-03-20T11:36:24.097 に答える
0

FROMこれを簡素化するために、句でインライン ビューを使用できます。ライブ コードで結合を適切に使用します。

SELECT amount_remaining
     , CASE
          WHEN ai.salary_currency_code = NVL(find_currency('EMP_COMMON_CURRENCY')
                                            ,ai.EMP_CURRENCY_CODE)
               THEN amount_remaining

          ELSE EMP_API.convert_closest_amount_sql(
                   x_from_currency => ai.EMP_CURRENCY_CODE
                  ,x_to_currency => find_currency('EMP_COMMON_CURRENCY')
                  ,x_amount => amount_remaining
                  ,x_max_roll_days => -1)
        END EMP_CONVERTED_AMOUNT_REMAINING,
FROM (SELECT CASE
               WHEN ai.employee_type = 'PERMANENT'
                AND ai.payment_status_flag='Y'
                    THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
               ELSE ail.amount_remaining
             END amount_remaining
        FROM table_name);
于 2013-03-20T11:22:58.767 に答える