在sql中使用pl sql变量选择值

时间:2014-10-08 08:36:48

标签: select plsql

我有一个功能,我希望根据参数从表中获取信息。

p_text就像' name' ,或者发送电子邮件'或者生日'所以在我的cursist表中,就像调用select cursist.name,cursist.email或cursist.birthday。

get_cursist_info(p_app =>:APP_USER,p_text =>' name')

这是我的功能:

create or replace function get_cursist_info(p_app in varchar2, p_text in varchar2)
return varchar
is
v_userid varchar(200);
v_text varchar(200);
v_test varchar(200):= p_text;

begin

v_userid := get_cursist_id2(p_app);

select v_test
into v_text
from cursist
where cursist.cursistid = v_userid;

return v_text;
end get_cursist_info;

它现在所做的就是获取变量v_test(名称)而不是cursists名称(Dave)。

是否可以在select中使用pl sql变量?我真的不想为此制作8个函数.. :)

2 个答案:

答案 0 :(得分:0)

您需要动态创建查询:

create or replace function get_cursist_info(p_app in varchar2, p_text in varchar2)
    return varchar
is
  v_userid varchar2(200);
  v_text   varchar2(200);
  v_test   varchar2(200):= p_text;
  v_sql    varchar2(1000);
begin

  v_userid := get_cursist_id2(p_app);

  v_sql := 'select cursist.' || v_test || ' from cursist where cursist.cursistid = ' || v_userid;
  execute immediate v_sql into v_text;

  return v_text;
end get_cursist_info;

希望有所帮助。

答案 1 :(得分:0)

您可以在没有使用CASE子句效率较低的动态sql的情况下执行此操作:

select CASE v_test
        WHEN 'name' THEN name
        WHEN 'email' THEN email
        WHEN 'birthday' THEN birthday
        ELSE null
       END
into v_text
from cursist
where cursist.cursistid = v_userid;