我在我的函数中使用with子句,其中将表名作为参数传递。因此,希望在查询中使用此表名,但是表格不会退出。示例查询
with EMP_A as(
select EMPNO, SAL
from EMP
where DEPTNO in (select DEPTNO from P_TABLE_NAME))
select * from EMP;
答案 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;