Oracle函数将hardCode列名称作为参数

时间:2013-08-28 07:44:55

标签: oracle function

我有2个表,其中包含相同的列名(52+ coulmns)。我需要编写一个Oracle函数来比较这些列之间是否有任何记录被更改。 EMP_ID是主要关键

我正在尝试使用以下功能,但它给我的结果不正确, 我这样称之为funcaiton:

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;

1 个答案:

答案 0 :(得分: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的值。