PL/SQL语法
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语法的更多相关文章
- 【SQL】Oracle的PL/SQL语法及其拓展数据类型总结
PL/SQL语法 PL/SQL程序由三部分组成,声明部分.执行部分.异常处理部分. 模板: DECLARE /*变量声明*/ BEGIN /*程序主体*/ EXCEPTION /*异常处理部分*/ E ...
- PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)
PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...
- SQL PL/SQL语法手册
SQL PL/SQL语法手册 目 录 第一部分 SQL语法部分 3 一. CREATE TABLE 语句 3 二. CREATE SEQUENCE语句 5 三. CREATE VIEW语句 6 ...
- PL/sql语法单元
1.字符集 PL/SQL的字符集包括: 所有大小写字母:包括A~Z和a~z. 数字:包括0~9. 空白字符:包括制表符.空格和回车符 其他常用英文符号 2.标识符 标识符用于定义PL/sql变量.常量 ...
- oracle PL/SQL语法基础
目录 数据类型 定义变量 PL/SQL控制结构 参考资料 Oracle10g数据类型总结 PL/SQL之基础篇 数据类型 学习总结 字符类型 char.nchar.varchar.nvarchar:有 ...
- oracle学习笔记(十五) PL/SQL语法结构以及使用
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...
- 匿名PL/SQL
立此存照 匿名PL/SQL 语法结构:PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL程序包含了一个或多个逻辑块,每一块都可以划分3个部分.变量在使用前必须声明,P ...
- Oracle——PL/SQL 语句
目录: 1.什么是PL/SQL 2.PL/SQL 语法基础 3.PL/SQL 实例 一.过程 实例 二.函数 实例 三.游标的使用 实例 四.动态sql 实例 五.触发器 实例 1.什么是 ...
- PL/SQL学习笔记_01_基础
PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command 窗口中运行 在SQL窗口中运行步骤同 SQL语句 在command 窗口中运行的步骤如下: 1)File—new com ...
随机推荐
- Linux服务之cobbler批量部署篇
一.Cobbler简介:Cobbler通过将设置和管理一个安装服务器所涉及的任务集中在一起,从而简化了系统配置.相当于Cobbler封装了DHCP.TFTP.XINTED等服务,结合了PXE.kick ...
- STM32 中的HARDFAULT 的查找方法
http://blog.csdn.net/zyboy2000/article/details/7668331
- 1、大数据 Hadoop配置和单机Hadoop系统配置
#查看服务器ip ip add #设置主机名称 hostnamectl set-hostname master bash #查看 hostname #绑定ip vi /etc/hosts 添加 服务器 ...
- minikube与kubectl版本不一致问题
在使用minikube学习的时候,会出现你在mac上安装的minikube默认是最新版本,但是实际情况是需要安装低一些版本.可以按照k8s官方文档安装的时候指定不同安装版本,如果很慢或者无法访问直接走 ...
- 性能调优必备:NIO的优化实现原理
前言 我们就从底层的网络 I/O 模型优化出发,再到内存拷贝优化和线程模型优化,深入分析下 Tomcat.Netty 等通信框架是如何通过优化 I/O 来提高系统性能的. 网络 I/O 模型优化 网络 ...
- Ubuntu1804下k8s-CoreDNS占CPU高问题排查
1.背景: 最近在ubuntu804上适配k8s的时候,部署到业务pod的时候,出现了服务器卡死,top查看发现负载很高,进行CPU排序发现如下信息,可知是CoreDNS服务导致. 2. 分析排查: ...
- 韩小韩 API接口
官方网址:https://api.vvhan.com/ 天气API接口: https://api.vvhan.com/api/weather Bing每日图片API接口: https://api.vv ...
- 论文阅读:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking
前言 CVPR2016 来自Korea的POSTECH这个团队 大部分算法(例如HCF, DeepLMCF)只是用在大量数据上训练好的(pretrain)的一些网络如VGG作为特征提取器,这些做法 ...
- JAVA并发(5)-并发队列LinkedBlockingQueue的分析
本文介绍LinkedBlockingQueue,这个队列在线程池中常用到.(请结合源码,看本文) 1. 介绍 LinkedBlockingQueue, 不支持null,基于单向链表的可选有界阻塞队列. ...
- 从7nm到5nm,半导体制程
从7nm到5nm,半导体制程 芯片的制造工艺常常用XXnm来表示,比如Intel最新的六代酷睿系列CPU就采用Intel自家的14nm++制造工艺.所谓的XXnm指的是集成电路的MOSFET晶体管栅极 ...