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 ...
随机推荐
- nginx 日志管理配置详解
nginx的日志管理 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$statu ...
- Centos7 LVM管理的逻辑卷根目录扩容和/var目录扩容
Centos7 LVM管理的逻辑卷根目录扩容 fdisk /dev/sdb #对新加磁盘进行分区操作pvcreate /dev/sdb1 #创建一个物理卷vgs #查看现有的卷组vgextend ce ...
- 浅谈:@RequestBody,@ResponseBody 和 @RequestParam
1. @RequestBody @RequestBody:主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据) GET方式无请求体,所以使用@RequestBody接收数据时,前端不 ...
- Java反射机制详情(2)
| |目录 运行环境 Java语言的反射机制 Class中的常用方法(获得类的构造方法) Class中的常用方法(获得类的属性) Class中的常用方法(获得类的方法) 反射动态调用类的成员 1.运行 ...
- Locust性能测试工具核心技术@task和@events
Tasks和Events是Locust性能测试工具的核心技术,有了它们,Locust才能称得上是一个性能工具. Tasks 从上篇文章知道,locustfile里面必须要有一个类,继承User类,当性 ...
- SQL Server将同一列多条数据合并成一行
Sql server中,将同一字段多条数据用字符拼接为一个字符串方式. 原数据查询展示: 使用 STUFF 函数,将结果列拼接成一行.结果如下: STUFF: 1.作用 stuff(param1, s ...
- Vue&Element 前端应用开发之菜单和路由的关系
我们一般的应用系统,菜单是很多功能界面的入口,菜单为了更好体现功能点的设置,一般都是动态从数据库生成的,而且还需要根据用户角色的不同,过滤掉部分没有权限的菜单:在Vue&Element的纯前端 ...
- 广播 (broadcasting)
广播 (broadcasting) 飞桨(PaddlePaddle,以下简称Paddle)和其他框架一样,提供的一些API支持广播(broadcasting)机制,允许在一些运算时使用不同形状的张量. ...
- HiCar基本功能介绍
HiCar基本功能介绍 基本概述 一方面,基于操作系统超强的分布式能力,HUAWEI HiCar通过手机和汽车之间的连接,基于三层标准与能力,构建手机和汽车互助资源池,把手机的服务生态延伸到车内,实现 ...
- 基于SSL(TLS)的HTTPS网页下载——如何编写健壮的可靠的网页下载
源码下载地址案例开发环境:VS2010本案例未使用openssl库,内部提供了sslite.dll库进行TLS会话,该库提供了ISSLSession接口用于建立SSL会话. HTTP协议很简单,写个简 ...