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”:;