Oracle之PL/SQL学习笔记

 

  自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧。是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正。

  PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言。 PL---Procedural Language. SQLStructure QueryLanguage。PL/SQL包括过程化语句和SQL语句

    PL/SQL的单位:块。 一个块中可以嵌套子块。

    块的三个组成部分:

        一:定义部分(declare)

PL/SQL中使用的变量,常量,游标和异常的名字都必须先定义后使用。并且定义在以declare关键字开头的定义部分

        二:可执行部分:(begin)

是PL/SQL的主题,包含该块的可执行语句,该部分定义了块的功能,是必须的部分。由关键字begin开始,end结束

        三:异常处理部分:(exception)

             该部分以exception开始,以end结束

    Demo:
DECLARE –可选
变量,常量,游标,用户自定义的特殊类型
BEGIN –必须
--SQL语句
--PL/SQL语句
EXCEPTION –可选
--异常处理部分
END; --必须
即由声明,执行,异常组成
DEMO:
DECLARE
V_value1 VARCHAE2(5);
BEGIN
SELECT cn_name
INTO v_value1
FROM table_name;
EXCEPTION
WHEN exception_name THEN
--处理程序……
END;

PL/SQL的优点:

  1、    改善了性能:PL/SQL把整个语句块发送给服务器,这个过程在单次调用中完成,降低了网络拥挤

  2、    可重用性:只要有Oracle的地方都能运行

  3、    模块化:程序中的每一块都实现一个逻辑操作,有效的进行了分割。

PL/SQL块的类:

  1、    匿名块:只能存储一次,不能存储在数据库中

  2、    过程,函数和包(procedure,function,package):是命了名的PL/SQL块,被存储在数据库中,可以被多次使用,可以用外部程序显示执行。

  3、    触发器:是命名的PL/SQL块,被存储在数据库中,当触发某事件时自动执行。

PL/SQL中变量的命名规范:

  1、    至多有30个字符

  2、    不能是保留字

  3、    必须以字母开头

  4、    不允许和数据库中表的列名相同

  5、    不可包括$,_和数字以外的字符

PL/SQL中的变量

  1、    PL/SQL变量

    a)  标量型:只能存放单一值

    b)  复合型

    c)   引用型

    d)  LOBx型:存放大数据

  2、    定义变量语法

    a)  变量名   变量类型   :=  变量值

    b)  V_number NUMBER(2) NOT NULL :=20;

    c)   常量的定义

               i.       V_number CONSTANT

          NUMBER(2,3) :=20.098;

 1 DEMO:查询员工号为7369的员工,把其job存入v_job中并输出
2 DECLARE
3 --定义存储job的变量v_job为引用变量与--emp.job的类型相同,用%TYPE实现
4 v_job emp.job%TYPE;
5 --定义员工号变量并赋初值(:=)
6 n_empno emp.empno%TYPE:=7369;
7 BEGIN
8 --查询语句
9 SELECT emp.job
10 --把查出来的结果赋给v_job
11 INTO v_job
12 FROM emp
13 WHERE emp.empno = n_empno;
14 --打印输出结果
15 Dbms_Output.put_line(v_job);
16 END;

%TYPE属性:

通过%TYPE声明一个变量,实际上就是参照变量或表中的字段的类型作为变量的类型,并且保持同步。

变量将遵循下面的类型声明:

  1.  已声明过的变量类型

  2.  数据库中表字段的类型

demo1:

创建一个匿名块,输出hello world
 1 --创建一个匿名块,输出hello world
2 DECLARE
3 v_hello varchar2(20) :='Hello World';
4 BEGIN
5 Dbms_Output.put_line(v_hello);
6 END;
7
8 --创建一个匿名块,查询emp表,显示雇员名是’SCOTT‘的薪水,通过DBMS_OUTPUT包来显示。
9 DECLARE
10 v_sal emp.sal%TYPE;
11 v_name emp.ename%TYPE := 'SCOTT';
12 BEGIN
13 SELECT emp.sal
14 INTO v_sal
15 FROM emp
16 WHERE emp.ename = v_name;
17 dbms_output.put_line(v_sal);
18 END;

demo2:

-从部门表中找到最大的部门号,将其输出到屏幕
1 --从部门表中找到最大的部门号,将其输出到屏幕
2 DECLARE
3 v_deptno dept.deptno%TYPE;
4 BEGIN
5 SELECT MAX(dept.deptno)
6 INTO v_deptno
7 FROM dept;
8 dbms_output.put_line(v_deptno);
9 END;

