如何在oracle plsql的with子句中使用动态sql

时间:2015-04-06 12:01:31

标签: oracle plsql

我在我的函数中使用with子句,其中将表名作为参数传递。因此,希望在查询中使用此表名,但是表格不会退出。示例查询

with EMP_A as(
select EMPNO, SAL 
from EMP 
where DEPTNO in (select DEPTNO from P_TABLE_NAME))

select * from EMP;

1 个答案:

答案 0 :(得分:1)

在您的以下发布的查询中:

 With emp_a as ( 
       select empno,sal 
       from emp 
       where deptno in(select     deptno from p_table_name)
    )
    select * from emp; 
  • 首先,您不能在SQL 中拥有动态表名称。对象名称必须是静态的。您需要(ab)在 PL / SQL 中使用 EXECUTE IMMEDIATE 使其成为动态SQL。

  • 其次, CTE tablename 不同。您的CTE为emp_a,而您所指的表格为emp

  • 第三,当您必须多次使用子查询时,使用WITH子句,即子查询因子分析。因此,CTE将作为临时禁忌来保存子查询结果集。

请参阅文档以了解有关 EXECUTE IMMEDIATE 的更多信息。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm

更新示例

您可以使用字符串变量来分配动态查询。

DECLARE
  p_table_name VARCHAR2(30);
  l_sql     VARCHAR2(32767);
  l_value.  NUMBER;
BEGIN
   p_table_name := 'DEPARTMENT';
   l_sql := 'WITH clause...' || p_table_name || ' with clause contunied';
   EXECUTE IMMEDIATE l_sql INTO l_value;