Как решить эту проблему, в теле пакета? - PullRequest
0 голосов
/ 27 октября 2018

Как решить эту проблему, в теле пакета?

функция get_amount должна возвращать acc_amount для acc_id

функция get_date должна возвращать acc_date для acc_id

Как это сделать сфункции

и где есть ошибки в коде

CREATE OR REPLACE PACKAGE BODY account_api AS
    PROCEDURE add_new_account
        ( p_acc_id     accounts.acc_id%type
        , p_acc_name   accounts.acc_name%type
        , p_acc_amount accounts.acc_amount%type
        , p_acc_date   accounts.acc_date%type)
    IS
    BEGIN
        INSERT INTO account (acc_id, acc_name, acc_amount, acc_date)
        VALUES (acc_seq.nextval, p_acc_id, p_acc_name, p_acc_amount, p_acc_date);
    COMMIT;
    EXCEPTION
            WHEN OTHERS THEN
            ROLLBACK;
            RAISE;
    END;
    PROCEDURE upd_account
        (
          p_acc_id     accounts.acc_id%type
        , p_acc_name   accounts.acc_name%type
        , p_acc_amount accounts.acc_amount%type
        , p_acc_date   accounts.acc_date%type
    )
    IS
    BEGIN
        UPDATE accounts
            SET acc_naziv  = p_acc_naziv
              , acc_amount = p_acc_amount
              , acc_date   = p_acc_date
        WHERE acc_id = p_acc_id;
    COMMIT;
    END;
    PROCEDURE del_accounts
        (p_acc_id     accounts.acc_id%type)
    DELETE FROM accounts WHERE acc_id = p_acc_id;
    COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
      ROLLBACK;
      RAISE;
    END;
    FUNCTION get_amount
        (p_acc_id    accounts.acc_id%type)
    return Number is res number;
    begin 
        select acc_amount into res 
        from  account where acc_id =p_acc_id; 
        return res;
    end;
    FUNCTION get_date
        (p_acc_id    accounts.acc_id%type)
    RETURN date IS res1 date;
    BEGIN
        SELECT acc_date INTO res1
        FROM accounts WHERE acc_id = p_acc_id;
        RETURN res1;
        end;
   end account_api;
     /

1 Ответ

0 голосов
/ 27 октября 2018
  • Прежде всего вам необходимо определиться с именем таблицы accounts или account.Я предположил, что accounts для отредактированного блока кода, который появится ниже.

  • Для PROCEDURE add_new_account количество аргументов для значений
    список больше, чем количество аргументов для столбцасписок имен.

  • Для PROCEDURE upd_account, в выражении UPDATE не указан идентификатор, определенный как p_acc_naziv.
  • Для PROCEDURE del_accounts IS BEGIN деталь отсутствует

Перед package body должно быть package header как:

CREATE OR REPLACE PACKAGE account_api AS
    PROCEDURE add_new_account
        ( p_acc_id     accounts.acc_id%type
        , p_acc_name   accounts.acc_name%type
        , p_acc_amount accounts.acc_amount%type
        , p_acc_date   accounts.acc_date%type);

    PROCEDURE upd_account
        (
          p_acc_id     accounts.acc_id%type
        , p_acc_name   accounts.acc_name%type
        , p_acc_amount accounts.acc_amount%type
        , p_acc_date   accounts.acc_date%type
    );
    PROCEDURE del_accounts
        (p_acc_id     accounts.acc_id%type);

    FUNCTION get_amount
        (p_acc_id    accounts.acc_id%type)
    return Number;
    FUNCTION get_date
        (p_acc_id    accounts.acc_id%type)
    RETURN date;
end account_api;

, а package body должно быть как:

CREATE OR REPLACE PACKAGE BODY account_api AS
    PROCEDURE add_new_account
        ( p_acc_id     accounts.acc_id%type
        , p_acc_name   accounts.acc_name%type
        , p_acc_amount accounts.acc_amount%type
        , p_acc_date   accounts.acc_date%type)
    IS
    BEGIN
        INSERT INTO accounts(acc_id, acc_name, acc_amount, acc_date)
        VALUES (-- acc_seq.nextval, --> need to be removed
                p_acc_id, p_acc_name, p_acc_amount, p_acc_date);
    COMMIT;
    EXCEPTION
            WHEN OTHERS THEN
            ROLLBACK;
            RAISE;
    END;
    PROCEDURE upd_account
        (
          p_acc_id     accounts.acc_id%type
        , p_acc_name   accounts.acc_name%type
        , p_acc_amount accounts.acc_amount%type
        , p_acc_date   accounts.acc_date%type
    )
    IS
    BEGIN
        UPDATE accounts
            SET /*acc_naziv  = p_acc_naziv  -->  there's no identifier defined as p_acc_naziv
                                            -->> suppose you'd use "acc_name = p_acc_name" here.  
              , */acc_amount = p_acc_amount
              , acc_date   = p_acc_date
        WHERE acc_id = p_acc_id;
    COMMIT;
    END;
    PROCEDURE del_accounts
        (p_acc_id     accounts.acc_id%type)
    IS     -->  missing
    BEGIN  -->  missing
    DELETE FROM accounts WHERE acc_id = p_acc_id;
    COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
      ROLLBACK;
      RAISE;
    END;
    FUNCTION get_amount
        (p_acc_id    accounts.acc_id%type)
    return Number is res number;
    begin
        select acc_amount into res
        from  accounts where acc_id =p_acc_id;
        return res;
    end;
    FUNCTION get_date
        (p_acc_id    accounts.acc_id%type)
    RETURN date IS res1 date;
    BEGIN
        SELECT acc_date INTO res1
        FROM accounts WHERE acc_id = p_acc_id;
        RETURN res1;
        end;
   end account_api;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...