1

同じセットの Column Name (52+ coulmns) を持つ 2 つのテーブルがあります。これらの列間で変更されたレコードがあるかどうかを比較する Oracle 関数を作成する必要があります。EMP_ID主キーです

以下の関数を使用しようとしていますが、間違った結果が得られます。次のように関数を呼び出しています。

get_data_change (emp_id, 'DEPT_NAME');
get_data_change (emp_id, 'PHONE_NUMBER');

私が作成した関数:

CREATE OR REPLACE function  get_data_change (
    in_emp_id varchar2, in_Column_Name varchar2)
return char is

  v_data_changed char;
begin
  select eid, in_Column_Name
    into v_table1_eid, v_table1_Column_Value
    from table 1
   where eid=in_emp_id;

  Select eid, in_Column_Name
    into v_table2_eid, v_table2_Column_Value
    from table 2
   where eid = in_emp_id;


  if ( v_table2_Column_Value != v_table1_Column_Value) 
  then 
    v_data_changed := 'Y'
  else 
    v_data_changed :='N'
  endif
  return v_data_changed 
end
end get_data_change;
4

1 に答える 1

2

in_Column_Nameなどのリテラル文字列値を割り当てる文字列変数です'DEPT_NAME'

したがって、クエリはこれをリテラル文字列値として解釈し、同じものを に返しますv_table1_Column_Value

期待どおりのことを行うには、次のような動的 SQL を使用する必要があります。

EXECUTE IMMEDIATE 'select eid, ' || in_Column_Name
               || ' from table1 where eid=:P_emp_id'
into v_table1_eid, v_table1_Column_Value
using in_emp_id;

ここで、SQL インジェクションの可能性に注意する必要があります。つまり、 の値をin_Column_Nameエンドユーザーが提供することはできません。

于 2013-08-28T08:04:29.007 に答える