Oracle数据库 PL/SQL 入门

思维导图

1. PL/SQL简介

a. PL/SQL是对SQL的一个增强,使SQL具有过程化的处理能力,就是在SQL能使用分支、循环等语句;
b. PL/SQL是操作oracle数据库最快的语言;
c. PL/SQL是存储过程、存储函数和触发器基础;

PL/SQL的程序结构:
declare 
     说明部分(变量说明,光标申明,例外说明)
begin
     语句序列(程序体 DML语句)
exception
     例外处理语句
end;
/
说明部分:

定义基本变量:char,varchar2,date,number,boolean,long

    --变量声明:
    var1 char(15);
    married boolean:=true;
    psal number(7,2);
    --引用变量:
    pename  emp.ename%type;

2. PL/SQL入门案例

小案例: 打印helloworld
--打开服务器的输出功能
set serveroutput on

declare
  --声明区:声明变量、游标、例外
begin
  --程序区:
  --打印helloworld
  --dbms_output:程序包,类似于java中类
  --put_line:存储过程,类似于java中的方法
  dbms_output.put_line('HelloWorld!');
end;
/
--查看程序包结构
desc dbms_output

3. 引用型变量

小案例: 查询并打印7839号员工的姓名和工资
--打开服务器的输出功能
set serveroutput on
declare
  --声明引用型变量
  pename   emp.ename%type;
  psal     emp.sal%type;
begin
  --查询7839号员工的姓名和工资
  --可以使用into关键字赋值
  select ename, sal into pename,psal from emp where empno=7839;
  --打印
  dbms_output.put_line(pename||'的薪水是'||psal);
end;
/

4. 记录型变量

记录型变量,就像是将查询结果封装到了一个对象里面一样,他就是这个对象。通过(.)可以取出对中的值。

小案例: 查询并打印7839号员工的姓名和工资
set serveroutput on
declare
  --声明记录型变量
  pemp  emp%rowtype;
begin
  select * into pemp from emp where empno=7839;
  --打印
  --从记录型变量中获取数据:记录型变量名.列名
  dbms_output.put_line(pemp.ename||'的薪水是'||pemp.sal);
end;
/

5. 判断语句:if语句

温馨小提示:
(1)set serveroutput onaccept num prompt '请您输入数字:'之后均无需带分号;
(2)accept num prompt '请您输入数字:'运行完这条语句之后,就会弹出来让你输入的提示内容,不要担心,照常输入。之后,接着上面的步骤,往下走。输入的内容已经被绑定到了指定的变量中了。

小案例: 判断用户输入的数字
set serveroutput on
--accept:从标准输入获取一个数据,保存num地址变量指定位置
--prompt:自定义提示信息
--num:地址值,含义量;在该地址上保存了输入的值
accept num prompt '请您输入数字:'

declare
  pnum  number;
begin
  --获取用户输入,赋值给pnum变量
  pnum:=#
  if pnum=1 then
    dbms_output.put_line('您输入的数字是:1!');
  elsif pnum=2 then
    dbms_output.put_line('您输入的数字是:2!');
  else
    dbms_output.put_line('您输入的数字是:其他!');
  end if;
end;
/

6. 循环语句(也有很多种,但是下面这一种是最常用的)

(1) 循环打印1~10(最常用的方式):
set serveroutput on
declare
  pnum  number:=1;
begin
  loop
    exit when pnum > 10;
    dbms_output.put_line(pnum);
    pnum:=pnum+1;
  end loop;
end;
/
(2) 使用while循环打印数字1-10
declare
 --定义循环变量
 pnum number:=1;
begin
 while pnum<=10 loop
  --循环体
  dbms_output.put_line(pnum);
  --使该变量+1
  pnum:=pnum+1;
 end loop;
end;
/
(3) 使用for循环打印1-10
set serveroutput on
declare
 --定义循环变量
 pnum number:=1;
