1

我有 2 个具有相同设置的 Column Name (52+ coulmns) 的表。我需要编写一个 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 回答