PLS-00103:ERROR。在遇到以下其中一项时遇到符号“BEGIN”:<an identifier =“”> <a double-quoted="" delimited-identifier=""></a> </an>

时间:2014-12-20 10:04:25

标签: plsql oracle11g

我创建了一个类型:

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>

2 个答案:

答案 0 :(得分:2)

尽管你对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语句。您在评论中提到Postgres。我对postgres一无所知,但如果你能在postgres中做到这一点,我可以证明你在Oracle PL/SQL中没有这样的东西。

我想这一切并没有带给你更多但是我必须同意a_horse_with_no_name你必须从第一个方面开始并开始学习PL/SQL

答案 1 :(得分:1)

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语句不同,后者可选择允许使用括号。

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