Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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
如何在Oracle中将动态sql执行到游标中?_Sql_Oracle_Stored Procedures_Plsql_Cursor - Fatal编程技术网

如何在Oracle中将动态sql执行到游标中?

如何在Oracle中将动态sql执行到游标中?,sql,oracle,stored-procedures,plsql,cursor,Sql,Oracle,Stored Procedures,Plsql,Cursor,我在存储过程中将动态sql语句执行到sys_refcursor中时遇到问题。 我已经查阅了文档,我认为我正确地构建了我的过程,但我仍然不知道为什么会发生错误。 请看下面,我创建的内容: CREATE TABLE REKOM_CROSS_PROM ( LINIA_PROD VARCHAR2(20), ID_REKOM_OFERTA VARCHAR2(20), PRICE NUMBER, MAX_PRICE NUMBER ); / CREA

我在存储过程中将动态sql语句执行到sys_refcursor中时遇到问题。 我已经查阅了文档,我认为我正确地构建了我的过程,但我仍然不知道为什么会发生错误。 请看下面,我创建的内容:

CREATE TABLE REKOM_CROSS_PROM (
      LINIA_PROD VARCHAR2(20), 
      ID_REKOM_OFERTA VARCHAR2(20),
      PRICE NUMBER,
      MAX_PRICE NUMBER
    );
/

CREATE OR REPLACE TYPE prodType AS OBJECT (
p_line VARCHAR2(20)
,p_price NUMBER
);
/

CREATE OR REPLACE TYPE prodTypeList IS TABLE OF prodType;
/

CREATE OR REPLACE PROCEDURE my_proc (prodLines IN prodTypeList ,rekom OUT SYS_REFCURSOR)
IS
v_pLine VARCHAR2(20);
v_query VARCHAR2(4000);
BEGIN
  v_query := 'SELECT ID_REKOM_OFERTA FROM REKOM_CROSS_PROM WHERE 
LINIA_PROD=NULL';
FOR i IN 1 .. prodLines.COUNT
    LOOP
        v_pLine := prodLines(i).p_line;
        v_query := v_query || ' UNION ALL SELECT ID_REKOM_OFERTA FROM 
                    REKOM_CROSS_PROM WHERE LINIA_PROD=''' || v_pLine || '''';
    END LOOP;
OPEN rekom FOR v_query;
END my_proc;
/
当我想调用这个过程时,就会发生错误

set serveroutput on
    declare
    type1 prodTypeList := prodTypeList(prodType('test1',1), prodType('test2', 20));
    rc SYS_REFCURSOR;
    row varchar2(200);
BEGIN
    MY_PROC(type1, rc);
    fetch rc into row;
    while (rc%found) loop
    dbms_output.put_line(row);
end loop;
close rc;
end;
我得到的信息是:

ORA-20000:ORU-10027:缓冲区溢出,限制为1000000字节

*原因:存储过程“raise\u应用程序\u错误” 调用,这将导致生成此错误

*措施:按照错误消息或联系人中的说明更正问题 有关详细信息,请与应用程序管理员或DBA联系


sombody能帮我解决这个问题吗?

你有一个无限循环。这意味着您将永远调用dbms_output.put_行,或者直到它耗尽缓冲区空间并抛出该异常

BEGIN
  MY_PROC(type1, rc);
  -- fetch first row from result set
  fetch rc into row;
  -- check if last fetch found something - always true
  while (rc%found) loop
    dbms_output.put_line(row);
  end loop;
  close rc;
end;
每次在循环中检查第一次获取的结果时,如果有任何数据,该结果将保持为真。您需要在循环中每次提取:

BEGIN
  MY_PROC(type1, rc);
  -- fetch first row from result set
  fetch rc into row;
  -- check if last fetch found something
  while (rc%found) loop
    dbms_output.put_line(row);
    -- fetch next row from result set
    fetch rc into row;
  end loop;
  close rc;
end;
或者更常见的情况是,仅在循环内提取,并在未找到任何内容时停止,使用%notfound而不是%found:


与当前问题无关,但LINIA_PROD=NULL的谓词永远不会为真;null不等于或不等于任何其他值。您需要使用LINIA_PROD为NULL的位置。

您有一个无限循环。这意味着您将永远调用dbms_output.put_行,或者直到它耗尽缓冲区空间并抛出该异常

BEGIN
  MY_PROC(type1, rc);
  -- fetch first row from result set
  fetch rc into row;
  -- check if last fetch found something - always true
  while (rc%found) loop
    dbms_output.put_line(row);
  end loop;
  close rc;
end;
每次在循环中检查第一次获取的结果时,如果有任何数据,该结果将保持为真。您需要在循环中每次提取:

BEGIN
  MY_PROC(type1, rc);
  -- fetch first row from result set
  fetch rc into row;
  -- check if last fetch found something
  while (rc%found) loop
    dbms_output.put_line(row);
    -- fetch next row from result set
    fetch rc into row;
  end loop;
  close rc;
end;
或者更常见的情况是,仅在循环内提取,并在未找到任何内容时停止,使用%notfound而不是%found:


与当前问题无关,但LINIA_PROD=NULL的谓词永远不会为真;null不等于或不等于任何其他值。您需要使用LINIA\u PROD为NULL的位置。

该错误只意味着您超出了dbms\u输出缓冲区。您希望构造的查询找到多少行?为什么要构建这样的查询,而不是在查询中使用一组值?另外:=NULL从来都不是真的,您需要的是NULL。可能是@AlexPoole的重复,我希望只有3行。我不使用collection,因为我会在REKOM_CROSS_PROM price、max_price number中添加额外的列,之后我会更改WHERE子句,在price和max_price之间添加:'和p_price'。所以当我添加这个时,我不能像这样使用集合:在从prodlines中选择p_行的LINIA_PROD中,我不明白为什么不能仍然使用集合,但可能我遗漏了一些东西。不管怎么说,这个错误只是意味着超出了dbms_输出缓冲区。您希望构造的查询找到多少行?为什么要构建这样的查询,而不是在查询中使用一组值?另外:=NULL从来都不是真的,您需要的是NULL。可能是@AlexPoole的重复,我希望只有3行。我不使用collection,因为我会在REKOM_CROSS_PROM price、max_price number中添加额外的列,之后我会更改WHERE子句,在price和max_price之间添加:'和p_price'。所以当我添加这个时,我不能像这样使用集合:在从prodlines中选择p_行的LINIA_PROD中,我不明白为什么不能仍然使用集合,但可能我遗漏了一些东西。不管怎样,离题了……我没有注意到:D谢谢你的鹰眼:我没有注意到:D谢谢你的鹰眼: