PLSQL语法
Procedural Language和SQL的结合体。通过增加变量、控制语句,使我们可以写些逻辑更加复杂的数据库操作
语句框架组成
declare – 可选
声明各种变量或游标的地方。
begin – 必要
开始执行语句。
--单行注释语句用两个连在一起的‘-’表示。
/*多行注释语句,
可以换行*/
exception – 可选
出错后的处理。
end; – 必要(请注意end后面的分号)
简单helloworld程序
declare
v_temp number(6):=123; /* := 是一个赋值符号 */
begin
dbms_output.put_line('middle');
dbms_output.put_line(v_temp);
end;
注意
要想显示程序的东西需要设置环境
set serveroutput off -->关闭输出(默认关闭)
set serveroutput on -->打开输出
基本数据类型
- Number 数字型
- Int 整数型
- Pls_integer 整数型,产生溢出时出现错误
- Binary_integer 整数型,表示带符号的整数
- Char 定长字符型,最大255个字符
- Varchar2 变长字符型,最大2000个字符
- Long 变长字符型,最长2GB
- Date 日期型
- Boolean 布尔型(TRUE、FALSE、NULL三者取一)
- %type 表示不需要知道具体的一个字段类型,与指定的字段类型一致即可。例如:v_empno emp.empno%type;
%rowtype 与表结构完全一致 %rowtype 举例:
declare
v_tt emp%rowtype;
begin
select * into v_tt from emp where empno=7521;
dbms_output.put_line(v_tt.job);
dbms_output.put_line(v_tt.sal);
end; 输出:SALESMAN
1250
varray
定义语法
TYPE VARRAYNAMEIS VARRAY(SIZE) OF ELEMENTTYPE [NOT NULL];
其中,varrayname是VARRAY数据类型的名称,size是正整数,表示可以容纳的成员的最大数量,每个成员的数据类型是elementtypeo默认时,成员可以取空值,否则需要使用NOT NULL加以限制。
数组是具有相同数据类型的一组成员的集合。每个成员都有一个唯一的下标,它取决于成员在数组中的位置。在PL/SQL中,数组数据类型是VARRAY(variable array,即可变数组)。
declare
type my_varray is varray(2) of varchar2(12) not null;
varray_my my_varray;
begin
varray_my:=my_varray('dsa','sdafds');
dbms_output.put_line(varray_my(1));
end;
如果初始化数量大于设定的大小,会报下标超出限制异常
如果初始化数量小于设定的大小,会按照初始化数量进行设定大小,访问不存在数据的下标(即使在设定范围内).也会报异常
DECLARE
--定义一个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型
TYPE reg_varray_type IS VARRAY(5) OF VARCHAR(25);
--声明一个该VARRAY数据类型的变量
v_reg_varray REG_VARRAY_TYPE;
BEGIN
--用构造函数语法赋予初值
v_reg_varray := reg_varray_type
('中国', '美国', '英国', '日本', '法国');
DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_varray(1)||'、'
||v_reg_varray(2)||'、'
||v_reg_varray(3)||'、'
||v_reg_varray(4));
DBMS_OUTPUT.PUT_LINE('赋予初值NULL的第5个成员的值:'||v_reg_varray(5));
--用构造函数语法赋予初值后就可以这样对成员赋值
v_reg_varray(5) := '法国';
DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_varray(5));
END;
table
- 定义记录表(或索引表)数据类型。它与记录类型相似,但它是对记录类型的扩展。它可以处理多行记录,类似于C语言中的二维数组,使得可以在PL/SQL中模仿数据库中的表。
定义记录表类型的语法如下:
TYPE TABLE NAME IS TABLE OF ELEMENT_TYPE [NOT NULL] INDEX BY [BINARYINTEGER|LSINTEGER|VARRAY2];
- 关键字INDEX BY表示创建一个主键索引,以便引用记录表变量中的特定行。 BINARY_INTEGER的说明
- 如语句:TYPE NUMBERS IS TABLE OF NUMBER INDEX BY BINARYINTEGER;其作用是,加”INDEX BYBINARYINTEGER ”后,NUMBERS类型的下标就是自增长,NUMBERS类型在插入元素时,不需要初始化,不需要每次EXTEND增加一个空间。
而如果没有这句话“INDEXBY BINARY_INTEGER”,那就得要显示对初始化,且每插入一个元素到NUMBERS类型的TABLE中时,都需要先EXTEND。
--table 不能像varray一样初始化数据,只能一个一个赋值
declare
type table_my is table of number not null index by binary_integer;-- by binary_integer表示创建一个主键索引,以便引用记录表变量中的特定行。
my_table table_my;
begin
my_table(1):=23;
my_table(2):=24;
my_table(3):=24;
dbms_output.put_line(my_table(1));
end; 结果: 23 ---table结合rowtype的使用
declare
type table_my is table of emp%rowtype index by binary_integer; my_table table_my;
begin
select * BULK COLLECT into my_table from emp ;
for i in my_table.first..my_table.last loop
dbms_output.put_line(my_table(i).empno||'=='||my_table(i).ename||'=='||my_table(i).job);
end loop;
end; 结果:1357==oracle==
7369==SMITH==CLERK
7499==ALLEN==SALESMAN
...
table常见方法
record
- 定义记录数据类型。它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的、分离的、基本数据类型的变量组成一个整体的方法,即RECORD复合数据类型。在使用记录数据类型变量时,需要在声明部分先定义记录的组成、记录的变量,然后在执行部分引用该记录变量本身或其中的成员。
定义记录数据类型的语法如下:
TYPE RECORDNAME IS RECORD(
V1 DATATYPE1 [NOT NULL][:=DEFAULTVALUE],
V2 DATATYPE2 [NOT NULL][:=DEFAULTVALUE],
VN DATATYPEN [NOT NULL][:=DEFAULT_VALUE]
);
---record实现多列多行查询
declare
type my_record is record(
v_empno emp.empno%type,
v_ename emp.ename%type,
v_job emp.job%type
);
type my_table is table of my_record index by binary_integer;
table_my my_table;
begin
select empno,ename,job BULK COLLECT into table_my from emp ;
for i in table_my.first..table_my.last loop
dbms_output.put_line(table_my(i).v_empno||'=='||table_my(i).v_ename||'=='||table_my(i).v_job);
end loop;
end;
结果同上一个table
boolean
- 布尔值只有TRUE, FALSE及 NULL 三个值
单行取值select
语法格式
select 字段 into 变量 from 表 where 条件
- 将查询到得数据放入变量中
- 确保必须有唯一一个字段
- 不能存在多个值,也不能为空,否则报错
- 将查询到得数据放入变量中
异常处理,一级自定义异常
语法格式
EXCEPTION
WHEN firstexception THEN code to handle first exception
WHEN secondexception THEN code to handle second exception
WHEN OTHERS THEN code to handle others exception
END;
- 异常处理可以按任意次序排列,但 OTHERS 必须放在最后
常见异常
自定义异常:
declare
v_exception exception;
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=7521;
if v_sal>1000 then
raise v_exception;
else
dbms_output.put_line('还可以');
end if;
exception
when v_exception then
dbms_output.put_line('钱太少啦');
end; 结果:钱太少啦
自定义错误----------------
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=7521;
if v_sal>1000 then
raise_application_error('-20000','工资太低啦');
else
dbms_output.put_line(v_sal);
end if; end;
结果:会弹出弹出框错误
PLSQL嵌套DML的 insert update delete
- 直接使用
- DML语句起作用或者回退的话,需要显式的调用commit或者rollback
- sql%rowcount属性来记录最后一条SQL语句影响了多少 条记录
insert
declare
v_empno emp.empno%type:=&s_empno;
begin
insert into emp(empno,ename) values(v_empno,'张三');
if v_empno>4 then
rollback;
raise_application_error('-20000','不能这样插滴~~');
end if;
end;
结果弹出错误.
update和delete用法同上
execute immediate的用法
- 拼接字符串:标准的sql语句
- execute immediate +字符串
- execute immediate +字符串 into 变量 using 参数
- execute immediate 执行ddl语句或dml语句或dcl语句 (标准的sql语句)
----1---
declare
v_sql varchar2(122):='insert into emp(empno,ename) values(:a,:b)';
begin
execute immediate v_sql using 111,'shfdk';
commit;
end; ----2-----
declare
v_sql varchar2(122) := 'select ename from emp where sal=:a';
v_name emp.ename%type;
begin
execute immediate v_sql
into v_name
using 800;
dbms_output.put_line(v_name);
end;
循环结构
when
打印偶数
declare
v_num number(3, 0) := 0;
begin
loop
dbms_output.put_line(v_num);
v_num := v_num + 2;
exit when v_num = 100;
end loop;
end;
for循环
打印乘法口诀表
begin
for i in 1..9 loop
for j in 1..i loop
dbms_output.put(j||'*'||i||'='||(i*j)||chr(9));
if i=j then dbms_output.new_line();
end if;
end loop;
end loop;
end;
PLSQL语法的更多相关文章
- PLSQL语法深入浅出
一:PLSQL概览:PLSQL 是Oracle公司在SQL基础上进行扩展而成的一种过程语言.PLSQL提供了典型的高级语言特 性,包括封装,例外处理机制,信息隐藏,面向对象等:并把新的编程思想带到了数 ...
- pl/sql programming 02 创建并运行plsql代码
/* * chap 02 * ------------------------------------------------- */ create or replace function wordc ...
- Oracle总结第三篇【PLSQL】
PLSQL介绍 PLSQL是Oracle对SQL99的一种扩展,基本每一种数据库都会对SQL进行扩展,Oracle对SQL的扩展就叫做PLSQL- SQL99是什么 (1)是操作所有关系型数据库的规则 ...
- Oracle总结【PLSQL学习】
PLSQL介绍 PLSQL是Oracle对SQL99的一种扩展,基本每一种数据库都会对SQL进行扩展,Oracle对SQL的扩展就叫做PLSQL... SQL99是什么 (1)是操作所有关系型数据库的 ...
- plsql常用方法-转
在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set nls_language='SIMPLI ...
- Oracle PLSQL数据导出csv的案例
之前项目运维人员碰到一个问题,需要写一个存储过程,把数据导出为csv文件,查了一些资料,帮他写成了一个PLSQL,今天拿出来分享一下,不足之处,欢迎指教. 数据背景: 用到两张表,一张存放单位组织名 ...
- Oracle数据库——Scheduler Job
日常的运维工作中,我们经常使用Linux Server的anacron服务来使得服务器执行一下计划之内的任务,可以按照特定的时间间隔,重复的执行相关的命令或者相关的脚本,来完成预期的目标,能够节省相关 ...
- 【Oracle经典】132个oracle热门精品资料——下载目录
电子书为网友wglzaj精心整理,这批资料下载量好评率都非常高,广受oracle学习者欢迎.文档共整理了12个精品专题和120个热门资料的下载地址,推荐给大家希望大家喜欢. 目录0豆下载地址:http ...
- C# DataTable.Select() 筛选数据
有时候我们需要对数据表进行筛选,微软为我们封装了一个公共方法, DataTable.Select(),其用法如下: Select() Select(string filterExpression) S ...
随机推荐
- ionic2——环境配置篇
环境配置 安装nodeJS 配置cnpm 安装ionic2 安装cordova 安装java sdk 安装android sdk(在项目最后打包时app的时候会用到,前期是在浏览器环境测试开发暂时不需 ...
- Django Cookie Session和自定义分页
Django中操作Cookie 获取Cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, ...
- model1 就是jsp+javabean
- hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)
题目链接 /* 模板题-------判断欧拉回路 欧拉路径,无向图 1判断是否为连通图, 2判断奇点的个数为0 */ #include <iostream> #include <c ...
- Reinforcement Learning Q-learning 算法学习-1
- Effective Python之编写高质量Python代码的59个有效方法
这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码 ...
- Maven环境下多模块项目构建
Maven环境下多模块项目构建 一.新建项目 1.建立我们的父模块par 2.建立我们的子模块dao层 3.建立我们的子模块service层 4.建立我们的子模块web层 5.全部配置完成后,怎么把我 ...
- Linux命令学习(22):ss命令
版权声明 更新:2017-05-20 博主:LuckyAlan 联系:liuwenvip163@163.com 声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的ss命令 ...
- Git 版本管理工具(一)
转自:http://blog.csdn.net/ithomer/article/details/7527877 Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介 ...
- webpack 开发环境
当项目逐渐变大,webpack 的编译时间会变长,可以通过参数让编译的输出内容带有进度和颜色. $ webpack --progress --colors 如果不想每次修改模块后都重新编译,那么可以启 ...