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;
posted @ 2020-10-07 20:15  Hedger_Lee  阅读(130)  评论(0编辑  收藏  举报