我有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;
答案 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
的值。