可以在sql语句中使用的函数

时间:2012-09-17 07:02:02

标签: sql database function oracle10g sql-function

我有一个返回3条记录的SQL

select emp_no from employees where dept_no='S3407'

结果

1089
2092
1999 

我需要在函数和函数中使用上面的SQL应该返回所有三个值。 我想在另一个sql语句中使用此函数,如下所示

select * from emp_history where emp_no in ('1089','2092','1999');

在上面的sql中,我想使用该函数而不是硬编码的员工编号。

实现这一目标的最佳方法是什么?

由于查询非常复杂,因为我上面提到的只是查询的一个示例,因为无法在此处粘贴完整查询。所以我需要使用一个函数来实现这一点。

任何帮助都非常值得赞赏。

问候

4 个答案:

答案 0 :(得分:1)

您可以使用视图:

create view vw_MyView 
as
select  emp_no 
from    employees 
where   dept_no = 'S3407'

您可以在第二个查询中使用该视图:

select * from emp_history where emp_no in (select emp_no from vw_MyView);

答案 1 :(得分:1)

我建议你考虑Andomar的建议,理由如下: 1.视图允许提供足够的封装级别 2. CBO对视图的工作几乎完美,因此根据记录数量,您的查询或多或少可以预测。

一旦用函数替换视图,当CBO无法估计函数的基数时,您将面临这种情况,因此您要么提交完整扫描或实现一种包,以便计算函数的基数。 / p>

所以+`1给Andomar

当然,您可以使用流水线功能并将查询重写为

 select * from emp_history where emp_no in (select * from table(your pipelined function))

但正如我之前解释的那样,这不是最好的方式

您可以在链接http://www.oracle-base.com/articles/misc/pipelined-table-functions.php

中找到关于流水线功能的完美文章(我的意见)

答案 2 :(得分:0)

您可以在不使用函数的情况下在此处创建子查询。

SELECT *
FROM   emp_history
WHERE  emp_no IN 
        (
            SELECT emp_no
            FROM employees
            WHERE dept_no = 'S3407'
        );

答案 3 :(得分:0)

您可以尝试使用以下方法。

CREATE FUNCTION GetEmpNos 
(   
    @dept_no varchar(10)
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT emp_no from employees Where dept_no = @dept_no
)
GO

并使用此功能,如下所示。

select * from emp_history where emp_no in (select * from dbo.GetEmpNos('S3407'));

对于oracle 10g,请尝试使用以下代码。

CREATE TYPE my_emp_type_coll IS TABLE OF my_emp_type; 
/ 

CREATE OR REPLACE FUNCTION get_emp_no (p_dept_no IN VARCHAR(10))  
RETURN my_emp_type_coll PIPELINED IS 
BEGIN 
  FOR emp IN (SELECT * FROM employees WHERE dept_no=p_dept_no) LOOP 
  PIPE ROW(my_emp_type(emp.emp_no)); 
  END LOOP; 
  RETURN; 
END; 
/ 

SELECT * FROM emp_history WHERE emp_no IN (SELECT * FROM TABLE(get_emp_no('S3407')));