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的更多相关文章

  1. oracle系列(四)PL/SQL

    过程,函数,触发器是PL/SQL编写的,存储在oracle中的.PL/SQL是非常强大的数据库过程语言. PL/SQL优点:性能,模块化,网络传输量,安全性缺点:移植性不好 简单分类:块:过程,函数, ...

  2. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

    本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...

  3. Oracle数据库之PL/SQL程序设计简介

    PL/SQL程序设计简介 一.什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写. ORACLE的SQL ...

  4. 64位Oracle 11g 使用PL/SQL

    Oracle 11g和PL/SQL安装完后,发现打开PL/SQL并不能连接Oracle数据库! [第一回合]完败! 先是在网上找解决方法,说是需要使用Net Configuration Assista ...

  5. oracle数据库之PL/SQL 块结构和组成元素

    一.PL/SQL 块 (一)PL/SQL 程序由三个块组成,即声明部分.执行部分.异常处理部分 PL/SQL 块的结构如下: 1.DECLARE /* 声明部分: 在此声明 PL/SQL 用到的变量, ...

  6. ORACLE中的PL/SQL

    一. 1.过程,函数,触发器是pl/sql编写.                2. 过程函数触发器是在Oracle中.                      3.pl/sql是非常强大的数据库过 ...

  7. 《oracle每日一练》免安装Oracle客户端使用PL/SQL

    免安装Oracle客户端使用PL/SQL Oracle客户端挺招人烦的,部署连接它的应用通常需要先安装它的客户端,安装程序要求在目标机器上写注册表,假设你没有洁癖的话,你仍可能被下面的事情绊住:当你的 ...

  8. Oracle 客户端安装 + pl/sql工具安装配置

    Oracle 客户端安装 +  pl/sql工具安装配置 下载oracle客户端,并在本地安装. 11g下载地址为: http://www.oracle.com/technetwork/databas ...

  9. oracle instantclient basic +pl/sql 安装和配置

    oracle instantclient basic +pl/sql 安装和配置 大家都知道,用PL/SQL连接Oracle,是需要安装Oracle客户端软件的,oracle客户端有点大,比较耗资源. ...

  10. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

随机推荐

  1. working hard to be a professional coder

    1:read 2 : code 3 : 勤奋 4:技术栈 就前端主流技术框架的发展而言,过去的几年里发展极快,在填补原有技术框架空白和不足的同时也渐渐趋于成熟.未来前端在已经趋向成熟的技术方向上面将会 ...

  2. 2559. [NOIP2016]组合数问题

    [题目描述] [输入格式] 从文件中读入数据. 第一行有两个整数t, k,其中t代表该测试点总共有多少组测试数据,k的意义见[问题描述]. 接下来t行每行两个整数n, m,其中n, m的意义见[问题描 ...

  3. Linux 中ifconfig和ip addr命令查看不到ip解决方法

    1.输入查看ip的命令ifconfig或ip addr,查不到ip 2.查看ens33网卡配置,输入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 将ON ...

  4. SkiaSharp drawText中文乱码问题

    var fontManager = SKFontManager.Default; var emojiTypeface = fontManager.MatchCharacter('时'); var te ...

  5. RabbitMQ系列(八)--顺序消费模式和迅速消息发送模式

    MQ使用过程中,有些业务场景需要我们保证顺序消费,而如果一个Producer,一个Queue,多个Consumer的情况下是无法保证顺序的 举例: 1.业务上产生三条消息,分别是对数据的增加.修改.删 ...

  6. iptables详解(1):iptables概念

    所属分类:IPtables  Linux基础  基础知识  常用命令 这篇文章会尽量以通俗易懂的方式描述iptables的相关概念,请耐心的读完它. 防火墙相关概念 此处先描述一些相关概念. 从逻辑上 ...

  7. iOS-关于一些手势冲突问题(scrollView 嵌套 tableView)

    简单说下关于开发中容易遇到的父试图添加手势与子试图点击事件冲突,UIScrollView 嵌套 UIScrollView . UIScrollView 嵌套 UITableView的情况手势冲突问题: ...

  8. 【LeetCode】7、Reverse Integer(整数反转)

    题目等级:Easy 题目描述: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 O ...

  9. 牛客练习赛25 C 再编号

    解题思路 我们先来观察一下题目中给出的公式 $$a'_i=(\sum_{j=1}^na_j)-a_i$$ 通过这个公式推一下经过再编号后的序列的总和,因为我们推出这个和之后可以进行下一次计算. $$\ ...

  10. (C/C++学习)19.单目标遗传算法的C程序实现

    说明:在学习生活中,经常会遇到各种各样的最优问题,其中最常见的就是求某个多维(多个自变量)函数在各个自变量各取何值时的最大值或最小值:例如求函数 f(x) = (x-5)2+(y-6)2+(z-7)2 ...