老师布置了关于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;
/
这里的几个要求的变化其实是对于过程参数的变化,第一个账号是已知的,第三个需要从外部传入,第二个是要判断转账账户是否存在问题。