demo3:

--PL/SQL嵌套和变量的作用域
--PL/SQL嵌套和变量的作用域
DECLARE
v_parent NUMBER :=10;
BEGIN
DECLARE
v_child NUMBER :=20;
BEGIN
dbms_output.put_line('chile='||v_child);
dbms_output.put_line('parent='||v_parent);
END;
--dbms_output.put_line('chile='||v_child); --注意变量的作用域
dbms_output.put_line('chile='||v_parent);
END;
结果:
chile=20
parent=10
chile=10

demo4:

--选择并打印emp表中薪水总和
1 --选择并打印emp表中薪水总和
2 DECLARE
3 v_sal emp.sal%TYPE;
4 BEGIN
5 SELECT sum(emp.sal)
6 INTO v_sal
7 FROM emp;
8 dbms_output.put_line(v_sal);
9 END

demo5:事务的操作

 1 DECLARE
2 v_sal emp.sal%TYPE :=800;
3 BEGIN
4 UPDATE emp
5 SET emp.sal = emp.sal+ v_sal
6 WHERE emp.job='ANALYST';
7 SAVEPOINT a;
8 UPDATE emp
9 SET emp.sal = emp.sal+ v_sal
10 WHERE emp.job='ANALYST';
11 SAVEPOINT b;
12 ROLLBACK TO SAVEPOINT a;
13 COMMIT;
14 END;

编写控制结构

  1、    条件分支语句

    a)  IF语句:  

    1.  i.       IF  THEN  END IF
    2.  ii.       IF  THEN  ELSE  END IF
    3.  iii.       IF  THEN  ELSEIF  END IF

  2、    条件语句语法

    a)  IF condition THEN

      i.      Statement;

    b)  [ELSIF condition THEN

      i.      Statement;]

    c)  [ELSE

      i.      Statement;]

    d)  ENDIF;

  3、    DEMO:

    a)  IF v_name = SCOTT AND SAL >= 3000   THEN

      i.      v_dept :=20;

    b)  END IF;

 1 DEMO:
2 --null的处理
3 DECLARE
4 v_x NUMBER :=NULL;
5 v_y NUMBER := NULL;
6 BEGIN
7 IF v_x = v_y THEN
8 dbms_output.put_line('NULL等于NULL');
9 ELSE
10 dbms_output.put_line('NULL不等于NULL');
11 END IF;
12 END;
13 结果:NULL不等于NULL 空是未知的东西

  4.Case语句:语法(有返回值的)

  

 1 CASE demo:
2 DECLARE
3 v_sal emp.sal%TYPE;
4 v_dept emp.deptno%TYPE;
5 v_result VARCHAR(20);
6 BEGIN
7 SELECT emp.deptno
8 INTO v_dept
9 FROM emp
10 WHERE emp.sal =
11 (
12 SELECT MAX(emp.sal)
13 FROM emp
14 );
15 dbms_output.put_line(v_dept);
16 v_result :=
17 CASE v_dept
18 WHEN 10 THEN '部门一'
19 WHEN 20 THEN '部门二'
20 ELSE '部门三'
21 END;
22 dbms_output.put_line(v_result);
23 END;
24 输出结果:
25 10
26 部门一

5、    循环语句LOOP :

DEMO:循环插入11条数据

 1 DECLARE
2 v_count NUMBER := 0;
3 BEGIN
4 LOOP
5 --插入数据
6 INSERT INTO
7 test(name,id,password)
8 VALUES ('TEST'||v_count,v_count,'admin');
9 --变量加一
10 v_count := v_count+1;
11 --判断退出条件
12 EXIT WHEN v_count > 10;
13 END LOOP;
14 END;

b)  FOR LOOP循环

  

 1 DEMO:
2 DECLARE
3 v_counter NUMBER :=0;
4 BEGIN
5 --v_counter是自增的
6 FOR v_counter IN 0 .. 10 LOOP
7 DELETE FROM test
8 WHERE test.id = v_counter;
9 END LOOP;
10 END;

 

b)  WHILE LOOP

 1 DECLARE
