用Oracle中的VIEW替换WITH子句

时间:2014-01-20 22:41:43

标签: sql oracle

我有这样的查询。

with test1 as (      
select emp.empno, emp.deptno, emp.name, emp.hiredate, dept.deptname  
from emp, dept  
where   
 emp.deptno = dept.deptno  
 and emp.deptno = 72  
 and emp.salary > 5000  
)  
select inner1.*  
from (  
select 'abc' as title,   
1 emp_order,  
name, hiredate, deptname  
from test1  
UNION ALL  
select 'xyz' as title,   
2 emp_order,  
name, hiredate, deptname
from test1
) inner1

我试图完全删除WITH子句并改为创建一个VIEW。我唯一的问题是WITH子句中的动态值。

我试过了:

CREATE VIEW testview as   
select emp.empno, emp.deptno, emp.name, emp.hiredate, dept.deptname  
from emp, dept  
where   
emp.deptno = dept.deptno   
and emp.deptno = 72   
and emp.salary > 5000   

更新了查询

select inner1.*   
   from (    
   select 'abc' as title,     
   1 emp_order,    
   name, hiredate, deptname     
   from testview    
   UNION ALL    
   select 'xyz' as title,     
   2 emp_order,   
   name, hiredate, deptname    
   from testview   
   ) inner1   

在这种情况下,如何在视图中传递salary和deptno cols的绑定值?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您想在视图中使用参数。

为此,您可以使用以下任一方法:

a。)如果您的参数或多或少是静态的并且不经常更改,则可以使用表来存储此参数的值。可以使用PL / SQL包或过程更新此表中的值。然后可以在您的视图中修改此表格。

b。)如果您为不同的会话需要不同的参数值,您也可以尝试使用给定的here

的应用程序上下文

希望有所帮助

Vishad

答案 1 :(得分:0)

您无需删除公用表表达式即可在视图中使用此查询。如果删除谓词并将它们应用于针对视图的查询,则无论如何它们都可以推入CTE内。

e.g。

CREATE VIEW testview as   
select emp.empno, emp.deptno, emp.name, emp.hiredate, dept.deptname, emp.salary
from emp join dept ON emp.deptno = dept.deptno;

select inner1.*   
from (    
  select 'abc' as title,     
         1 emp_order,    
         name, hiredate, deptname     
  from testview
  where deptno = 72 and salary > 5000     
  UNION ALL    
  select 'xyz' as title,     
         2 emp_order,   
         name, hiredate, deptname    
  from testview   
  where deptno = 72 and salary > 5000     
) inner1