尽可能简单,而不是创建几个函数,如:
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>
答案 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;