天天看点

PL/SQL存储过程习题

    老师布置了关于Pl/sql存储过程的习题,那天BF来,果断逃课了,可是悲剧的是,老师竟然点名要我交作业,我悲剧的逃课就这样被抓了,当然那天的作业我也没有做,时隔多日今天补上了。

    本题描述如下:

    写一个存储过程,实现银行账户转账操作。

    建一个账户表:account

    drop table account;

create table account

(

ano char(3),

balance number(3)

);

insert into account values('A00',100);

insert into account values('B00',200);

insert into account values('C00',300);  

    以下过程是实现A账户的钱转到B账户去,此时需要考虑:A账户的余额是否满足转账要求

    set serveroutput on;

CREATE OR REPLACE PROCEDURE account_transfer(

amount in int /*带参数表示参数类型为输入*/

)

AS

var_balance int; /*定义过程块的全局变量*/

BEGIN

/*先把A账户的余额放到变量var_balance中*/

SELECT balance INTO var_balance /*此处是动态给变量赋值*/

FROM account

WHERE ano='A00';

/*更改账户A的余额*/

update account

set balance=balance-amount

where ano='A00';

/*判断A的金额足否*/

IF var_balance-amount<0 THEN

DBMS_OUTPUT.put_line('金额不足,不能转账!');

ROLLBACK; /*撤销刚才的修改,恢复事务*/

RETURN; /*此处必须有return,否则下面的还要执行*/

END IF;/*if一定要跟有end if结束标志*/

update account

set balance=balance+amount

where ano='B00';

COMMIT;/*将更改操作提交到数据库中,只有提交了才会真正更改到数据库中*/

DBMS_OUTPUT.put_line('提交成功,正常转账');

END;

/  

    执行结果如下:

      如果A账户或者B账户不存在该如何修改程序?

CREATE OR REPLACE PROCEDURE account_transfer2(

amount in int

)

AS

var_balance int;

ano1 int;

ano2 int;

BEGIN

select count(*) INTO ano1 from account where ano='A00';

select count(*) INTO ano2 from account where ano='B00';

IF (ano1=0 or ano2=0) THEN

DBMS_OUTPUT.put_line('A账户或者B账户不存在');

RETURN;

END IF;

只需要过程加入这一部分来判断A账户或者B账户是不是存在,注意这里的 select count(*) INTO ano1 from account where ano='A00';

select count(*) INTO ano2 from account where ano='B00';

如果是select 1 INTO ano1 from account where ano='A00';

  select 1 INTO ano2 from account where ano='B00';

这样的话,如果A或者B不存在则会报ora-01403错误,此时要换成count(*),即使没有数据也会返回0,而不是null.

要是实现一个账户从另一个账户该怎么创建过程?

create or replace procedure account_transfer_2(

userOne in account.ano%type,

userTwo in account.ano%type,

amount in int

)as

var_balance int;

begin

/**读账户userOne的余额 =>amount */

select balance INTO var_balance from account where ano=userOne;

/**更改账户userOne的余额,即 balance+amount =>balance */

update account set balance=balance-amount where ano=userOne;

if var_balance-amount<0 THEN

dbms_output.put_line('金额不足,不能转账!');

ROLLBACK; /**撤销刚才的修改,恢复事务*/

return;

end if;

update account set balance=balance+amount where ano=userTwo;

COMMIT;

dbms_output.put_line('提交成功,正常转账!');

end;

/

这里的几个要求的变化其实是对于过程参数的变化,第一个账号是已知的,第三个需要从外部传入,第二个是要判断转账账户是否存在问题。