Oracle11g PLS-00103:遇到符号“;如果;当预期以下情况之一时

Oracle11g PLS-00103:遇到符号“;如果;当预期以下情况之一时,oracle11g,Oracle11g,以下是我在Oracle中的功能: create or replace FUNCTION CALCULATEINT ( DebtNo IN VARCHAR2 , JFlag IN VARCHAR2 , FloatingInterestRate IN NUMBER ) RETURN NUMBER IS AccInt NUMERIC(17,8):=0; BEGIN DECLARE PrincipalDue NUMERIC(11,2); InterestDue NUMERIC(

以下是我在Oracle中的功能:

create or replace
FUNCTION CALCULATEINT
( DebtNo IN VARCHAR2
, JFlag IN VARCHAR2
, FloatingInterestRate IN NUMBER
) RETURN NUMBER IS
AccInt NUMERIC(17,8):=0;
BEGIN
DECLARE 
      PrincipalDue NUMERIC(11,2);
      InterestDue NUMERIC(17,8); 

  IF (JFlag IN ('B', 'C', 'Y')) THEN
   BEGIN
        SELECT
            DEF_JUDG_PRINC_DUE ,
           DEF_JUDG_PRINC_RATE          
       bulk collect into PrincipalDue ,InterestDue 
        FROM
            DANT 
        WHERE
            AND DE_NO = DebtNo ;
      END;
  END IF;
  RETURN AccInt;
END;
我发现以下错误:

1.PLS-00103:在预期以下情况之一时遇到符号“如果”:开始函数pragma过程子类型当前光标删除存在在符号“开始”替换为“如果”之前继续

2.PLS-00103:在预期以下情况之一时遇到符号“文件结束”:(开始案例声明结束异常退出,如果循环mod null pragma raise return选择更新 将if语句从匿名开始之前移动到开始之后。 我确信这是错误的。 相应地,您还需要将end语句移动到end if块之后。
希望这有帮助。

函数定义不需要
声明
块。您也不能使用
批量收集
将数据存储在标量变量中。您需要将
批量收集
的结果存储到集合中。将变量定义在IS和BEGINI之间移动,因为批量收集到scal中ars,比如说没有名字的@a_horse_。另外,你必须保证只找到一行。注意你没有设置AccInt。
create or replace
FUNCTION CALCULATEINT
( DebtNo IN VARCHAR2
, JFlag IN VARCHAR2
, FloatingInterestRate IN NUMBER
) RETURN NUMBER IS
AccInt NUMERIC(17,8):=0;
BEGIN
DECLARE 
      PrincipalDue NUMERIC(11,2);
      InterestDue NUMERIC(17,8); 


   BEGIN
    IF (JFlag IN ('B', 'C', 'Y')) THEN
        SELECT
            DEF_JUDG_PRINC_DUE ,
           DEF_JUDG_PRINC_RATE          
       bulk collect into PrincipalDue ,InterestDue 
        FROM
            DANT 
        WHERE
            AND DE_NO = DebtNo ;

  END IF;
  END;
  RETURN AccInt;
END;