PLSQL:函数 return 任何选择的列

PLSQL: function that return any column of choice

尽可能简单,而不是创建几个函数,例如:

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

这将使我可以轻松地创建一个函数,该函数将 return 任何选择的列,但我无法在 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;