SQL(Structure Query Language)的含义是结构化查询语句,最早由Boyce和Chambedin在1974年提出,称为SEQUEL语言。1976年,IBM公司的San Jose研究所在研制关系数据库管理系统System R时修改为SEQUEL2,即目前的SQL语言。1976年,SQL开始在商品化关系数据库管理系统中应用。1982年美国国家标准化组织ANSI确认SQL为数据库系统的工业标准。目前,许多关系型数据库供应商都在自己的数据库中支持SQL语言,如:Access、Sybase、SQL Server、Infomix、DB2等。

PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。

PL/SQL编制的程序代码如下所示

 DECLARE

               xm varchar2(8):=’丽丽’;

                    zym varchar2(10):=’计算机’;

                    zxf number(2):=45;         

            A integer:=1;   

      BEGIN

               UPDATE  XS

                      SET  zxf=zx

        WHERE  xm=xm; /*更新学生表*/

 

                      IF SQL%NOTFOUND THEN       /*检查记录是否存在,如果不存在就插入记录*/

                      INSERT INTO XS(XH,XM,ZYM,ZXF)

                       VALUES(1,xm,zym,zxf);

                    END IF;

      END;

 

合法字符:

在使用PL/SQL进行程序设计时,可以使用的有效字符包

括以下3类:

(1)所有的大写和小写英文字母;

(2)数字0~9;

(3)符号() + - * / <> = ! ~ ;:. ` @  % ,  " # ^ & _ { } ? [ ]。

PL/SQL标识符的最大长度为30个字符,不区分大小写,但是适当地使用大小写可以提高程序的可读性。

PL/SQL中变量声明格式:

(1)   变量必须以字母(A~Z)开头

(2)   其后跟可选的一个或多个字母、数字(0~9)或特殊字符$、# 或_

(3)   变量长度不超过30个字符

(4)   变量名中不能有空格

常用数据类型:

(1)VARCHAR类型:

语法格式:

var_field VARCHAR(n);

其中长度值n是本变量的最大长度且必须是正整数,例如:

var_field VARCHAR(11);

在定义变量时,可以同时对其进行初始化,例如:

var_field VARCHAR(11):=’Hello world’;

(2)NUMBER类型:

NUMBER数据类型可用来表示所有的数值类型。

语法格式:

num_field NUMBER(precision,scale);

其中precision表示总的位数;scale表示小数的位数,scale缺省表示小

数位为0。如果实际数据超出设定精度则出现错误。例如:

num_field NUMBER(10,2);

num_field是一个整数部分最多使8位,小数部分最多是2的变量。

declare

v_no number:=10;

begin

v_no:=v_no/0;

dbms_output.put_line(v_no);

exception

when others then

dbms_output.put_line('分母不能为0');

end;

(3)DATE类型:

用来存放日期时间类型数据,用7个字节分别描述年、月、日、时、

分、秒。

语法格式:

date_field DATE;

日期缺省格式为DD-MON-YY,分别对应日、月、年,例如17-JUN-

2002。注意,月份的表达要用英文单词的缩写格式。日期的格式可

以设置为中文格式,例如17-六月-2002。

(4)BOOLEAN类型:

逻辑型(布尔型)变量的值只有true(真)或false(假)。逻辑型变量一般用

于判断状态,然后根据其值是“真”或是“假”来决定程序执行分支。关

系表达式的值就是一个逻辑值。

注意:boolean类型变量不能直接通过  dbms_output.put_line(参数);直接输出,如果想输出,必须通过if判断;

条件判断语句:

IF逻辑结构

IF逻辑结构有3种表达式。

(1)  IF-THEN

语法格式:

IF Boolean_expression THEN      /*条件表达式*/

Run_expression          /*条件表达式为真时执行*/

END IF

(2)   IF-THEN-ELSE

语法格式:

IF Boolean_expression THEN             /*条件表达式*/

Run_expression                            /*条件表达式为真时执行*/

ELSE

Run_expression                          /*条件表达式为假时执行*/

END IF;

(3)   IF-THEN-ELSIF-THEN-ELSE

语法格式:

IF Boolean_expression1 THEN

Run_expression1

ELSIF Boolean_expression2 THEN

Run_expression2

ELSE

Run_expression3

END IF;

declare

i number:=10;

begin

if i<=0

then

dbms_output.put_line('分母不能为0');

else

dbms_output.put_line('分母不能为2');

end if;

end;

declare

v_no number:=1000;

begin

if v_no>1000 then

dbms_output.put_line('1');

elsif v_no=1000  then

dbms_output.put_line('2');

else

dbms_output.put_line('3');

end if;

end;

 循环操作语句:

(1) LOOP-EXIT-END循环

语法格式:

LOOP

Run_expression                          /*执行循环体*/

IF Boolean_expression THEN     /*测试Boolean_expression是否符合退出条件*/

EXIT;                                   /*满足退出条件,退出循环*/

END IF;

END LOOP;

declare

i number;

begin

for i in 1..10

loop

dbms_output.put_line(i);

end loop;

end;

declare

i number;

sum1 number:=0;

begin

for i in 1..10

loop

sum1:=sum1 +i;

end loop;

dbms_output.put_line(sum1);

end;

--例:求10的阶乘。

DECLARE

               n NUMBER:=1;

    count1 NUMBER:=2;

BEGIN

LOOP

            n:=n*count1;

            count1:=count1+1;

IF count1>10THEN

EXIT;

ENDIF;

ENDLOOP;

    dbms_output.put_line(to_char(n));

END;

(2)LOOP-EXIT-WHEN-END循环

除退出条件检测有所区别外,此结构与前一个循环结构

类似。

语法格式:

LOOP

Run_expression                                  /*执行循环体*/

EXIT WHEN Boolean_expression      /*测试是否符合退出条件*/

END LOOP;

--例:求10的阶乘。

DECLARE

               n NUMBER:=1;

    count1 NUMBER:=2;

BEGIN

LOOP

      n:=n*count1;

      count1:=count1+1;

EXITWHEN count1=11;

ENDLOOP;

    dbms_output.put_line(to_char(n));

END;

(3)WHILE-LOOP-END循环

语法格式:

WHILE Boolean_expression       /*测试Boolean_expression是否符合退出条件*/

LOOP

Run_expression          /*执行循环体*/

END LOOP;

--例:用WHILE-LOOP-END循环结构求10的阶层。

DECLARE

    n NUMBER:=1;

    count1 NUMBER:=2;

BEGIN

WHILE count1<=10

LOOP

      n:=n*count1;

      count1:=count1+1;

ENDLOOP;

    dbms_output.put_line(to_char(n));

END;

(4) FOR-IN-LOOP-END循环

语法格式:

FOR count IN count_1..count_n      /*定义跟踪循环的变量*/

LOOP

Run_expression      /*执行循环体*/

END LOOP;

--例:用FOR-IN-LOOP-END循环结构求10的阶层。

DECLARE

    n NUMBER:=1;

    count1 NUMBER;

BEGIN

FOR count1 IN2..10

LOOP

      n:=n*count1;

ENDLOOP;

    dbms_output.put_line(to_char(n));

END;

逻辑判断语句:

1.  CASE语句

CASE语句是在Oracle9i才引入的。

语法格式:

CASE input_name

WHEN expression1 THEN result_expression1

WHEN expression2 THEN result_expression2

WHEN expressionN THEN result_expression

[ELSE result_expressionN]

END;

例如:

DECLARE

    ename_1 varchar2(20);

    empno_1 varchar2(16);

    v_Result varchar2(20);

BEGIN

SELECT empno,ename

INTO empno_1,ename_1

FROM emp

WHERE empno='7369';

CASE  length(ename_1)/*判断v_kch的值,并给出结果 */

WHEN1THEN v_Result:='名字有1个字符';

WHEN2THEN v_Result:='名字有2个字符';

WHEN3THEN v_Result:='名字有3个字符';

WHEN4THEN v_Result:='名字有4个字符';

when5then v_result:='名字有5个字符';

ELSE

        v_Result:='Nothing';

ENDCASE;

      dbms_output.put_line(v_result||':'||ename_1);

END;

(5)使用%TYPE

%TYPE属性提供了变量和数据库列的数据类型。

my_xh XS.XH%TYPE;即:变量名 表名.列名%TYPE; 表示该属性为某个表中的某个列的类型一致;

使用%TYPE声明具有以下两个优点:

①   不必知道XH列的确切的数据类型;

②   如果改变了XH列的数据库定义,my_xh的数据类型在运行时会自动进行修改。

例如:

-- Created on 2017/10/19 by ADMINISTRATOR

declare

    employeeNO emp.empno%type;--声明employeeNO 属性类型为emp表的empno列类型一致;

    employeeName emp.ename%type;

 

    deptNO number(5);

    deptName varchar2(20);

 

    i char(1):=2;

begin

if i=1then--注意比较通过一个=号

 

select deptno,dName into deptNO,deptName from dept where deptno=20;

      dbms_output.put_line('查询部门20的编号以及部门名称:'||deptno||':'||deptName);

else

 

select empno,ename into employeeNO ,employeeName from emp where empno=7369;

       dbms_output.put_line('查询7369员工编号以及姓名:'||employeeNO||':'||employeeName);

endif;

end;

(6)   E emp%ROWTYPE

可以使用%ROWTYPE属性声明描述表的行数据的记录;

例如:

-- Created on 2017/10/19 by ADMINISTRATOR

declare

    employee emp%rowtype;--声明employee 属性类型为emp表行类型一致;

    department dept%rowType;--声明deptartment变量为dept行类型;

    i number(5):=2;

begin

if i=1then--注意比较通过一个=号

 

select deptno,dName into department.deptno,department.dname from dept where deptno=20;--可以直接将某列赋值给该变量中的某个字段

      dbms_output.put_line('查询部门20的编号以及部门名称:'||department.deptno||':'||department.dname);

else

 

select emp.*into employee  from emp where empno=7369;--可以直接将正行赋值给该变量

       dbms_output.put_line('查询7369员工编号以及姓名:'||employee.empno||':'||employee.ename||':'||employee.hiredate);

endif;

end;

(7)数组类型:数据是具有相同数据类型的一组成员的集合。在PL/SQL中,数组数据类型是VARRAY。 定义VARRY数据类型语法如:

TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL

例如:

DECLARE

--定义一个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型

TYPE reg_varray_type ISVARRAY(5)OFVARCHAR(25);

--声明一个该VARRAY数据类型的变量

   v_reg_varray REG_VARRAY_TYPE;

 

BEGIN

--用构造函数语法赋予初值

   v_reg_varray := reg_varray_type ('中国','美国','英国','日本','法国');

 

   DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_varray(1)||'、'

||v_reg_varray(2)||'、'

||v_reg_varray(3)||'、'

||v_reg_varray(4));

   DBMS_OUTPUT.PUT_LINE('赋予初值NULL的第5个成员的值:'||v_reg_varray(5));

--用构造函数语法赋予初值后就可以这样对成员赋值

   v_reg_varray(5):='法国';

   DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_varray(5));

END;

(8)record用户定义的记录,必须声明自己的域。记录包含唯一的命名域,具有不同的数据类型。

DECLARE

TYPE TimeRec IS RECORD(HH number(2),MM number(2));

TYPE MeetingTyp IS RECORD

(

Meeting_Date date,

Meeting_Time TimeRec,

Meeting_Addr varchar2(20),

Meeting_Purpose varchar2(50)

)

 

例如:

declare

--type声明一种自定义类型, is record表示该类型中包含有哪些属性

TYPE TimeRec ISRECORD(empno number(10),deptno number(5));

a   timeRec;--a变量为我们声明timeRec类型

begin

select empno,deptno into a  from emp where empno=7369;--into 表示赋值,注意一条语句中只能使用一次 且返回结果不能多条记录

dbms_output.put_line(a.empno);--表示输出

end;

Oracle学习笔记之PL/SQL编程的更多相关文章

  1. 吴裕雄--天生自然ORACLE数据库学习笔记:PL/SQL编程

    set serveroutput on declare a ; b ; c number; begin c:=(a+b)/(a-b); dbms_output.put_line(c); excepti ...

  2. Oracle学习DaySix(PL/SQL续)

    一.游标 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现.游标是一个指向上下文的句柄( handle)或指针.通过游标,PL/SQL 可以控制上下文区和处理语句时上 下文区会发生些 ...

  3. Oracle学习笔记之四,SQL语言入门

    1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...

  4. Oracle学习DayFive(PL/SQL)

    一.PL/SQL简介  PL/SQL 是 Procedure Language & Structured Query Language 的缩写.PL/SQL 是对 SQL 语言存储过程语言的扩 ...

  5. Oracle学习(十一):PL/SQL

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/v123411739/article/details/30231659 1.知识点:能够对照以下的录屏 ...

  6. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...

  7. Oracle学习笔记_02_基本SQL

    1.select语句 (1)语法 SELECT *|{[DISTINCT] column|expression [alias],...} FROM table; (2)示例: 选择全部列 SELECT ...

  8. Oracle学习笔记之四sp1,Oracle 11g的常用函数

    从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i)    分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...

  9. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

随机推荐

  1. 用Beautifulsoup 来爬取贴吧图片

    import urllib.request import bs4 import re import os url="https://tieba.baidu.com/p/1988291937? ...

  2. JUDE-UML工具软件介绍

    JUDE社区版(不考虑破-解). 现在Jude改名为Astah了.JUDE已停止发展,Astah是它的替代品.Jude有3个版: Professional版, Community版(免费),Share ...

  3. 《Java I/O 从0到1》 - 第Ⅱ滴血 “流”

    前言 <Java I/O 从0到1>系列上一章节,介绍了File 类,这一章节介绍的是IO的核心 输入输出.I/O类库常使用流这个抽象概念.代表任何有能力产出数据的数据源对象或者是有能力接 ...

  4. 纯css隐藏移动端滚动条解决方案(ios上流畅滑动)

    纯css隐藏移动端滚动条解决方案(ios上流畅滑动) html代码展示(直接复制代码保存至本地文件运行即可): <!DOCTYPE html> <html lang="en ...

  5. 框架应用:Mybatis (三) - 关系映射

    你有一张你自己的学生证?(一对一) 你这一年级有多少个学生?(一对多) 班上学生各选了什么课?(多对多) 两张表以上的操作都需要联立多张表,而用SQL语句可以直接联立两张表,用工程语言则需要手动完成这 ...

  6. Netty4 学习笔记之一:客户端与服务端通信 demo

    前言 因为以前在项目中使用过Mina框架,感受到了该框架的强大之处.于是在业余时间也学习了一下Netty.因为Netty的主要版本是Netty3和Netty4(Netty5已经被取消了),所以我就直接 ...

  7. Java线程池带图详解

    线程池作为Java中一个重要的知识点,看了很多文章,在此以Java自带的线程池为例,记录分析一下.本文参考了Java并发编程:线程池的使用.Java线程池---addWorker方法解析.线程池.Th ...

  8. 【JavaScript】设计模式-module模式及其改进

    写在前面 编写易于维护的代码,其中最重要的方面就是能够找到代码中重复出现的主题并优化他们,这也是设计模式最有价值的地方 说到这里...... <head first设计模式>里有一篇文章, ...

  9. hdu3729二分匹配

    I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  10. NOIP2017SummerTraining0714

    个人感受:第一题做了字典树,还运行错误,然后就弃疗了,然后水了二三两题,总共拿了85分,倒数. 正确答案 时间限制: 2 Sec  内存限制: 256 MB提交: 702  解决: 82[提交][状态 ...