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. Linux服务之cobbler批量部署篇

    一.Cobbler简介:Cobbler通过将设置和管理一个安装服务器所涉及的任务集中在一起,从而简化了系统配置.相当于Cobbler封装了DHCP.TFTP.XINTED等服务,结合了PXE.kick ...

  2. STM32 中的HARDFAULT 的查找方法

    http://blog.csdn.net/zyboy2000/article/details/7668331

  3. 1、大数据 Hadoop配置和单机Hadoop系统配置

    #查看服务器ip ip add #设置主机名称 hostnamectl set-hostname master bash #查看 hostname #绑定ip vi /etc/hosts 添加 服务器 ...

  4. minikube与kubectl版本不一致问题

    在使用minikube学习的时候,会出现你在mac上安装的minikube默认是最新版本,但是实际情况是需要安装低一些版本.可以按照k8s官方文档安装的时候指定不同安装版本,如果很慢或者无法访问直接走 ...

  5. 性能调优必备:NIO的优化实现原理

    前言 我们就从底层的网络 I/O 模型优化出发,再到内存拷贝优化和线程模型优化,深入分析下 Tomcat.Netty 等通信框架是如何通过优化 I/O 来提高系统性能的. 网络 I/O 模型优化 网络 ...

  6. Ubuntu1804下k8s-CoreDNS占CPU高问题排查

    1.背景: 最近在ubuntu804上适配k8s的时候,部署到业务pod的时候,出现了服务器卡死,top查看发现负载很高,进行CPU排序发现如下信息,可知是CoreDNS服务导致. 2. 分析排查: ...

  7. 韩小韩 API接口

    官方网址:https://api.vvhan.com/ 天气API接口: https://api.vvhan.com/api/weather Bing每日图片API接口: https://api.vv ...

  8. 论文阅读:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking

    前言 CVPR2016 来自Korea的POSTECH这个团队   大部分算法(例如HCF, DeepLMCF)只是用在大量数据上训练好的(pretrain)的一些网络如VGG作为特征提取器,这些做法 ...

  9. JAVA并发(5)-并发队列LinkedBlockingQueue的分析

    本文介绍LinkedBlockingQueue,这个队列在线程池中常用到.(请结合源码,看本文) 1. 介绍 LinkedBlockingQueue, 不支持null,基于单向链表的可选有界阻塞队列. ...

  10. 从7nm到5nm,半导体制程

    从7nm到5nm,半导体制程 芯片的制造工艺常常用XXnm来表示,比如Intel最新的六代酷睿系列CPU就采用Intel自家的14nm++制造工艺.所谓的XXnm指的是集成电路的MOSFET晶体管栅极 ...