Инструкция PL / SQL игнорируется: отсутствует выражение - PullRequest
0 голосов
/ 20 октября 2018

У меня есть небольшая БД с 3 таблицами: account, account_statements и операции с аккаунтом.Мне нужно знать:

  1. все кредитные операции периода

  2. все операции с дебетами за период

  3. остаток на любую дату

Мой скрипт:

    CREATE TABLE account 
(
   id number(10) NOT NULL,
   account number(20) NOT NULL,
   CONSTRAINT account_id PRIMARY KEY (id)
);


CREATE TABLE account_statements
(
   id number(10) NOT NULL,
   account_id number(10) NOT NULL,
   statement_date date,
   inbalance number(20,2),
   outbalance number (20,2),
   CONSTRAINT statement_id PRIMARY KEY (id),
   CONSTRAINT account_statements_foreign_id FOREIGN KEY (account_id) REFERENCES account(id)
);


CREATE TABLE account_operations
(
   id number(10) NOT NULL,
   account_id number(10) NOT NULL,
   operdate date,
   summ number(20,2),
   opertype char(6),
   CONSTRAINT operations_id PRIMARY KEY (id),
   CONSTRAINT account_operations_foreign_id FOREIGN KEY (account_id) REFERENCES account(id)
);

CREATE OR REPLACE FUNCTION Get_debet_on_period (
   v_startdate IN date,
   v_enddate IN date,
   v_account IN account.account%TYPE)
RETURN number
IS
   v_debet_summ number(20,2);
BEGIN
   SELECT SUM(summ) INTO v_debet_summ
   FROM account_operations ao,
      account a
   WHERE ao.operdate between v_startdate AND v_enddate
      AND ao.opertype='DEBET'
      AND a.account=v_account
      AND ao.account_id=a.id;

    RETURN v_debet_summ;
END;

CREATE OR REPLACE FUNCTION Get_credit_on_period (
   v_startdate IN date,
   v_enddate IN date,
   v_account IN account.account%TYPE)
RETURN number
IS
   v_credit_summ number(20,2);
BEGIN
   SELECT SUM(summ) INTO v_credit_summ
   FROM account_operations ao,
      account a
   WHERE ao.operdate between v_startdate AND v_enddate
      AND ao.opertype='CREDIT'
      AND a.account=v_account
      AND ao.account_id=a.id;
    RETURN v_credit_summ;
END;

CREATE OR REPLACE FUNCTION Get_balance_on_date (
   v_date IN date,
   v_account IN account.account%TYPE)
RETURN number
IS 
   v_balance_summ number(20,2);
   v_startdate date; 
   v_startsumm number;
BEGIN
   SELECT MAX(as.statement_date) INTO v_startdate
   FROM account_statements as, account a
   WHERE a.id=as.account_id
   AND a.account=v_account
   AND as.statement_date<v_date;
   IF v_startdate IS NOT NULL THEN
      SELECT as.outbalance INTO v_startsumm
      FROM account_statement as, account a
      WHERE a.id=as.account_id
      AND a.account=v_account
      AND as.statement_date=v_statement_date;
      v_balance_summ:=v_startsumm+Get_credit_on_period(v_startdate, v_date, v_account)-Get_debet_on_period(v_startdate, v_date, v_account);
    ELSE
      v_startsumm:=0;
      v_balance_summ:=Get_credit_on_period(v_startdate, v_date, v_account)-Get_debet_on_period(v_startdate, v_date, v_account);
    END IF;

   RETURN v_balance_summ;
END;

У меня ошибка в функции Get_balance_on_date:

Ошибки: FUNCTION GET_BALANCE_ON_DATE Строка / столбец: 10/4 PL / SQL: оператор SQL игнорируется Строка / столбец: 10/15 PL / SQL: ORA-00936: отсутствует выражение Строка / столбец: 16/7 PL / SQL: оператор SQL игнорируется строка/ Col: 16/14 PL / SQL: ORA-00936: отсутствует выражение

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Ваша функция get_balance_on_date не компилируется.

  1. Вы используете таблицу account_statement, однако вы создали таблицу с именем во множественном числе account_statements.
  2. You 'используется зарезервированное ключевое слово AS в качестве псевдонима "account_statements as".Вам следует изменить псевдоним на другой.
  3. Вы используете необъявленную переменную "v_statement_date".

Фиксированная функция для вас:

CREATE OR REPLACE FUNCTION get_balance_on_date
(
    v_date    IN DATE
   ,v_account IN account.account%TYPE
) RETURN NUMBER IS
    v_balance_summ NUMBER(20, 2);
    v_startdate    DATE;
    v_startsumm    NUMBER;
    v_statement_date DATE; -- Remove this if you don't need, created this for function to compile
BEGIN
    SELECT MAX(stm.statement_date)
      INTO v_startdate
      FROM account_statements stm
          ,account            a
     WHERE a.id = stm.account_id
       AND a.account = v_account
       AND stm.statement_date < v_date;

    IF v_startdate IS NOT NULL
    THEN
        SELECT stm.outbalance
          INTO v_startsumm
          FROM account_statements stm
              ,account           a
         WHERE a.id = stm.account_id
           AND a.account = v_account
           AND stm.statement_date = v_statement_date;

        v_balance_summ := v_startsumm +
                          get_credit_on_period(v_startdate, v_date, v_account) -
                          get_debet_on_period(v_startdate, v_date, v_account);
    ELSE
        v_balance_summ := get_credit_on_period(v_startdate, v_date, v_account) -
                          get_debet_on_period(v_startdate, v_date, v_account);
    END IF;

    RETURN v_balance_summ;
END;
0 голосов
/ 20 октября 2018

Вы используете зарезервированное ключевое слово в качестве псевдонима.

FROM account_statements as, account a

as необходимо заменить на что-то другое, поскольку оно является частью языка SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...