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 ...
随机推荐
- 10.27-Redis-mz 深入浅出Redis
深入浅出Redis 1.Redis的发展史 Redis[Remote Directory Server]:远程服务器字典 2.下载安装Redis 1>Linux下安装Reids ...
- vue 实现带模板的EXCEL导出
话不多说直接上代码 1.前端(个人逻辑做了Excel导出和world导出,world导出会在下一个博客中列出) var xhr = new XMLHttpRequest() var url = win ...
- eclispe--tomcat配置
eclipse安装tomcat方法: 1.下载tomcat,从官网下载,地址:http://tomcat.apache.org/download-70.cgi 2.将下载下来的压缩包解压,放在自己想放 ...
- 004:ZYNQ_AXI总线学习笔记(1)
1. WHAT IS AXI? AXI是一种高级可扩展接口,是ARM AMBA的一部分. 2. WHAT IS AMBA? AMBA是高级微控制器总线架构,开放的片内互联总线标准. 3.A ...
- AutomicBoolean
AutomicBoolean 介绍 java并发包下提供的原子变量,是原子类其中之一.基本特性是在多线程环境下,多个线程同时执行这些类的实例包含的方法时,具有排他性 当某个线程进入方法,不会被其他线程 ...
- 自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR)
自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR) 据麦姆斯咨询报道,2032年全球范围内自动驾驶汽车的产量将高达2310万辆,未来该市场的复合年增长率(CAGR)高达58%.届时 ...
- TVM性能评估分析(三)
TVM性能评估分析(三) Figure 1. TVM's WebGPU backend close to native GPU performance when deploying models to ...
- MLPerf结果证实至强® 可有效助力深度学习训练
MLPerf结果证实至强 可有效助力深度学习训练 核心与视觉计算事业部副总裁Wei Li通过博客回顾了英特尔这几年为提升深度学习性能所做的努力. 目前根据英特尔 至强 可扩展处理器的MLPerf结果显 ...
- ieda引入jstl后报错解决办法
报错如下: HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in ei ...
- C++ QT安装教程2021
第一步 去官网下载 https://download.qt.io/archive/qt/ 第二步 next 然后 我是注册的账号 注意密码的格式,要求至少7位,包含大小写字母和数字 第三步 点击下一步 ...