它不起作用,在WITH
子句中是不可能的?
WITH start1 AS
(
BEGIN
EXECUTE immediate 'Select 1 from dual';
END;
)
SELECT * FROM start1
答案 0 :(得分:1)
如果您尝试在WITH
子句中使用允许PL / SQL的Oracle 12c功能,则表示您没有正确使用它。
请记住,您提交的每个SQL语句都必须具有一组明确定义的列,它将返回。记住这一点,你将有两个选择来完成你所追求的目标。
此选项不要求您知道动态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`).
此选项要求您为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