专栏首页cwl_Java快速学习Oracle-pl/sql 基本语法

快速学习Oracle-pl/sql 基本语法

什么是 PL/SQL?

PL/SQL(Procedure Language/SQL)PLSQL 是 Oracle 对 sql 语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句(如分支、循环等),使 SQL 语言具有过程处理能力。把 SQL 语言的数据操纵能力与过程语言的数据处理能力结合起来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。

范例 1:为职工涨工资,每人涨 10%的工资。

update emp set sal=sal*1.1

范例 2:例 2: 按职工的职称长工资,总裁涨 1000 元,经理涨 800 元,其他人员涨 400 元。 这样的需求我们就无法使用一条 SQL 来实现,需要借助其他程序来帮助完成,也可以使用 pl/sql。

1.pl/sql 程序语法

程序语法:

declare
 说明部分 (变量说明,游标申明,例外说明 〕
begin
 语句序列 (DML 语句〕… 
exception
 例外处理语句 
End;
2.常量和变量定义

在程序的声明阶段可以来定义常量和变量。

  • 变量的基本类型就是 oracle 中的建表时字段的变量如 char, varchar2, date, number, boolean, long

定义语法:

varl char(15);
Psal number(9,2);

说明变量名、数据类型和长度后用分号结束说明语句。 常量定义:married constant boolean:=true

  • 引用变量
Myname emp.ename%type;

引用型变量,即 my_name 的类型与 emp 表中 ename 列的类型一样

在 sql中使用 into 来赋值

declare
 emprec emp.ename%type;
begin
 select t.ename into emprec from emp t where t.empno = 7369;
 dbms_output.put_line(emprec);
 end;
  • 记录型变量
Emprec emp%rowtype
记录变量分量的引用
emp_rec.ename:='ADAMS'; 
declare
 p emp%rowtype;
begin
 select * into p from emp t where t.empno = 7369;
 dbms_output.put_line(p.ename || ' ' || p.sal);
end;
3. if 分支

语法 1:

IF 条件 THEN 
语句 1; 
语句 2;
 END IF;

语法 2:

IF 条件 THEN 
语句序列 1; 
 ELSE 
 语句序列 2;
 END IF;

语法 3:

IF 条件 THEN 
语句;
ELSIF 
语句 
THEN 
语句;
ELSE 
语句;
END IF;

范例 1:如果从控制台输入 1 则输出我是 1

declare
 pnum number := #
begin
 if pnum = 1 then
 dbms_output.put_line('我是1');
 end if;
end;

范例 2:如果从控制台输入 1 则输出我是 1 否则输出我不是 1

declare
 mynum number := #
begin
 if mynum = 1 then
 dbms_output.put_line('我是1');
 else
 dbms_output.put_line('我不是1');
 end if;
end;

范例 3:判断人的不同年龄段 18 岁以下是未成年人,18 岁以上 40 以下是成年人,40 以上是老年人

declare
 mynum number := #
begin
 if mynum < 18 then
 dbms_output.put_line('未成年人');
 elsif mynum >= 18 and mynum < 40 then
 dbms_output.put_line('中年人');
 elsif mynum >= 40 then
 dbms_output.put_line('老年人');
 end if;
end;
4.LOOP 循环语句

语法 1:

WHILE total <= 25000 
LOOP
.. .
total : = total + salary;
END LOOP;

语法 2:

Loop
EXIT [when 条件];
……
End loop

语法 3:

FOR I IN 1 . . 3 LOOP
语句序列 ;
END LOOP ;

范例:使用语法 1 输出 1 到 10 的数字

declare
 step number := 1;
begin
 while step <= 10 loop
 dbms_output.put_line(step);
 step := step + 1;
 end loop;
end;

范例:使用语法 2 输出 1 到 10 的数字

declare
 step number := 1;
begin
 loop
 exit when step > 10;
 dbms_output.put_line(step);
 step := step + 1;
 end loop;
end;

范例:使用语法 3 输出 1 到 10 的数字

declare
 step number := 1;
begin
 for step in 1 .. 10 loop
 dbms_output.put_line(step);
 end loop;
end;
5.游标 Cursor

在写 java 程序中有集合的概念,那么在 pl/sql 中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。

语法:

CURSOR 游标名 [ (参数名 数据类型,参数名 数据类型,...)] IS SELECT 语句;

例如:

cursor c1 is select ename from emp;
游标的使用步骤
  • 打开游标: open c1; (打开游标执行查询)
  • 取一行游标的值:fetch c1 into pjob; (取一行到变量中)
  • 关闭游标: close c1;(关闭游标释放资源)
  • 游标的结束方式 exit when c1%notfound

注意: 上面的 pjob 必须与 emp 表中的 job 列类型一致: 定义:pjob emp.empjob%type;

范例 1:使用游标方式输出 emp 表中的员工编号和姓名

declare
 cursor pc is
 select * from emp;
 pemp emp%rowtype;
begin
 open pc;
 loop
 fetch pc
 into pemp;
 exit when pc%notfound;
 dbms_output.put_line(pemp.empno || ' ' || pemp.ename);
 end loop;
 close pc;
end;

范例 2:按员工的工种涨工资,总裁 1000 元,经理涨 800 元其,他人员涨 400 元。 备份出一张新表为 myemp;

create table myemp as select * from emp;
declare
 cursor pc is
 select * from myemp;
 addsal myemp.sal%type;
 pemp myemp%rowtype;
begin
 open pc;
 loop
 fetch pc
 into pemp;
 exit when pc%notfound;
 if pemp.job = 'PRESIDENT' then
 addsal := 1000;
 elsif pemp.job = 'MANAGER' then
 addsal := 800;
 else
 addsal := 400;
  end if;
 update myemp t set t.sal = t.sal + addsal where t.empno = 
pemp.empno;
 end loop;
 close pc;
end;

范例 3:写一段 PL/SQL 程序,为部门号为 10 的员工涨工资。

declare
 cursor pc(dno myemp.deptno%type) is
 select empno from myemp where deptno = dno;
 pno myemp.empno%type;
begin
 open pc(20);
 loop
 fetch pc
 into pno;
 exit when pc%notfound;
 update myemp t set t.sal = t.sal + 1000 where t.empno = pno;
 end loop;
 close pc;
end;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 快速学习Maven-Maven工程运行调试

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    cwl_java
  • 快速学习-HDFS概述

    cwl_java
  • SaaS-工程搭建

    SpringBoot+SpringCloud+SpringMVC+SpringData

    cwl_java
  • 有图有真相

    自从上次简单讲解了飞思卡尔MQX RTOS系统后,不断有猿友留言,要求在讲讲启动流程,在一步步学习MQX系统的文章已经提到过,通过一步步跟踪可以清...

    用户1605515
  • 这篇文章就差异分析和PPI就发了接近3分!

    今天跟大家分享的是2020年6月发表在Scand. J. Immunol. (IF:2.717)杂志上的一篇文章“Bioinformatics analysi...

    科研菌
  • 也谈应用程序级的同步、异步、阻塞、非阻塞

    这几个经常出现的词汇很容易会引起大家的误解,第一次接触相关词汇是在课上,当时上操作系统的老师说得比较模糊(阻塞==同步,非阻塞==异步),当时觉得挺对 的,

    chain
  • 你永远不想被问到的12个真实技术工作面试题

    大数据文摘
  • 开车请别玩手机、别弹吉他,MIT这套系统在盯着你!

    无人驾驶汽车的美好愿望是减少车祸的发生。本来减少司机的负担是很好初衷,但司机过度依赖AI产生的懈怠更可怕,甚至会引发严重的车祸。

    量子位
  • 火绒安全周报:数十万家用摄像头被监控 恶意软件假借环保少女名义传播

    近日,温州警方破获非法控制家用摄像头案,控制犯罪嫌疑人32名。警方介绍,犯罪分子非法贩卖某公司品牌APP破解工具,利用APP破解工具对他人的摄像头进行扫描,控制...

    用户6477171
  • 区块链技术公司谈最新全球区块链政策

    (本文由彭利编辑有问题联系微信2398788267) 1. 中国央行发行的数字货币已试运行成全球首例:近期,中国央行关于发行数字货币动作频频,据媒体报道,央行法...

    qq2398788267

扫码关注云+社区

领取腾讯云代金券