Function PLSQL:返回任意选择列的函数

Function PLSQL:返回任意选择列的函数,function,plsql,Function,Plsql,尽可能简化,而不是创建两个函数,如: get_emp_name( 123 ); get_emp_age( 123 ); 我想创建一个plsql函数,我可以指定我希望按以下方式筛选的列: get_emp(employee.column_name, employee.ID ) 示例: get_emp(employee.name,123); -- it will return 'John' get_emp(employee.age,123): -- it will return 40 这将使我

尽可能简化,而不是创建两个函数,如:

get_emp_name( 123 );
get_emp_age( 123 );

我想创建一个plsql函数,我可以指定我希望按以下方式筛选的列:

get_emp(employee.column_name, employee.ID )
示例:

get_emp(employee.name,123); -- it will return 'John'
get_emp(employee.age,123): -- it will return 40

这将使我很容易创建一个返回任意列的函数,但我无法在plsql oracle中创建它,所以你们能帮我创建它吗,非常感谢。

这并不是你们想要的,但也许你们最好创建函数返回记录

function get_emp(p_employee_id in employee.id%type) return employee%rowtype is
   l_emp employee%rowtype ;
begin
   select e.* into l_emp
     from employee e
    where e.id = p_employee_id;

   return l_emp;
end;
然后可以通过以下方式获取特定字段:

get_emp(123).name
get_emp(123).age
以下是一个工作示例:

SQL> create table employee (id number primary key, name varchar2(30), age number);

Table created.

SQL> insert into employee values (1, 'Smith', 28);

1 row created.

SQL> insert into employee values (2, 'Jones', 30);

1 row created.

SQL> insert into employee values (3, 'Brown', 34);

1 row created.

SQL> create function get_emp(p_employee_id in employee.id%type) return employee%rowty
  2     l_emp employee%rowtype ;
  3  begin
  4     select e.* into l_emp
  5       from employee e
  6      where e.id = p_employee_id;
  7
  8     return l_emp;
  9  end;
 10  /

Function created.

SQL> begin
  2    dbms_output.put_line('Name = ' || get_emp(1).name);
  3    dbms_output.put_line('Age = ' || get_emp(1).age);
  4  end;
  5  /
Name = Smith
Age = 28
当然,最后一个PL/SQL块不是很有效,因为它调用函数(因此调用查询)两次。更有效的版本是:

declare
  l_emp employee%rowtype;
begin
  l_emp := get_emp(1);
  dbms_output.put_line('Name = ' || l_emp.name);
  dbms_output.put_line('Age = ' || l_emp.age);
end;
/

您可以使用动态sql来实现这一点

function get_emp (v_column in varchar2, v_id in number)
  return varchar2
is
  v_sql varchar2(4000);
  v_value varchar2(4000);
begin

   v_sql := 'select ' || v_column || ' into :x from employee where id = ' || v_id;
   execute immediate v_sql into v_value;

  return v_value;

end get_emp;

在发布代码时,您应该尝试解释代码。此外,缩进从4个空格开始,而不是2个空格。请编辑此内容并查看预览以确保代码正确显示。为了防止SQL注入,应使用绑定变量而不是串联。最好这样编写代码:v_sql:=“从employee中选择”|| v|u column |“id=:1”;使用v_id将立即v_sql执行为v_值;谢谢你的回答,但我试图完全按照你说的去做,我得到了这个错误:“ORA-00902:无效数据类型”。如果你能帮我更多的忙,我会感谢你。我已经编辑了答案。也许完整的示例会对您有所帮助。如果我尝试通过常规的“Select”语句调用您的函数,它将不起作用,并且会出现与我之前所说的相同的错误,但是如果我使用dbms_output.put_line,它将起作用。你能给我解释一下为什么会发生这种情况吗?简而言之:因为employee%rowtype只是一种PL/SQL类型,因此不能在纯SQL中使用。您必须返回对象类型才能在SQL中使用它。顺便问一下:为什么需要在select语句中使用它?你想实现什么?很抱歉没有快速回复,我刚刚结束了假期:),我想这样做的原因是因为我在数据仓库工作,我们经常收到不同的ad hock报告,所以我问的这个PL/SQLfunction将使我很容易获得我想要的列,而不是加入许多表。