begin
 --注意:此处的数字必须是连续的
 for pnum in 1..10 loop
  --循环体
  dbms_output.put_line(pnum);
 end loop;
end;
/

7. 游标(也叫光标,就是一个结果集)

(1) 光标的语法
cursor 光标名 [(参数名 数据类型[,参数名 数据类型]...)]
is select 语句;

操作光标:

--打开光标:
open c1;(打开光标执行查询)

--关闭光标: 
close c1;(关闭游标释放资源)

--取一行光标的值: 
fetch c1 into pename;(取一行到变量中)

注意事项:

  • 光标数的限制:默认情况下,oracle数据库只允许在同一个会话中,打开300个光标;
  • 修改默认值:
--切换到管理员
show user
conn sys/password@192.168.56.6:1521/orcl as sysdba
show user
--模糊查找
show parameter cursor
--修改光标数的限制
--scope的取值:both,memory,spfile(数据库需要重启)
alter system set open_cursor=400 scope=both;
(2) 无参游标
小案例: 查询并打印所有员工姓名和薪水
set serveroutput on

declare
  --定义游标
  cursor cemp is select ename, sal from emp;
  pename emp.ename%type;
  psal   emp.sal%type;
begin
  --打开游标
  open cemp;
    --循环获取游标中数据
    loop
      fetch cemp into pename,psal;
      --游标状态:%isopen:是否打开;%rowcount:返回行数;%found:获取到数据;%notfound获取不到数据
      exit when cemp%notfound;
      --打印
      dbms_output.put_line(pename||'的薪水是'||psal);
    end loop;
  --关闭游标
  close cemp;
end;
/
(3) 带参游标
小案例1: 查询并打印10号部门员工的姓名和薪水
set serveroutput on

declare
  --定义带参数的游标
  cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
  pename emp.ename%type;
  psal   emp.sal%type;
begin
  --作业:动态打印部门员工的信息
  open cemp(10);
    --循环获取游标中数据
    loop
      fetch cemp into pename,psal;
      --游标状态:%isopen:是否打开;%rowcount:返回行数;%found:获取到数据;%notfound获取不到数据
      exit when cemp%notfound;
      --打印
      dbms_output.put_line(pename||'的薪水是'||psal);
    end loop;
  close cemp;
end;
/
小案例2: 根据职位涨工资:按员工的工种涨工资,总裁1000元,经理800元,其他人400元
declare
  cursor cemp is select empno,job,sal from emp;
  pempno  emp.empno%type;
  pjob    emp.job%type;
  psal    emp.sal%type;
begin
  open cemp;
    loop
      fetch cemp into pempno,pjob,psal;
      exit when cemp%notfound;
      if pjob='PRESIDENT' then
        update emp set sal=psal+1000 where empno=pempno;
      elsif pjob='MANAGER' then
        update emp set sal=psal+800 where empno=pempno;
      else
        update emp set sal=psal+400 where empno=pempno;
      end if;
    end loop;
  close cemp;
  --提交数据
  commit;
end;
/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 第八章 数据查询和选择 ||| 第十章 获取GIS数据列表和描述信息 我们将在本章中介绍以下几个案例: 游标对象(...
    muyan阅读 21,003评论 5 21
  • 1、Check规则 Check (Agebetween15and30 )把年龄限制在15~30岁之间 2、新SQL...
    姜海涛阅读 795评论 0 4
  • PL/SQL 这是对Oracle-SQL知识点详细介绍的文章系列,其他文章如下: Oracle-SQL系列知识点(...
    GuaKin_Huang阅读 6,936评论 0 14
  • 1.1 基本结构 PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。 1.2 命名规则 1.3 记...
    慢清尘阅读 3,821评论 3 14
  • 光良在黄金唱片时代,占得乐坛一席之地,完全靠才华实力圈粉。他参加《歌手》竞技,不比原声卡带差,但缺乏现场...
    一品馥兰阅读 212评论 0 0