Oracle-PLSQL编程基础
匿名块
就是一个没有名字的代码块,临时运行的sql语句代码块
基本格式:
declare
变量的声明部分;
begin
执行的逻辑部分;
end;
输出函数
dbms_output.put_line();
declare
n1 number; --声明了一个变量n1,n1是一个数字类型
begin
n1:=10; --将10的数字赋值给n1这个变量保存起来
dbms_output.put_line('数字是'||n1); --以行为单位进行换行输出
n1:=20; --重新赋值20给n1变量
dbms_output.put_line('数字是'||n1);
end;
输入函数
变量的输入:
变量:=&提示信息;
数字的输入
declare
n1 number;
n2 number;
n3 number;
begin
n1:=&数字1是;
n2:=&数字2是;
n3:=n1+n2;
dbms_output.put_line(n3);
end;
注意点:提示语不能一样,否则会当成同一个输入框。
字符串的输入
需要在输入的提示左右加上单引号
declare
ename varchar2(20);
begin
ename:='&你的名字';
dbms_output.put_line('Hello! '||ename);
end;
注意点:特殊符号,打印两个相当于转义,打印特殊符号本身。
declare
ename varchar2(20);
begin
ename:='&&haha';
dbms_output.put_line(ename);
end;
保存查询的结果
结果只有刚好一个内容,才能运行,多于1个或者没有数据都会报错
declare
v_ename varchar2(20);
v_job varchar2(20);
begin
select ename,job into v_ename,v_job from emp where sal=5000;
dbms_output.put_line(v_ename||','||v_job);
end;
引用型变量
变量名 表名.列名%type;
declare
v_ename emp.ename%type;
v_job emp.job%type;
begin
select ename,job into v_ename,v_job from emp where sal=5000;
dbms_output.put_line(v_ename||','||v_job);
end;
记录型变量
变量名 表名%rowtype;
declare
v_user emp%rowtype;
begin
select * into v_user from emp where ename='SMITH';
dbms_output.put_line(v_user.empno||','||v_user.sal||','||v_user.job);
end;
record复合类型
将一个表中需要反复用到的列,放在一起,定义成一个新的数据类型
type 复合类型名字 is record(
小变量名字 数据类型,
...
);
变量名 复合类型名字;
declare
type emp_users is record( --自己定义一种新的数据类型,这个数据类型包含了四个不同的字段
v_empno emp.empno%type,
v_ename emp.ename%type,
v_job emp.job%type,
v_deptno emp.deptno%type
);
v_user emp_users; --将自己定义的数据类型,声明给一个变量
begin
select empno,ename,job,deptno into v_user from emp where sal=5000;
dbms_output.put_line(v_user.v_empno);
dbms_output.put_line(v_user.v_ename);
dbms_output.put_line(v_user.v_job);
dbms_output.put_line(v_user.v_deptno);
end;
逻辑判断和分支
if
if 判断1 then
执行语句;
elsif 判断2 then
执行语句;
···
else
执行语句;
end if;
declare
n number;
begin
n:=&数字;
if n>0 then
dbms_output.put_line('正数');
elsif n<0 then
dbms_output.put_line('负数');
else
dbms_output.put_line('零');
end if;
end;
if开头 中间可以有很多的elsif else做最后一个判断 end if结束
if和elsif都需要加上判断 else表示剩余的所有逻辑
declare
money number;
begin
money:=&剩下的钱;
if money<=5 then
dbms_output.put_line('小笼包');
elsif money<=10 then
dbms_output.put_line('炒粉');
elsif money<=15 then
dbms_output.put_line('黄焖鸡');
elsif money<=20 then
dbms_output.put_line('隆江猪脚饭');
else
dbms_output.put_line('火锅');
end if;
end;
case when
declare
begin
case
when xxx then 执行语句;
when xxx then 执行语句;
...
else 执行语句;
end case;
end;
declare
v_sno varchar2(10);
v_score number;
begin
v_sno:='&学号';
select avg(score) into v_score from degree where sno=v_sno;
case
when v_score<60 then dbms_output.put_line('不及格');
else dbms_output.put_line('及格');
end case;
end;
--用case when判断emp表中某个用户编号是否存在
declare
v_empno emp.empno%type;
c number;
begin
v_empno:=&员工编号;
select count(1) into c from emp where empno=v_empno;
case
when c=0 then dbms_output.put_line('该用户不存在');
else
dbms_output.put_line('用户存在');
end case;
end;
循环
for语法
for 新的变量名字 in 范围 loop
执行语句;
end loop;
--9x9乘法表
declare
begin
for i in 1..9 loop
for j in 1..i loop
dbms_output.put(j||'x'||i||'='||i*j||' ');
end loop;
dbms_output.put_line('');
end loop;
end;
while
while循环的语法:当判断为真的时候进入循环,判断为假跳出循环
while 判断是否在循环范围内 loop
执行语句;
end loop;
declare
n number;
begin
n:=10;
while n>=1 loop
dbms_output.put_line(n);
n:=n-3;
end loop;
end;
loop
loop循环的语法:当判断为假的时候跳出循环
loop
exit when 判断什么时候退出循环;
执行语句;
end loop;
declare
n number;
begin
n:=10;
loop
exit when n<1;
dbms_output.put_line(n);
n:=n-3;
end loop;
end;
循环中的三个关键字
exit
跳出循环,不要循环了,一个关键字只能控制离它最近的一个循环
- return:跳出整个正在运行的程序
continue
跳过本次循环,直接开始下一次的循环
goto
使用goto语句跳到定义标签的位置
goto 标签名
<<标签名>>
将select查询的结果当成for循环的范围
declare
begin
for i in (select * from emp where job='MANAGER' and comm is null) loop
update emp set comm=i.sal*0.1 where empno=i.empno;
commit;
dbms_output.put_line(i.ename||','||i.sal*0.1);
end loop;
end;