我有两个表具有相同的集合列名(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;发布于 2013-08-28 16:04:29
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的值不能由终端用户提供。
https://stackoverflow.com/questions/18482053
复制相似问题