PLS-00103:错误。在期望以下之一时遇到符号“BEGIN”:<an identifier> <a double-quoted delimited-identifier>

Posted

技术标签:

【中文标题】PLS-00103:错误。在期望以下之一时遇到符号“BEGIN”:<an identifier> <a double-quoted delimited-identifier>【英文标题】:PLS-00103: ERROR.Encountered the symbol "BEGIN" when expecting one of the following: <an identifier> <a double-quoted delimited-identifier> 【发布时间】:2014-12-20 10:04:24 【问题描述】:

我创建了一个类型:

CREATE OR REPLACE TYPE NAGULIVE.DEPOSIT_DATA_TYPE AS OBJECT (
  DEPOSIT_NO VARCHAR2 (16 Byte),
  ACCT_NAME VARCHAR2 (128 Byte),
  DEPOSIT_DT DATE,
  EPOSIT_AMT NUMBER (16,2)
);

如果我执行该函数,它将显示错误。我不知道我错在哪里。

CREATE OR REPLACE FUNCTION NAGULIVE.GET_DEPOSIT_DETAIL (IN_F_DATE DATE,IN_T_DATE DATE)
RETURN(NAGULIVE.DEPOSIT_DATA_TYPE) AS
BEGIN
    RETURN QUERY(SELECT D.DEPOSIT_NO, ACCT_NAME, DEPOSIT_DT, DEPOSIT_AMT 
        FROM DEPOSIT_ACINFO D 
        INNER JOIN ACT_MASTER  A ON D.CUST_ID=A.CUST_ID 
        INNER JOIN DEPOSIT_SUB_ACINFO DS ON D.DEPOSIT_NO=DS.DEPOSIT_NO WHERE DS.DEPOSIT_DT>=IN_F_DATE  AND DS.DEPOSIT_DT<=IN_F_DATE); 
        END;
        /  

错误是

2/7     PLS-00103: Encountered the symbol "(" when expecting one of the following:
          <an identifier> <a double-quoted delimited-identifier> self
          long double ref char time timestamp interval date binary
          national character nchar
4/1     PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following:
          <an identifier> <a double-quoted delimited-identifier>

【问题讨论】:

PL/SQL 中没有return query。请阅读说明书 我使用的是 POSTGRESQL,因为那里有返回查询。好的。以及如何在功能中获得多个输出。 @suchith PLEASE YOU DON'T NEED TO YELL TO BE UNDERSTOOD HERE !!!! @suchithshivali:如果您希望任何人认真对待您,请解锁您的大写锁定键。 别对我们大喊大叫了!请阅读 Oracle 的 PL/SQL 手册 【参考方案1】:

就您对PL/SQL 的了解而言,我怀疑您自己编写了以上所有代码。错误消息是指不存在的函数QUERY

CREATE OR REPLACE FUNCTION NAGULIVE.GET_DEPOSIT_DETAIL (IN_F_DATE DATE,IN_T_DATE DATE)
RETURN(NAGULIVE.DEPOSIT_DATA_TYPE) AS
BEGIN
    RETURN QUERY(SELECT D.DEPOSIT_NO, ACCT_NAME, DEPOSIT_DT, DEPOSIT_AMT 
           ^^^^^


        FROM DEPOSIT_ACINFO D 
        INNER JOIN ACT_MASTER  A ON D.CUST_ID=A.CUST_ID 
        INNER JOIN DEPOSIT_SUB_ACINFO DS ON D.DEPOSIT_NO=DS.DEPOSIT_NO WHERE DS.DEPOSIT_DT>=IN_F_DATE  AND DS.DEPOSIT_DT<=IN_F_DATE); 
        END;
        / 

左括号表示您要向函数传递参数,但没有名为SELECT 等的变量。这当然看起来像SELECT 语句。您在 cmets 中提到了Postgres。我对 postgres 一无所知,但如果这是你可以在 postgres 中做的事情,我可以证明你在 Oracle PL/SQL 中没有这样的事情。

我想这一切并没有让你更进一步,但我必须同意 a_horse_with_no_name 你必须从第一格开始学习PL/SQL

【讨论】:

【参考方案2】:
create or replace function nagulive.get_deposit_detail(
    in_f_date date,
    in_t_date date
) return deposit_data_type
as
    v_deposit_data deposit_data_type;
begin
    select deposit_data_type(d.deposit_no, acct_name, deposit_dt, deposit_amt)
    into v_deposit_data
    from deposit_acinfo d
    inner join act_master  a on d.cust_id=a.cust_id
    inner join deposit_sub_acinfo ds on d.deposit_no=ds.deposit_no
    where ds.deposit_dt>=in_f_date
        and ds.deposit_dt<=in_f_date;

    return v_deposit_data;
end;
/

虽然 SQL 和 PL/SQL 可以很好地协同工作,但它们并不是完全无缝的。与 PostgreSQL 不同,SQL 语句不能用作本机 PL/SQL 表达式。相反,必须声明一个变量,语句必须 SELECT INTO 该变量,然后返回该变量。

返回声明还有一个小的语法问题——返回类型周围不应该有括号。这与 return 语句不同,它可以选择允许括号。

这两个对我来说都是可以理解的错误,我不确定为什么这个问题会受到如此多的仇恨。

【讨论】:

谢谢先生。我还在学习 PL/SQL。但我需要在 Ireport Jasper 中开发一份报告。所以我问如何获得多个输出,如果我提供输入。这就是我面临的问题。非常感谢先生。

以上是关于PLS-00103:错误。在期望以下之一时遇到符号“BEGIN”:<an identifier> <a double-quoted delimited-identifier>的主要内容,如果未能解决你的问题,请参考以下文章

错误:PLS-00103:在预期以下情况之一时遇到符号“)”

为啥我会收到此错误? PLS-00103:在预期以下情况之一时遇到符号“CREATE”:

错误:PLS-00103:在预期以下情况之一时遇到符号“END”

PLS-00103:在预期以下情况之一时遇到符号“TEST_PKG”:;

错误:PLS-00103:在预期以下情况之一时遇到符号“AS”:返回

PLS00103:在预期以下情况之一时遇到符号“I”