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. 云计算OpenStack核心组件---nova计算服务(7)

    一.nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...

  2. 解决SecureCRTPortable和SecureFXPortable的中文乱码问题

    我们使用客户端连接Linux服务器时会出现中文乱码的问题,解决方法如下: 一.修改SecureCRTPortable的相关配置 步骤一:[选项]->[全局选项] 步骤二:[常规]->[默认 ...

  3. linux 磁盘管理命令之df-(转自 Howie的专栏)

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...

  4. STM32电路设计注意

    以后画STM32的电路板 VDDA一定要接 张JF说  VDDA是给内部的时钟电路供电的 还有一定要留 串口或者  下载调试口(串口) 或者显示器接口 输入输出设备最好都留着 这样才能方便调试

  5. 完全理解Python 迭代对象、迭代器、生成器

    在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...

  6. lua type 获取 类型

    lua中的类型作一小记 print(type("Hello world")) --> string print(type(10.4*3)) --> number pri ...

  7. 解决maven依赖冲突问题

    解决maven依赖冲突问题 1.idea 安装maven helper插件 2.打开pom.xml文件 底部多出一个Dependency Analyzer选项 点开这个选项 找到冲突,点击右键,选择E ...

  8. C#后台定义一个DataTable并手动写入静态数据(测试数据)

    //创建一个DataTable,并为之添加数据(自定义DataTable) DataTable dtz = new DataTable(); //添加Table中的列 DataColumn dc1 = ...

  9. 五、自定义Zabbix监控项目

    要求: 沿用练习三,使用Zabbix实现自定义监控,实现以下目标:监控Linux服务器系统账户的数量. 方案: 需要使用Zabbix自定义key的方式实现自定义监控,参考如下操作步骤:1.创建自定义k ...

  10. SpringBoot数据访问(一) SpringBoot整合Mybatis

    前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...