程序结构
DECLARE
<<声明部分>>
BEGIN
<<逻辑部分>>
COMMIT;
EXCEPTION
<<异常处理>>
ROLLBACK;
END;
1.数据类型
a)NUMBER(p,s)
b)VARCHAR2(l)
c)DATE
d)RAW
e)LOB
2.变量
变量名 类型:=初始值;
3.运算符表达式
a.算术运算符
+ - * / mod()
注意: + 只做加法运算
b.比较运算符
> < >= <= = <>
注意: = 只做判断
c.逻辑运算符
and or not
d.赋值运算符
:=
e.连接运算符
||
4.逻辑结构
a.顺序
输出 dbms_output.put_line();
输入 变量:='&提示';
注意: & 接受用户键盘输入
提示语句不要涉及特殊符号
b.分支
注意:Oracle沿用Basic语法
IF 条件1 THEN
...
ELSIF 条件2 THEN
...
ELSE
...
END IF;
注意:CASE语句一般用于查询与SELECT关键字一并使用
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
...
ELSE ...
END;
c.循环
--特点:循环次数不确定
LOOP
...
EXIT WHEN 退出循环条件;
END LOOP;
--特点:循环次数确定
注意:循环变量可以直接使用
FOR 循环变量 IN 起始值..结束值
LOOP
END LOOP;
5.表类型
%type -> 直接关联表字段的数据类型
%rowtype -> 直接关联表(实体)类型
BEGIN
dbms_output.put_line('Hello World');
END;
DECLARE
p_num1 NUMBER:=1;
p_num2 NUMBER:=2;
BEGIN
p_num1:='&请输入第一个数字';
p_num2:='&请输入第二个数字';
dbms_output.put_line(p_num1||'+'||p_num2||'='||(p_num1+p_num2));
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('输入数据格式错误');
END;
DECLARE
p_num NUMBER;
BEGIN
p_num:='&请输入一个数字';
IF p_num = 3 THEN
dbms_output.put_line('这个数是三');
ELSIF p_num=4 THEN
dbms_output.put_line('这个数是四');
ELSE
dbms_output.put_line('这个数不三不四');
END IF;
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('输入数据格式错误');
END;
DECLARE
p_year NUMBER;
BEGIN
p_year:='&请输入年份';
IF (MOD(p_year,4)=0 and MOD(p_year,100)<>0) or MOD(p_year,400)=0 THEN
dbms_output.put_line(p_year||'是闰年');
ELSE
dbms_output.put_line(p_year||'是平年');
END IF;
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('输入数据格式错误');
END;
select empno,ename,sal,
case
when sal<1000 then '低'
when sal<2000 then '中'
when sal<3000 then '高'
else '很高'
end lvl
from emp;
DECLARE
p_index NUMBER:=1;
BEGIN
LOOP
dbms_output.put_line(p_index);
p_index:=p_index+1;
EXIT WHEN p_index=101;
END LOOP;
END;
DECLARE
p_sum NUMBER:=0;
BEGIN
FOR p_index IN 1..100
LOOP
p_sum:=p_sum+p_index;
END LOOP;
dbms_output.put_line(p_sum);
END;
CREATE TABLE tb_account
(
accno VARCHAR2(12) PRIMARY KEY,
accpwd VARCHAR(6) DEFAULT('123456'),
accname VARCHAR2(50),
accmoney NUMBER(12,2)
);
CREATE TABLE tb_account_log
(
logid NUMBER(10) PRIMARY KEY,
logaccno VARCHAR2(12) REFERENCES tb_account(accno),
logtype NUMBER(4),
logmoney NUMBER(12,2),
logdate DATE,
logaccto VARCHAR2(12)
);
CREATE SEQUENCE seq_account START WITH 1001 INCREMENT BY 1 MINVALUE 1001 MAXVALUE 1010 CYCLE CACHE 5;
CREATE SEQUENCE seq_account_log START WITH 1001 INCREMENT BY 1;
SELECT seq_account.Nextval FROM DUAL;
DECLARE
p_name tb_account.accname%type;
BEGIN
p_name:='&请输入开户人姓名';
INSERT INTO tb_account VALUES(to_char(sysdate,'yyyymmdd')||seq_account.Nextval,default,p_name,0);
INSERT INTO Tb_Account_Log VALUES(seq_account_log.nextval,
to_char(sysdate,'yyyymmdd')||seq_account.currval,1111,0,sysdate,'111122223333');
COMMIT;
dbms_output.put_line('开户成功');
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('格式错误');
WHEN others THEN
ROLLBACK;
dbms_output.put_line('系统异常 请重试');
END;
DECLARE
p_accno tb_account.accno%type;
p_money tb_account.accmoney%type;
p_count NUMBER:=0;
BEGIN
p_accno:='&请输入目标卡号';
p_money:='&请输入存款金额';
select count(accno) into p_count from tb_account where accno=p_accno;
IF p_count = 1 THEN
UPDATE tb_account SET accmoney=accmoney+p_money WHERE accno=p_accno;
INSERT INTO Tb_Account_Log VALUES(seq_account_log.nextval,
p_accno,2222,p_money,sysdate,'111122223333');
COMMIT;
dbms_output.put_line('存款成功');
ELSE
dbms_output.put_line('没有匹配的目标卡号');
END IF;
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('格式错误');
WHEN others THEN
ROLLBACK;
dbms_output.put_line('系统异常 请重试');
END;
DECLARE
p_accno tb_account.accno%type;
p_accpwd tb_account.accpwd%type;
p_money tb_account.accmoney%type;
p_account tb_account%rowtype;
BEGIN
p_accno:='&请输入目标卡号';
p_accpwd:='&请输入交易密码';
p_money:='&请输入取款金额';
select * into p_account from tb_account where accno=p_accno;
IF p_account.accpwd = p_accpwd THEN
IF p_account.accmoney > p_money THEN
UPDATE tb_account SET accmoney=accmoney-p_money WHERE accno=p_accno;
INSERT INTO Tb_Account_Log VALUES(seq_account_log.nextval,
p_accno,3333,p_money,sysdate,'111122223333');
COMMIT;
dbms_output.put_line('取款成功');
ELSE
dbms_output.put_line('余额不足');
END IF;
ELSE
dbms_output.put_line('密码错误 请重试');
END IF;
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('格式错误');
WHEN no_data_found THEN
dbms_output.put_line('没有匹配的目标卡号');
WHEN others THEN
ROLLBACK;
dbms_output.put_line('系统异常 请重试');
END;
DECLARE
p_accno tb_account.accno%type;
p_accpwd tb_account.accpwd%type;
p_money tb_account.accmoney%type;
p_account tb_account%rowtype;
CREATE PROCEDURE pro_getmoney(p_accno tb_account.accno%type,
p_accpwd tb_account.accpwd%type,
p_money tb_account.accmoney%type)
AS
p_account tb_account%rowtype;
BEGIN
select * into p_account from tb_account where accno=p_accno;
IF p_account.accpwd = p_accpwd THEN
IF p_account.accmoney > p_money THEN
UPDATE tb_account SET accmoney=accmoney-p_money WHERE accno=p_accno;
INSERT INTO Tb_Account_Log VALUES(seq_account_log.nextval,
p_accno,3333,p_money,sysdate,'111122223333');
COMMIT;
dbms_output.put_line('取款成功');
ELSE
dbms_output.put_line('余额不足');
END IF;
ELSE
dbms_output.put_line('密码错误 请重试');
END IF;
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('格式错误');
WHEN no_data_found THEN
dbms_output.put_line('没有匹配的目标卡号');
WHEN others THEN
ROLLBACK;
dbms_output.put_line('系统异常 请重试');
END;
BEGIN
pro_getmoney('201803091009','123456',200);
END;
select * from tb_account;
select * from tb_account_log;
select * from emp;
DECLARE
p_accno tb_account.accno%type;
p_accpwd tb_account.accpwd%type;
p_money tb_account.accmoney%type;
p_accto tb_account.accno%type;
p_account tb_account%rowtype;
p_count NUMBER:=0;
BEGIN
p_accno:='&请输入卡号';
p_accpwd:='&请输入密码';
p_money:='&请输入金额';
p_accto:='&请输入目标卡号';
select * into p_account from tb_account where accno = p_accno;
IF p_account.accpwd = p_accpwd THEN
IF p_account.accmoney>p_money THEN
select count(accno) into p_count from tb_account where accno = p_accto;
IF p_count=1 THEN
IF p_accno <> p_accto THEN
update tb_account set accmoney = accmoney-p_money where accno = p_accno;
insert into tb_account_log values(SEQ_ACCOUNT_LOG.Nextval,p_accno,'4444',
p_money,SYSDATE,p_accto);
update tb_account set accmoney = accmoney+p_money where accno = p_accto;
insert into tb_account_log values(SEQ_ACCOUNT_LOG.Nextval,p_accto,'5555',
p_money,SYSDATE,p_accno);
COMMIT;
dbms_output.put_line('转账成功');
ELSE
dbms_output.put_line('同卡之间不允许转账');
END IF;
ELSE
dbms_output.put_line('目标卡号不存在');
END IF;
ELSE
dbms_output.put_line('余额不足');
END IF;
ELSE
dbms_output.put_line('密码输入错误');
END IF;
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('输入信息格式错误');
WHEN no_data_found THEN
dbms_output.put_line('卡号不存在');
WHEN others THEN
ROLLBACK;
dbms_output.put_line('系统异常 请重试');
END;
SELECT * FROM TB_ACCOUNT;
SELECT * FROM TB_ACCOUNT_LOG;
s
CREATE TABLE tb_sal_log
(
logid NUMBER PRIMARY KEY,
logempno NUMBER(4),
logmoney NUMBER(7,2),
logdate DATE
);
CREATE SEQUENCE SEQ_LOGID START WITH 1001 INCREMENT BY 1;
DECLARE
p_empno emp.empno%type;
p_money emp.sal%type;
p_emp emp%rowtype;
p_date tb_sal_log.logdate%type;
p_count number:=0;
BEGIN
p_empno:='&请输入工号';
p_money:='&请输入涨幅';
select * into p_emp from emp where empno= p_empno;
IF p_emp.sal*0.1>=p_money THEN
select count(logid) into p_count from tb_sal_log where logempno = p_empno;
IF p_count = 0 THEN
update emp SET sal=sal+p_money where empno = p_empno;
insert into tb_sal_log VALUES(SEQ_LOGID.NEXTVAL,p_empno,p_money,SYSDATE);
COMMIT;
dbms_output.put_line('恭喜了');
ELSE
select max(logdate) into p_date from tb_sal_log where logempno = p_empno;
IF months_between(sysdate,p_date)>=6 THEN
update emp SET sal=sal+p_money where empno = p_empno;
insert into tb_sal_log VALUES(SEQ_LOGID.NEXTVAL,p_empno,p_money,SYSDATE);
COMMIT;
dbms_output.put_line('恭喜了');
ELSE
dbms_output.put_line('时间间隔没有半年');
END IF;
END IF;
ELSE
dbms_output.put_line('涨幅不能超过10%');
END IF;
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('输入信息格式错误');
WHEN no_data_found THEN
dbms_output.put_line('工号不存在');
WHEN others THEN
ROLLBACK;
dbms_output.put_line('系统异常 请重试');
END;
SELECT * FROM emp;
SELECT * FROM tb_sal_log;