2 v_count NUMBER := 0;
3 BEGIN
4 WHILE v_count<10 LOOP
5 --插入数据
6 INSERT INTO
7 test(name,id,password)
8 VALUES ('TEST'||v_count,v_count,'admin');
9 --变量加一
10 v_count := v_count+1;
11 END LOOP;
12 END;

三:复合类型

  1、    复合数据类型

    a)  一个复合变量可以存放多个值

    b)  复合变量创建后可以多次使用

    c)  如同枚举类型和数组

  2、    PL/SQL记录

    a)  每个记录内都有很多的不同类型的字段

    b)  无初始值的字段为NULL

    c)  Record 类型声明用户自定义的类型

 

  3、    定义一个记录

    a)  语法:

1 i.    TYPE type_name IS RECORD(
2 ii. 字段名1 字段类型1,
3 iii. 字段名2 字段类型2
4 iv. );

b)  DEMO

i.    TYPE emp_record_name IS RECORD(
ii. V_name varchar(20),
iii. V_password varchar(10)
iv. );
v. Emp_record emp_record_name;
--记录的定义与使用
DECLARE
TYPE test_record_name
IS RECORD(
v_name test.name%TYPE,
v_id test.id%TYPE,
v_password test.password%TYPE
);
test_record test_record_name;
BEGIN
SELECT test.name,test.id,test.password
INTO test_record
FROM test
WHERE test.name='TEST0';
dbms_output.put_line(test_record.v_name||test_record.v_id||test_record.v_password);
END;

5  记录的另一种定义:表名%ROWTYPE

  a)  Exp_row table_name%ROWTYPE

  DEMO:

 1 --记录的定义与使用
2 DECLARE
3 emp_record emp%ROWTYPE;
4
5 BEGIN
6 SELECT *
7 INTO emp_record
8 FROM emp
9 WHERE emp.empno='7788';
10 dbms_output.put_line(emp_record.empno||' '||emp_record.sal);
11 END;

编写游标

  1、    游标的定义:游标是Oracle在数据库中开辟的一个工作区,用来存放SELECT语句查询的结果。

  2、    游标的分类

    a)  隐式游标:PL/SQL隐式建立并管理这一游标。

    b)  显示游标:由程序员定义并控制,从数据库中读出多行数据,并从多行数据中一行一行的处理。

  3、    游标的声明:

    a)  语法:CURSOR cursor_name IS select_statement;

    b)  在游标声明中SELECT语句不能使用INTO语句,可以在字句子中使用ORDER字句。

  c)  Demo:

1 CURSOR emp_cursor IS
2 SELECT *
3 FROM emp;

  4、    打开游标

    a)  语法:OPEN cursor_name;

    b)  使用游标之前应打开游标

    c)  打开游标实际上是执行定义游标时的SELECT语句,将查询结果检索到工作区中。

    d)  如果没有要返回的行没有异常

  5、    从游标中提取数值

    a)  语法

       i.      FETCH cursor_name INTO [v1,v2……]|record_name]

    b)  在使用FETCH时先把游标打开,不然没法使用。

    c)  对游标第一次使用FETCH时,游标指向的是第一条记录,使用后游标指向下一条记录。

    d)  游标只能向下移动不能回退,如果想回退到上一条记录,只有把游标关闭后在打开。

    e)  INTO字句中的变量个数、顺序、数据类型必须和工作区中的保持一致;

  6、    关闭游标

    a)  语法:CLOSE cursor_name

    b)  处理完数据后必须关闭游标,如果需要可以再次打开游标,游标一旦关闭不可再从游标中提取数据,当关闭游标后所有和游标相关的资源都会被关闭。

  7.游标的使用Demo

 1 --游标的使用
2 DECLARE
3 --定义临时变量来存放游标中的内容
4 emp_empno emp.empno%TYPE;
5 emp_ename emp.ename%TYPE;
6 --定义名为emp_cursor的游标
7 CURSOR emp_cursor IS
8 SELECT emp.empno,emp.ename
9 FROM emp;
10 BEGIN
11 --打开游标
12 OPEN emp_cursor;
13 --循环输出游标
14 FOR i IN 1..5 LOOP
15 --提取游标中的内容
16 FETCH emp_cursor
17 INTO emp_empno,emp_ename;
18 dbms_output.put_line(emp_empno||' '||emp_ename);
19 END LOOP;
20 --关闭游标
21 CLOSE emp_cursor;
22 END;

