存储过程。 RefCursor声明问题

时间:2013-11-23 17:30:13

标签: oracle stored-procedures plsql oracle-sqldeveloper

我正在尝试编写一个存储过程,我使用refcursor,但是当我尝试运行它时,Oracle告诉我没有声明refcursor

包装:

create or replace package types
as
type cursorType is ref cursor;
end;
/

步骤:

CREATE OR REPLACE PROCEDURE p_lista_veic_aluguer (
   ESCRITORIO IN INT,
   CATEGORIA  IN CHAR,
   DATA_INI   IN DATE,
   DATA_FIM   IN DATE,
   RETVAL     IN OUT types.cursorType 
) is
BEGIN
  open retval for
    SELECT B.COD_Veiculo,B.Marca 
      FROM VEICULO B
      LEFT JOIN ALUGUER A 
        ON A.COD_VEICULO = B.COD_VEICULO
       AND (data_ini BETWEEN A.DATA_LEVANTAMENTO AND A.DATA_ENTREGA
        OR  data_fim BETWEEN A.DATA_LEVANTAMENTO AND A.DATA_ENTREGA)
     WHERE A.COD_VEICULO IS NULL 
       AND B.DATA_MANUTENCAO IS NULL
       AND B.CATEGORIA = categoria
     ORDER BY f_menor_dist(B.ESCRITORIO_ATUAL,escritorio) ASC;
END p_lista_veic_aluguer;
/

测试:

SET DEFINE OFF;;
DECLARE
  ESCRITORIO NUMBER;
  CATEGORIA  CHAR(200);
  DATA_INI   DATE;
  DATA_FIM   DATE;
  variable RETVAL TYPES.cursorType;
BEGIN
  ESCRITORIO := 22;
  CATEGORIA  := 'A';
  DATA_INI   := '2012/11/23';
  DATA_FIM   := '2012/11/30';
  P_LISTA_VEIC_ALUGUER( ESCRITORIO => ESCRITORIO, 
                        CATEGORIA  => CATEGORIA, 
                        DATA_INI   => DATA_INI, 
                        DATA_FIM   => DATA_FIM, 
                        RETVAL     => RETVAL );
  /* Legacy output:
  DBMS_OUTPUT.PUT_LINE('RETVAL = ' || RETVAL);
  */
  print retval;
END;

错误:

  

错误报告:ORA-06550:linha 6,coluna 19:PLS-00103:遇到   期待下列之一时的符号“TYPES”:

     

:=。 (@%;非空范围默认字符符号“:=”是   替换“TYPES”继续。 ORA-06550:linha 16,coluna 9:   PLS-00103:当期待其中一个时遇到符号“RETVAL”   以下内容:

     

:=。 (@%;符号“:=”代替“RETVAL”   继续。   06550. 00000 - “行%s,列%s:\ n%s”   *原因:通常是PL / SQL编译错误。   *操作:

1 个答案:

答案 0 :(得分:1)

SET DEFINE OFF;
variable RETVAL refcursor;
DECLARE
  ESCRITORIO NUMBER;
  CATEGORIA  CHAR(200);
  DATA_INI   DATE;
  DATA_FIM   DATE;
  BEGIN
  ESCRITORIO := 22;
  CATEGORIA  := 'A';
  DATA_INI   := '2012/11/23';
  DATA_FIM   := '2012/11/30';
  P_LISTA_VEIC_ALUGUER( ESCRITORIO => ESCRITORIO, 
                        CATEGORIA  => CATEGORIA, 
                        DATA_INI   => DATA_INI, 
                        DATA_FIM   => DATA_FIM, 
                        RETVAL     => RETVAL );
  /* Legacy output:
  DBMS_OUTPUT.PUT_LINE('RETVAL = ' || RETVAL);
  */
  print retval;

结束;

试试这个它会起作用。