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