Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL内部WITH子句_Sql_Oracle_Plsql - Fatal编程技术网

PL/SQL内部WITH子句

PL/SQL内部WITH子句,sql,oracle,plsql,Sql,Oracle,Plsql,它不起作用,在WITH子句中不可能吗 如果您试图在WITH子句中使用允许PL/SQL的Oracle12c特性,那么您没有正确地使用它 请记住,您提交的每个SQL语句都必须有一组定义良好的列,它将返回这些列。记住这一点,你将有两种选择来完成你所追求的目标 选项1-在选择结果中返回光标 此选项不要求您知道动态SQL语句的行类型,但使用查询结果的任何人/任何人都需要获取和处理游标。像这样: with function start1 return sys_refcursor is l_rc SYS_

它不起作用,在WITH子句中不可能吗


如果您试图在WITH子句中使用允许PL/SQL的Oracle12c特性,那么您没有正确地使用它

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

选项1-在选择结果中返回光标 此选项不要求您知道动态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的行类型 此选项要求您为动态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 

您正试图在一段SQL代码中使用PLSQL块,而不管使用什么。这是行不通的。您需要做什么?您使用的是哪个版本的Oracle?我相信这可能与12c有关。请参阅本文第9页。看起来您正在使用Oracle 12,它允许WITH子句中的函数和过程。但你在这里想做什么还不清楚。start1似乎是一个过程,语法无论如何都是错误的;从start1选择*是什么意思?从程序中选择是什么意思?这毫无意义。它不起作用意味着什么——至少告诉我们发生了什么,以及你的预期。除了前面提到的内容外,动态查询无论如何都不会执行,因为它没有选择任何内容。但是,您似乎在尝试的东西实际上并没有什么意义。可以构建返回动态结果集的SQL语句,如我的回答中所示。但实际上,这绝不是人们想要做的。除非OP有一些极端情况,否则他几乎肯定会使用你的一个建议。
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