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 ...
随机推荐
- rsync 服务配置_rsync命令使用方法
rsync介绍 rsync用来定时备份服务器中的文件或者目录,有三种工作模式,本地复制,使用系统用户认证,守护进程方式,开源高效.同步工具,把一台机器上的文件同步都另一台机器 .默认使用873端口 选 ...
- Centos6.8安装mysql 步骤
第1步.查看CentOS下是否已安装mysql 输入命令 :yum list installed | grep mysql 第2步.删除已安装mysql 输入命令:yum -y remove mysq ...
- Jenkins 基础篇 - 任务创建
前面了解了 Jenkins 上各种任务的区别后,我们就来实践应用下,先创建一个[文件夹]类型的任务,将我们目前的一些基础的演示任务[移动]到文件夹里面去,这样可以先做个简单的分类. 新建一个[文件夹] ...
- GO文件读写03---使用缓冲读写实现视频文件的拷贝
package main import ( "bufio" "fmt" "io" "os" ) /* ·使用缓冲读写实现 ...
- Relay外部库使用
Relay外部库使用 本文介绍如何将cuDNN或cuBLAS等外部库与Relay一起使用. Relay内部使用TVM生成目标特定的代码.例如,使用cuda后端,TVM为用户提供的网络中的所有层生成cu ...
- Linux实现ffmpeg H.265视频编码
Linux实现ffmpeg H.265视频编码 几乎所有观看的视频,数字地面电视,电缆,卫星或互联网上的压缩.原始的,未压缩的视频太大,会浪费太多的带宽.在DVD和Blu-ray之前,有视频CD(VC ...
- 人工智能AI智能加速卡技术
人工智能AI智能加速卡技术 一. 可编程AI加速卡 1. 概述: 这款可编程AI加速器卡具备 FPGA 加速的强大性能和多功能性,可部署AI加速器IP(WNN/GNN,直接加速卷积神经网络,直接运行常 ...
- 使用现代C++如何避免bugs(下)
使用现代C++如何避免bugs(下) About virtual functions Virtual functions hinder a potential problem: the thing ...
- SpringBoot2 参数管理实践,入参出参与校验
一.参数管理 在编程系统中,为了能写出良好的代码,会根据是各种设计模式.原则.约束等去规范代码,从而提高代码的可读性.复用性.可修改,实际上个人觉得,如果写出的代码很好,即别人修改也无法破坏原作者的思 ...
- 九、配置Tomcat集群
配置Tomcat集群所需服务器三台:192.168.1.5(调度服务器).192.168.1.10(WEB1),192.168.1.20(WEB2) 1.调度服务器设置 [root@proxy ~]# ...