Oracle基础(四)pl/sql
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。
PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上添加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑推断、循环等操作实现复杂的功能或者计算的程序语言。
总结下来就是是sql语言的扩展,sql语句+变量和常量+条件语句+循环语句+例外处理各种错误!
PL/SQL的作用
使用PL/SQL能够编写具有非常多高级功能的程序。尽管通过多个SQL语句可能也能实现相同的功能,可是相比而言,PL/SQL具有更为明显的一些长处:
⒈可以使一组SQL语句的功能更具模块化程序特点。
⒉採用了过程性语言控制程序的结构。
⒊可以对程序中的错误进行自己主动处理,使程序可以在遇到错误的时候不会被中断。
⒋具有较好的可移植性。能够移植到还有一个Oracle数据库中;
⒌集成在数据库中,调用更快;
⒍降低了网络的交互。有助于提高程序性能。
通过多条SQL语句实现功能时。每条语句都须要在client和服务端传递,并且每条语句的运行结果也须要在网络中进行交互。占用了大量的网络带宽。消耗了大量网络传递的时间,而在网络中传输的那些结果,往往都是中间结果。而不是我们所关心的。
而使用PL/SQL程序是由于程序代码存储在数据库中,程序的分析和运行全然在数据库内部进行,用户所须要做的就是在client发出调用PL/SQL的运行命令,数据库接收到运行命令后。在数据库内部完毕整个PL/SQL程序的运行,并将终于的运行结果返馈给用户。在整个过程中网络里仅仅传输了非常少的数据,降低了网络传输占用的时间,所以总体程序的运行性能会有明显的提高。
pl /sql基础
接下来主要介绍下用pl/sql编写的在块的基础上编写过程,函数,包以及pl/sql进阶的三大控制语句下篇介绍 分页的存储过程。
块结构示意图
Pl/sql块由定义,运行。例外处理部分组成
Declear 定义常量,变。游标,例外。复杂数据类型
Begin 运行
Exception 例外处理
End;
比如:
Declare
V_ename varchar2(5);定义字符串变量
V_sal number(7,2);
Begin
Select ename ,sal into v_ename ,v_sal from emp where empno=&no;
Dbms_output.put_line(‘雇员名:’||v_ename ||’工资:’||
v_sal);
--异常处理
Exception
When no_date_found thendbms_output.put_line(‘朋友,输入错误’);
End
使用Sqlplus开发工具:Pl/sql develper独立工具
(一)1、创建一个简单的表
Createtable mytest(name varchar2(30),passwd varchar2(30));
2、创建过程
Create or replace procedure sp_prolis
Begin
--运行部分
Insert into mytest values(‘韩顺平’,‘m1234’);
End;
3、调用
Exec过程名(參数)
Call过程名(參数)
无返回值的存储过程
Create procedure sp_pro3(spnamevarchar2,newSal
number)is
Begin
--运行部分,依据username去改动工资
Updateemp set sal= newsal where ename=spName;
End;
(二) 函数
Createfunction sp_fun2(spName varchar2) return
Number isyearSal number(7,2);
Begin
--运行部分
Selectsal*12+nvl(comm,0)*12 into yearSal from emp where ename =spName;
ReturnyearSal;
End;
调用函数
Sql varincome number
call annual_income(‘scott’)
from into:income;
Sql>printincome
Java程序中通过rs.getInt(1)得到返回的结果
Sql>showerorr--显示错误
(三)包
--创建包
--创建一个包sp_package
__声明了该包里有一个过程update_sal
---声明一个函数
Createpackage sp_packge is
procedureupdate_sal(name varchar2,newsal number);
Functionannual_income(name varchar2) reture number;
End ;
创建包体
Createpackage body sp_package is
Procedure
Function
Begin
Select
Return
End
End
调用
Sql>call sp_package.function(procedule)
Pl/sql进阶
三种条件分支
If then
Create or replace
procedure sp_pro6(spName varchar2) is
--定义
v_sal smp.sal%type;
Begin
--运行
Select sal into v_sal from empwhere ename=spName;
--推断
If v_sal<2000 then
Update empset sal=sal-sal*10% where ename =spName;
End if;
End;
调用
Sql> execsp_pro6('scott') scott为username
二重条件分支 if- then -else
Create or replace proceduresp_pro6(spName
varchar2) is
- -定义
v_sal smp.sal%type;
Begin
--运行
Select sal into v_sal from empwhere ename=spName;
--推断
If v_com<>0 then
Update empset comm=comm+100 where ename =spName;
Else
Update empset comm=comm+200 where ename=spName;
End if;
End;
调用
Sql> execsp_pro6('scott') scott为username
多重条件分支 if-then-elseif --else
假设该员工的职位是president,就给他的工资添加1000,假设该员工的职位是manager就给他的工资添加500,其它职位的员工添加200
Create orreplace procedure sp_pro6(spNo number) is
--定义
v_job emp.job%type;
Begin
--运行
Selectjob into v_job from emp where empno=spNo;
If v_job='president' then
Update emp set sal=sal + 1000 where empno=spNo;
Elseif v_job='manager ' then
Update empset sal=sal+500 where empno-spNo;
Else
Update empset sal =sal+200 where empno=spNo;
End if ;
End;
调用 sql>Execsp_pro6(7839)
循环语句
Loop End loop至少运行一次。先循环再推断
create or replace proceduresp_pro6 (spName varchar2) is
--定义 := 表示赋值
v_num number:=1;
Begin
Loop
insert into users values (v_num,spName);
--推断是否要退出循环
exit when v_num=10;
--自增
v_num :=v_num+1
End loop;
End;
循环语句 while循环
先推断后循环
create or replace proceduresp_pro6 (spName varchar2) is
--定义 := 表示赋值
v_num number:=11;
Begin
While v_num <=20 loop
--运行
insert into users values (v_num,spName);
--自增
v_num :=v_num+1
End loop;
End;
for循环
Begin
For I inreverse 1….10 loop
Insert into users values(I,'顺平');
End loop;
End;不建议使用
顺序控制语句
Goto建议不用 循环嵌套不要超过三层
用于跳转到特定标号去运行 语句,注意用于使用go
to添加复杂性,可读性差
Declare
i int :=1;
Begin
Loop
dbms_output.put_line('输出i='
|| i);
if I =10 then
got end_loop;
end if;
i:=i+1;
end loop;
<<end_loop>>
--<<>>goto标号
Dbms_output.put_line('循环结束');
End;
Null
不会运行不论什么操作,将控制传递下一句
提高可读性
Declare
v_salemp.sal%type;
v_enameemp.ename%type;
Begin
Select ename,sal into v_ename,v_val
From empwhere empno=%no;
If v_sal<3000 then
Update empsel comm =sal*0.1 where ename=v_ename;
Else
Null;
End if ;
End;
pl/sql出于sql,所以非常大一部分沿袭了sql,之前sql server的学习中没有这么深入的接触。这次在pl/sql里面学到的东西很多其它。学习就这样从不同的角度看问题,然后全面了解它。
Oracle基础(四)pl/sql的更多相关文章
- oracle系列(四)PL/SQL
过程,函数,触发器是PL/SQL编写的,存储在oracle中的.PL/SQL是非常强大的数据库过程语言. PL/SQL优点:性能,模块化,网络传输量,安全性缺点:移植性不好 简单分类:块:过程,函数, ...
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...
- Oracle数据库之PL/SQL程序设计简介
PL/SQL程序设计简介 一.什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写. ORACLE的SQL ...
- 64位Oracle 11g 使用PL/SQL
Oracle 11g和PL/SQL安装完后,发现打开PL/SQL并不能连接Oracle数据库! [第一回合]完败! 先是在网上找解决方法,说是需要使用Net Configuration Assista ...
- oracle数据库之PL/SQL 块结构和组成元素
一.PL/SQL 块 (一)PL/SQL 程序由三个块组成,即声明部分.执行部分.异常处理部分 PL/SQL 块的结构如下: 1.DECLARE /* 声明部分: 在此声明 PL/SQL 用到的变量, ...
- ORACLE中的PL/SQL
一. 1.过程,函数,触发器是pl/sql编写. 2. 过程函数触发器是在Oracle中. 3.pl/sql是非常强大的数据库过 ...
- 《oracle每日一练》免安装Oracle客户端使用PL/SQL
免安装Oracle客户端使用PL/SQL Oracle客户端挺招人烦的,部署连接它的应用通常需要先安装它的客户端,安装程序要求在目标机器上写注册表,假设你没有洁癖的话,你仍可能被下面的事情绊住:当你的 ...
- Oracle 客户端安装 + pl/sql工具安装配置
Oracle 客户端安装 + pl/sql工具安装配置 下载oracle客户端,并在本地安装. 11g下载地址为: http://www.oracle.com/technetwork/databas ...
- oracle instantclient basic +pl/sql 安装和配置
oracle instantclient basic +pl/sql 安装和配置 大家都知道,用PL/SQL连接Oracle,是需要安装Oracle客户端软件的,oracle客户端有点大,比较耗资源. ...
- Oracle数据库之PL/SQL触发器
Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...
随机推荐
- LINQ数据库技术
LINQ(Language Integrated Qyery),中文名字是语言集成查询.它提供一个统一的编程概念和语法,编程人员不需要关心将要访问的是关系数据库还是XML数据,或是远程的对象,它都采用 ...
- Spring.Net学习笔记(2)-依赖注入
一.开发环境 操作系统:Win10 编译器:VS2013 framework版本:.net 4.5 Spring版本:1.3.1 二.涉及程序集 Spring.Core.dll Common.Logg ...
- MVC的学习-EF的认识
1.什么是EF EF又称持久层框架:平时C#定义的变量是保存到内存中的,一断电就没有了.而持久的意思是数据保存到硬盘盘里(数据库的sql查询是在硬盘里进行的,所以速度很慢).EF帮我们将一个对象保存到 ...
- Objective-C设计模式——外观Faced(接口适配)
外观模式 外观设计模式和适配器差不多,不过它门对对象控制的粒度不同,适配器一般只是控制一个系统和客户端的对接.外观则是用来抽象多个系统一起工作. 外观一般具有多个子系统,所以外观应持有多个子系统的引用 ...
- leetcode650 2 Keys Keyboard
思路: 把给定的数分解质因子之后,对于每一个质因子x,都需要x次操作(一次copy all操作和x-1次paste),所以答案就是对分解后的所有质因子求和. 实现: class Solution { ...
- Android Could not find com.afollestad:material-dialogs:0.7.6.0 解决
AS报错:Could not find com.afollestad:material-dialogs:0.7.6.0 网上没有解决方案: 解决: 将用: compile('com.afollesta ...
- ORA-01033:ORACLE initialization or shutdown in process
Oracle遇到问题 :在PL/SQL当输入用户名和密码后 竟然出现标题上错误,我一项目数据库数据库全都没有备份,还有很多很多数据,该不会让我重装数据库吧,想到这个我汗那个流啊. 在网上查了下 看了看 ...
- CAD得到范围内实体(网页版)
主要用到函数说明: IMxDrawSelectionSet::Select 构造选择集.详细说明如下: 参数 说明 [in] MCAD_McSelect Mode 构造选择集方式 [in] VARIA ...
- 用Docker构建MySQL镜像
构建MySQL镜像 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过D ...
- PMP 学习心得
前两天刚考完 PMP,松了一口气,终于考完了,虽然心里有点慌,不知道自己会不会过.学习 PMP 这三个月还是很充实的.不断的看视频,做题目,功夫不负有心人,也算是学到了一些东西.至少知道了一个项目的启 ...