【问题标题】:PLS-00103: Encountered the symbol "SELECT"PLS-00103:遇到符号“SELECT”
【发布时间】:2019-04-29 10:20:47
【问题描述】:

我目前正在尝试有条件地打开游标,但编译器正在输出 PLS-00103:遇到符号“SELECT”。

CREATE OR REPLACE PROCEDURE proc_faturas_nao_liquidadas(data_inicio IN FATURA.data_emissao%TYPE,
                                                            data_fim    IN FATURA.data_emissao%TYPE)
    IS
  curs_faturas   SYS_REFCURSOR;

  BEGIN
    IF (data_inicio is null or data_fim is null)
    then
      open curs_faturas for (SELECT f.NR_FATURA, f.DATA_EMISSAO, f.VALOR_BASE_PAGAR
                             FROM FATURA f,
                                  PAGAMENTO p
                             where p.NR_FATURA = f.NR_FATURA
                               and ESTADO != 'PAGO'
                             ORDER BY f.DATA_EMISSAO);       
    end if;
  END;

最终目标是在循环上使用光标来打印行。我试过了,查询可以独立运行。

【问题讨论】:

  • @BarbarosÖzhan 这不是问题。 PAGO 不是列。这是一个字符串。问题实际上是程序或某些东西与查询发生冲突
  • ok formattin 更清楚了。

标签: sql oracle stored-procedures plsql


【解决方案1】:

您需要删除 select 语句周围的括号,为此使用 ANSI-92 JOIN 标准,并更好地将过程转换为函数:

CREATE OR REPLACE FUNCTION proc_faturas_nao_liquidadas(
                               data_inicio FATURA.data_emissao%TYPE,
                               data_fim    FATURA.data_emissao%TYPE
                               )
          RETURN SYS_REFCURSOR IS
    curs_faturas SYS_REFCURSOR;

BEGIN
    IF (data_inicio is null or data_fim is null) THEN
      OPEN curs_faturas FOR 
      SELECT f.NR_FATURA, f.DATA_EMISSAO, f.VALOR_BASE_PAGAR
        FROM FATURA f
        JOIN PAGAMENTO p ON p.NR_FATURA = f.NR_FATURA
        WHERE ESTADO != 'PAGO'
        ORDER BY f.DATA_EMISSAO;       
    END IF;

    RETURN curs_faturas;
END; 

【讨论】:

  • 谢谢,问题出在括号里。
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 2018-01-23
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多