PLSQL:返回任何选择列的函数

时间:2015-01-08 14:03:13

标签: 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

这将使我很容易创建一个将返回任何选择列的函数,但我无法在plsql oracle中创建它,所以你们可以帮助我创建它,非常感谢。< / p>

2 个答案:

答案 0 :(得分:3)

这不完全是您想要的,但也许您最好创建函数返回记录

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;
/

答案 1 :(得分:0)

您可以使用动态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;