先附上测试使用的表结构:
表中记录学生基本信息,见名知意:
1.使用变量替换
在变量名称前加一个& 或&&
例如:
select SID, SNAME, SBIRTH from student2 where SADDRESS =&address;
2.使用DBMS_OUTPUT包显示信息
使用前先打开输出debug开关
SET SERVEROUTPUT {ON, OFF}
例如:打印今天的时间
BEGIN
DBMS_OUTPUT.PUT_LINE('现在的日期时间:');
--显示信息不换行
DBMS_OUTPUT.PUT('今天是:');
--显示信息并换行
DBMS_OUTPUT.PUT_LINE(to_char(SYSDATE,'DAY'));
DBMS_OUTPUT.PUT('现在时间是:');
DBMS_OUTPUT.PUT_LINE(to_char(SYSDATE,'YYYY-MM-DD HH24:MI:SS'));
END;
结果:
3.顺序结构
例子:计算两个学生的年龄总和
DECLARE
v_age1 number;
v_age2 number;
v_sumage number;
BEGIN
--查询ID为 1 的年龄
select SAGE
into v_age1
from student2
where SID =&id_1;
--查询ID为2的年龄
select SAGE
into v_age2
from student2
where SID =&id_2;
--相加
v_sumage := v_age1 + v_age2;
--输出结果
DBMS_OUTPUT.PUT_LINE('ID_1='
|| &id_1
|| ',ID_2='
|| &id_2
|| ', sun age ='
|| v_sumage);
END;
/
结果:需要输入2次ID,且只要ID格式正确,第二组ID对结果无影响???如何解决
4.条件控制
declare
--定义加薪比例常量
c_manager constant number := 0.15;
c_saleman constant number := 0.12;
c_clerk constant number := 0.10;
--定义职位变量
v_job varchar2(20);
begin
-- 查询指定员工
select job into v_job
from student2
where sid = &tid;
--分支判断
if v_job = 'clerk'
then
update student2
set solary = solary * ( 1 + c_clerk)
where sid = &tid;
elsif v_job = 'saleman'
then
update student2
set solary = solary * ( 1 + c_saleman)
where sid = &tid;
elsif v_job = 'manager'
then
update student2
set solary = solary * ( 1 + c_manager)
where sid = &tid;
DBMS_OUTPUT.PUT_LINE('manager type');
end if;
DBMS_OUTPUT.PUT_LINE('已经为员工编号为'|| &tid || '加薪');
exception
--处理异常
when NO_DATA_FOUND
then
DBMS_OUTPUT.PUT_LINE('没有找到员工数据');
commit;
end;
/
执行结束后手动commit一下。
5.循环控制
5.1 for 循环
例子:打印99乘法表
--输出屏幕信息
set serveroutput on;
declare
v_number1 number(3); --外层变量
v_number2 number(3); --内层循环变量
begin
for v_number1 IN 1 .. 9 --开始外层循环
loop
--开始内层循环
for v_number2 IN 1 .. v_number1
loop
DBMS_OUTPUT.PUT(v_number1
|| '*'
|| v_number2
|| '='
|| v_number1 * v_number2
|| ' '
);
end loop;
DBMS_OUTPUT.PUT_LINE(''); --输出换行
end loop;
end;
/
在sqlplus执行结果: