PL/SQL语法

由于pl/sql是编译后执行的,而sql语句是未经编译的,因此pl/sql语句在执行速度上更快,同时也减少了客户机和服务器的传输。

基本结构

DECLARE

声明变量、常量、用户定义的数据类型以及游标等

可选

BEGIN

主程序体

EXCEPTION

异常处理程序,当程序出现错误时,执行这一部分。

END;

声明部分、执行部分、异常处理部分。执行部分是必须的,其他俩部分可选。

Pl/sql符号

+     加

-     减

*     乘

/     除

=    等于

:=赋值

>    大于

<    小于

(

)

;     语句结束

%    属性指示符

,    项目分隔符

@    数据库连接指示符

/     字符串分界符

:    绑定变量指示符

**    指数操作符

<>    不等于

!=     不等于

~=      不等于

^=      不等于

<=       小于等于

>=       大于等于

:=    赋值

=>     链接操作符

..      范围操作符

||      串连接

--      单行注释

/* */    多行注释

常量和变量

1、定义常量

<常量名> constant <数据类型> := <值>

pass_Score constant INTEGER := 60

2、定义变量

<变量><数据类型>

address VARCHAR2(20);-------------------初始值为NULL

数据类型

1 数字类型: number  、 pls_integer、  binary integer

2 字符类型: varchar2、char 、long、nchar  nvarchar2

varchar2 和数据库中的varchar2不同,最大长度为32767

3日期类型:date

4 布尔类型   boolean---------------true   false  null

5自定义类型

type  <类型名> is <数据类型>

Oracle中 允许定义两种数据类型   record(记录类型)和table(表类型)

type   user_record is record(

id number(5) ,

name varchar2(20),

sex char(1)

)

使用:

auser  user_record

auser.id     auser.name  ..........

另外,pl/sql还提供了两种特殊的变量   %TYPE和%ROWTYPE,用来声明与表的列相匹配的变量和用户定义数据类型。前一个表示单属性的数据类型,后一个表示整个属性列表的结构

上面例子可以改写为:

type   user_record is record(

Id   USERS.id%TYPE

Users是一个表

Id的和 users表中的id类型相同

Name USERS.NAME%TYPE

Sex USERS.SEX%TYPE

)

user_record  USERS%ROWTYPE;

user_record.

aaa EMPLOYEES%ROWTYPE

type aaa is record(

Employee_id number

First_name varchar2()

............

)

结构控制语句

选择结构

If ...then...     If(){}

If...then...else...

If...then...elseif

End if

case

if    no  = 100    then

insert into users()

end if;

if    no  = 100    then

Insert into users();

else

Insert into.....

end if;

If score>90 then

Score := score-5;

else if score<60 then

Score:=score+5;

end if;

case------类似于switch

num:=  case  name

when 'A' then '0001'

when 'B' then '0003'

....

else 'no user'

end;

null结构

Declare

Num1 number;

Num2 number;

Res varchar2(10)

Begin

If num1<num2 then

Res:='yes'

Else

Res:='no';

End if;

End;

Declare

Num1 number;

Num2 number;

Res varchar2(10)

Begin

If num1>num2 then

Res:='no'

Else

Res:='yes';

End if;

End;

当num1=1 num2=null时,结果将是不同的

所以要在程序中加入null值检查

If    num1 is  null   or   num2 is null  then  res :=‘noresult’

Else if。。。。。。。。。。。

循环结构

1  loop...exit...end

Control_var := 0;   循环因子

loop--------------------------------------------循环开始

If control_var>5 then

Exit;

End if;

Control_var:=Control_var+1;

.......

End loop;------------------------------------------循环结束

2  loop...exit when...end

Control_var := 0;

Loop

Exit when  Control_var>5

Control_var:=Control_var+1;

End loop;

3.while ...loop...end

Control_var := 0;

While Control_var<5 loop

Control_var:=Control_var+1;

......

End loop;

4.for... In...loop...end

for control_var in 0..5 loop

.......

End loop;

declare

control_var number;

begin

control_var:=0;

for control_var in 0..5 loop

dbms_output.put_line('123');

end loop;

end;

游标   cursor

类似于C语言中的指针,但指针的数据是定义好的,游标用select语句从表或视图中选出需要的数据,然后放入内存中,游标指向查询结果的首部。使用游标对此查询结果进行一些取值操作,随着游标的移动,也就访问到了所有的行。

游标分为两种:

隐示游标-----------不需要用户定义。

显示游标-------  用户自己定义

显示游标处理包括4个步骤:

1 声明游标

2 为查询打开游标

3 将结果提取到pl/sql变量中

4 关闭游标

例子:

declare

user_id users.id%type;

user_name users.name%type;

user_age users.age%type;

cursor user_cur is select * from users; -- 定义游标

begin

open user_cur; -- 打开游标

fetch user_cur into user_id,user_name,user_age; --将第一行数据存入变量,游标后移

loop --Exit when user_cur%NOTFOUND

Exit when not user_cur%FOUND;---如果游标到结尾结束

if user_age>20 then

dbms_output.put_line('老人');

else

dbms_output.put_line('年轻人');

end if;

fetch user_cur into user_id,user_name,user_age;

end loop;

close user_cur;

end;

隐式游标操作

Select id ,name,sex into user_id,user_name,user_sex from users where id =100;

游标的属性操作

%FOUND-----是否找到游标

%NOTFOUND---是否没找到游标

%ROWCOUNT------游标行数

%ISOPEN

----------------------------------------------------------------------------------------------------------------

动态游标

声明:

TYPE<类型名>  IS  REF  CURSOR  RETURN <返回类型>

Type user_cur_type is ref cursor return users%rowtype;

User_cur   user_cur_type;

也可不加return-------即,非受限游标变量

Type user_cur_type is ref cursor;

User_cur   user_cur_type;

存储过程:

Create or replace mycount(in_sex in user.ssex%type)

As

Out_num number;

Begin

If in_sex ='m' then

Select count(sex) into out_num from users where sex='m';

Dbms_output.put_line(out_num);

Else

Select count(sex) into out_num from users where sex='f;

Dbms_output.put_line(out_num);

End if;

End count;

执行

Execute count(‘m’);

参数类型:

In类型参数

Out类型参数

In out 类型参数

Create or replace produce double(in_num in number,out_num out number)as

Begin

Out_num:=in_num*2;

End double;

PL/SQL语法的更多相关文章

  1. 【SQL】Oracle的PL/SQL语法及其拓展数据类型总结

    PL/SQL语法 PL/SQL程序由三部分组成,声明部分.执行部分.异常处理部分. 模板: DECLARE /*变量声明*/ BEGIN /*程序主体*/ EXCEPTION /*异常处理部分*/ E ...

  2. PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)

    PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...

  3. SQL PL/SQL语法手册

    SQL  PL/SQL语法手册 目   录 第一部分  SQL语法部分 3 一. CREATE TABLE 语句 3 二. CREATE SEQUENCE语句 5 三. CREATE VIEW语句 6 ...

  4. PL/sql语法单元

    1.字符集 PL/SQL的字符集包括: 所有大小写字母:包括A~Z和a~z. 数字:包括0~9. 空白字符:包括制表符.空格和回车符 其他常用英文符号 2.标识符 标识符用于定义PL/sql变量.常量 ...

  5. oracle PL/SQL语法基础

    目录 数据类型 定义变量 PL/SQL控制结构 参考资料 Oracle10g数据类型总结 PL/SQL之基础篇 数据类型 学习总结 字符类型 char.nchar.varchar.nvarchar:有 ...

  6. oracle学习笔记(十五) PL/SQL语法结构以及使用

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...

  7. 匿名PL/SQL

    立此存照 匿名PL/SQL 语法结构:PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL程序包含了一个或多个逻辑块,每一块都可以划分3个部分.变量在使用前必须声明,P ...

  8. Oracle——PL/SQL 语句

    目录: 1.什么是PL/SQL  2.PL/SQL 语法基础 3.PL/SQL 实例 一.过程 实例   二.函数 实例   三.游标的使用 实例 四.动态sql 实例 五.触发器 实例  1.什么是 ...

  9. PL/SQL学习笔记_01_基础

    PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command  窗口中运行 在SQL窗口中运行步骤同 SQL语句 在command  窗口中运行的步骤如下: 1)File—new com ...

随机推荐

  1. 10.27-Redis-mz 深入浅出Redis

    深入浅出Redis 1.Redis的发展史     Redis[Remote Directory Server]:远程服务器字典 2.下载安装Redis 1>Linux下安装Reids     ...

  2. vue 实现带模板的EXCEL导出

    话不多说直接上代码 1.前端(个人逻辑做了Excel导出和world导出,world导出会在下一个博客中列出) var xhr = new XMLHttpRequest() var url = win ...

  3. eclispe--tomcat配置

    eclipse安装tomcat方法: 1.下载tomcat,从官网下载,地址:http://tomcat.apache.org/download-70.cgi 2.将下载下来的压缩包解压,放在自己想放 ...

  4. 004:ZYNQ_AXI总线学习笔记(1)

    1.    WHAT IS AXI? AXI是一种高级可扩展接口,是ARM AMBA的一部分. 2.    WHAT IS AMBA? AMBA是高级微控制器总线架构,开放的片内互联总线标准. 3.A ...

  5. AutomicBoolean

    AutomicBoolean 介绍 java并发包下提供的原子变量,是原子类其中之一.基本特性是在多线程环境下,多个线程同时执行这些类的实例包含的方法时,具有排他性 当某个线程进入方法,不会被其他线程 ...

  6. 自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR)

    自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR) 据麦姆斯咨询报道,2032年全球范围内自动驾驶汽车的产量将高达2310万辆,未来该市场的复合年增长率(CAGR)高达58%.届时 ...

  7. TVM性能评估分析(三)

    TVM性能评估分析(三) Figure 1. TVM's WebGPU backend close to native GPU performance when deploying models to ...

  8. MLPerf结果证实至强® 可有效助力深度学习训练

    MLPerf结果证实至强 可有效助力深度学习训练 核心与视觉计算事业部副总裁Wei Li通过博客回顾了英特尔这几年为提升深度学习性能所做的努力. 目前根据英特尔 至强 可扩展处理器的MLPerf结果显 ...

  9. ieda引入jstl后报错解决办法

    报错如下: HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in ei ...

  10. C++ QT安装教程2021

    第一步 去官网下载 https://download.qt.io/archive/qt/ 第二步 next 然后 我是注册的账号 注意密码的格式,要求至少7位,包含大小写字母和数字 第三步 点击下一步 ...