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. DOCKER学习_018:Docker-Compose文件简介

    Docker-Compose文件 通过之前的示例,其实我们可以看到,所有服务的管理,都是依靠docker-compose.yml文件来实现的.那么我们接下来就详细说一说docker-compose.y ...

  2. linux 修改IP, DNS -(转自fighter)

    linux下修改IP.DNS.路由命令行设置 ubuntu 版本命令行设置IP cat /etc/network/interfaces # This file describes the networ ...

  3. .NET Core中插件式开发实现

    前言: 之前在文章- AppDomain实现[插件式]开发 中介绍了在 .NET Framework 中,通过AppDomain实现动态加载和卸载程序集的效果. 但是.NET Core 仅支持单个默认 ...

  4. wxPython使用指导

    一.wxPython简介 这是Python一个非常不错的GUI开发库,免费.开源.跨平台,可用组件众多,借助这些组件,程序员可以快速创建完整.功能全面的用户界面,因此应用非常广泛 二.安装方式: pi ...

  5. Jmeter- 笔记11 - 持续集成

    CICD:持续集成 持续交付 进行持续集成的首选工具:Jenkins 性能测试中持续集成:Jenkins(管理集成) + Jmeter(性能工具) + ant(编译代码) ant安装配置步骤: 1.下 ...

  6. 针对Spring MVC的Interceptor内存马

    针对Spring MVC的Interceptor内存马 目录 针对Spring MVC的Interceptor内存马 1 基础拦截器和调用流程的探索 1.1 基础拦截器 1.2 探索拦截器的调用链 1 ...

  7. return true 和 return false 和 return

    1.return false:相当于终止符,干了3件事,阻止默认行为,取消事件冒泡,以及停止回调执行立即返回: 2.return:停止回调执行立即返回: 3.return true:相当于执行符,继续 ...

  8. TensorFlow多元线性回归实现

    多元线性回归的具体实现 导入需要的所有软件包:   因为各特征的数据范围不同,需要归一化特征数据.为此定义一个归一化函数.另外,这里添加一个额外的固定输入值将权重和偏置结合起来.为此定义函数 appe ...

  9. TensorRT 7.2.1 开发概要(下)

    TensorRT 7.2.1 开发概要(下) 1.2. Where Does TensorRT Fit? 一般来说,开发和部署深度学习模型的工作流要经过三个阶段. Phase 1 is trainin ...

  10. Windows下Qt VS 打包程序 到他人电脑安装运行出现的问题

    1.可能缺程序依赖的Qt动态库   ------>    使用Qt自带的windeployqt进入安装程序所在的文件夹内进行自动配置 将程序安装在C盘之外的盘,这样可以方便windeployqt ...