PL SQL 基础的更多相关文章

  1. Oracle数据库之PL/SQL基础

    介绍PL/SQL之前,先介绍一个图像化工具:Oracle SQL Developer 在oracle的开发过程中, 我们难免会使用第三方开发的软件来辅助我们书写SQL, pl/sql是一个不错的sql ...

  2. Oracle实战笔记(第六天)之PL/SQL基础

    一.PL/SQL介绍 1.概念 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语 ...

  3. Oracle442个应用场景---------PL/SQL基础

    ----------------------------------------------------------------------------------- 备份和恢复数据库略过.在后面解说 ...

  4. pl/sql基础知识—定义并使用变量

    n  介绍 在编写pl/sql程序是,可以定义变量和常量:在pl/sql程序中包括有: ①标量类型(scalar) ②复合类型(composite) ③参照类型(reference) ④lob(lar ...

  5. PL/SQL基础-异常处理

    --*********异常处理一.异常的类型 ORACLE异常分为两种类型:系统异常.自定义异常. 其中系统异常又分为:预定义异常和非预定义异常.1.预定义异常 ORACLE定义了他们的错误编号和异常 ...

  6. PL/SQL基础2(笔记)

    1 第一个PL/SQL的程序 DECLARE BEGIN DBMS_OUTPUT.PUT_LINE('Hello World!'); END; / --2一个简单的PL/SQL程序 DECLARE v ...

  7. PL/SQL基础1(笔记)

    --基本结构DECLARE--变量声明部分:在此声明PL/SQL用到的变量,类型,游标,以及局部的存储过程和函数BEGIN --执行部分:过程及SQL语句,即程序的主要部分 EXCEPTION --执 ...

  8. oracle PL/SQL基础编程

    PL/SQL(Procedural Language/SQL)是oracle中引入的一种过程化编程语言 PLS-00103:出现符号"declare"在需要下列之一时 符号&quo ...

  9. Oracle数据库—— PL/SQL基础编程

    一.涉及内容 1. 掌握PL/SQL程序块的结构,理解并熟悉各种变量的应用. 二.具体操作 (一)使用system用户登录SQL*PLUS,使用SQL语句创建用户:u_你的姓名首字母(例如:u_zs) ...

  10. PL/SQL 基础编程

    PL/Sql 编程 PL/Sql结构 [declare] --声明变量 begin --执行部分 [exception] ---异常处理部分 end PL/Sql  基本数据类型 数值类型 1. nu ...

随机推荐

  1. 【BZOJ 4007】[JLOI2015]战争调度 DP+搜索+状压

    又是一道思路清新的小清晰. 观察题目,如果我们确定了平民或者贵族的任意一方,我们便可以贪心的求出另一方,至此20分:我们发现层数十分小,那么我们就也是状压层数,用lca转移,线性dp,至此50分(好像 ...

  2. More on understanding sort_buffer_size

    There have been a few posts by Sheeri and Baron today on the MySQL sort_buffer_size variable. I want ...

  3. HDU 5655 四边形判断

    CA Loves Stick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  4. 函数实现多个按钮控制一个div

    <!DOCTYPE HTML><html><head> <meta http-equiv="txttent-Type" txttent=& ...

  5. 程序员的那些问题---转载自veryCD

    展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告   走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过 ...

  6. GoogleMap在js中的应用

    <html> <head> <meta name="viewport" content="initial-scale=1.0, user-s ...

  7. CSS三大特性(继承、优先级、层叠)之个人见解

    首先声明一下CSS三大特性——继承.优先级和层叠.继承即子类元素继承父类的样式,比如font-size,font-weight等f开头的css样式以及text-align,text-indent等t开 ...

  8. js没有重载

    javascript与其他语言(如java)不同,它没有传统意义上的重载(即为函数编写两个定义,只要这两个函数的参数类型或数量不同即可),在js中,后定义的函数会覆盖先前的函数.js中的参数在内部是用 ...

  9. Kali Linux中前十名的Wifi攻击工具

    无 线网络的攻与防一直是比较热门的话题,由于无线信号可以被一定范围内的任何人接收到(包括死黑阔),这样就给WIFI带来了安全隐患:路由器生产厂商和网 络服务供应商(ISPs)的配置大多是默认开启了WP ...

  10. github 下载某一文件夹

    作者:知乎用户链接:https://www.zhihu.com/question/25369412/answer/96174755来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...