首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle函数将列名作为参数hardCode

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

Stack Overflow用户
提问于 2013-08-28 15:44:55
回答 1查看 2K关注 0票数 1

我有两个表具有相同的集合列名(52+ coulmns)。我需要编写一个Oracle函数来比较这些列之间是否有任何记录发生更改。EMP_ID是主键

我正在尝试使用下面的函数,但它给出了错误的结果,我像这样调用该函数:

代码语言:javascript
复制
get_data_change (emp_id, 'DEPT_NAME');
get_data_change (emp_id, 'PHONE_NUMBER');

我创建的函数:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2013-08-28 16:04:29

in_Column_Name是一个字符串变量,您将为其赋值一个文字字符串值,例如'DEPT_NAME'

因此,您的查询将其解释为文字字符串值,并将相同的内容返回到v_table1_Column_Value

要执行预期的操作,您需要使用动态SQL,如下所示:

代码语言:javascript
复制
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的值不能由终端用户提供。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18482053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档