PL子句在WITH子句中

时间:2017-02-10 15:38:59

标签: sql oracle plsql

它不起作用,在WITH子句中是不可能的?

WITH start1 AS 
(
  BEGIN
    EXECUTE immediate 'Select 1 from dual';
  END;
)
SELECT * FROM start1

1 个答案:

答案 0 :(得分:1)

如果您尝试在WITH子句中使用允许PL / SQL的Oracle 12c功能,则表示您没有正确使用它。

请记住,您提交的每个SQL语句都必须具有一组明确定义的列,它将返回。记住这一点,你将有两个选择来完成你所追求的目标。

选项1 - 在SELECT结果

中返回光标

此选项不要求您知道动态SQL语句的行类型,但无论谁/消耗您的查询结果,都需要获取并处理游标。像这样:

with function start1 return sys_refcursor is
  l_rc SYS_REFCURSOR;
BEGIN
  OPEN l_rc FOR 'SELECT 1 FROM DUAL';
  RETURN l_rc;
END;
select start1 from dual;

START1           
---------------- 
(Cursor)         

The (cursor) value in the result set is the result set of the dynamic SQL statement (i.e., `SELECT 1 FROM DUAL`).

选项2 - 提前了解并使用动态SQL的行类型

此选项要求您为rowtype创建对象类型,并为动态SQL的行类型创建表。

CREATE OR REPLACE TYPE rc_rowtype IS OBJECT ( val NUMBER );

CREATE OR REPLACE TYPE rc_tabtype IS TABLE OF rc_rowtype;

with function start1 return rc_tabtype is
  l_results rc_tabtype;
  l_rc SYS_REFCURSOR;
BEGIN
  OPEN l_rc FOR 'SELECT rc_rowtype(1) FROM DUAL';
  FETCH l_rc BULK COLLECT INTO l_results;
  CLOSE l_rc;
  DBMS_OUTPUT.PUT_LINE('l_results.COUNT = ' || l_results.count);
  RETURN l_results;
END;
select * FROM table(start1);

VAL                                          
--- 
  1