PL / SQL:子程序或游标'P_STATUS_UPDATE'在程序包规范中声明,必须在程序包主体中定义

这是我的包装规格

create package fs_atm_trans_pkg
is
procedure p_status_update;

function f_get_status(i_customer_id number,i_pin_num number,i_account_balance number,v_customer_id number,v_pin_num number,v_account_balance number) 
return varchar;

end fs_atm_trans_pkg;

包装规格创建成功。

这是我的包裹身材。

create package body fs_atm_trans_pkg is

procedure p_status_update(v_result_cust varchar2,v_balance_nr number,i_trans_id number) is 
   cursor cur_tran is --select all data from transactions along with stored customer data,LEFT JOIN
    select * from bank_trans t left join bank_customer c
        on t.cust_id = c.customer_id left join bank_acct a on c.customer_pk=a.customer_fk
        for update of status;
        v_result_cust varchar2(50);
begin 
  for each_tra in cur_tran loop
  v_result_cust:= f_get_status(each_tra.CUST_ID,each_tra.PIN_NUMber,each_tra.accT_BAlance,each_tra.customer_id,each_tra.pin_num,each_tra.account_balance);

  if v_result_cust='Successful' then
        update bank_trans set bank_trans.acct_balance = v_balance_nr - bank_trans.acct_balance 
        where i_trans_id = bank_trans.transaction_id;
        update bank_trans set status = v_result_cust
        where i_trans_id = bank_trans.transaction_id;
        else 
        update bank_trans set status = v_result_cust
        where i_trans_id = bank_trans.transaction_id;
        end if;
  end loop;
end;

FUNCTION f_get_status(i_customer_id number,v_account_balance number) 
    RETURN VARCHAR2 IS
    r_trans_status varchar2(100); 

    BEGIN
        IF i_customer_id = v_customer_id then
                if i_pin_num = v_pin_num then
                    if i_account_balance < v_account_balance
                    then r_trans_status := 'Successful';
                    else r_trans_status := 'Insufficient Fund';
                    end if;
                else r_trans_status := 'Invalid Pin';
                end if;
        else r_trans_status := 'Invalid ID';
        END IF;
    RETURN r_trans_status; 
    end;


end fs_atm_trans_pkg;

运行程序包主体时,它发出如下错误:

  

不允许RECORD,TABLE或参数列表中的重复字段

     

子程序或游标'P_STATUS_UPDATE'在程序包规范中声明,并且必须在程序包主体中定义

     

子程序或游标'F_GET_STATUS'在程序包规范中声明,并且必须在程序包主体中定义

该如何解决这三个错误? 如果每个人都能麻将,我将不胜感激。

hcmove 回答:PL / SQL:子程序或游标'P_STATUS_UPDATE'在程序包规范中声明,必须在程序包主体中定义

包装规格如下:

procedure p_status_update;

在体内

procedure p_status_update(v_result_cust varchar2,v_balance_nr number,i_trans_id number)

这两个需要匹配。

f_get_status的问题在于,它在程序包规范中声明为返回varchar,但在正文中声明为varchar2

光标cur_tran似乎多次具有相同的列名。最好使用显式列出所需的列,而不要使用select *

顺便说一句,参数命名由您自己决定,但通常v_用于 v 变量,因此给类似v_customer_id的参数名称可能会在以后引起混乱。 / p>

本文链接:https://www.f2er.com/3099165.html

大家都在问