首页 文章

存储过程 . RefCursor声明问题

提问于
浏览
1

我正在尝试编写一个存储过程,我使用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 回答

  • 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;
    

    结束;

    试试这个它会起作用 .

相关问题