2015/8/17笔记整理 第12章 PL/SQL编程简介1 块 过程 函数

Oracle数据库中包含一种过程化编程语言PL/SQL,PL/SQL是ORACLE对标准数据库语言的扩展。

  一.PL/SQL的优点

PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句。

PL/SQL语句—》ORACLE服务器—》分解代码—》PL/SQL引擎

--》SQL引擎

对于SQL,ORACLE必须在同一时间处理每一条SQL语句,在网络环境下这就意味作每一个独立的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而PL/SQL是以整个语句块发给服务器,这就降低了网络拥挤。


  
二.PL/SQL块结构
  PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:

  1.声明部分(Declaration section)
  声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。
  2.执行部分(Executable section)
  执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。
  3.异常处理部分(Exception section)
  这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。

  PL/SQL块语法


[DECLARE]
--declaration statements;
BEGIN
--executable statements;
[EXCEPTION]
--exception statements;
END;

  PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。注释由--标示。

练习:定义三个变量 分别是长方形 v_width, v_height,v_area 高和面积有初始值: 2,6,对v_width求值,并输出(考虑如果高为0的异常).

DECLARE

v_width number;

v_height number := 2;

v_area number := 6;

BEGIN

v_width := v_area /v_height;

DBMS_OUTPUT.PUT_LINE(‘ v_width:‘|| v_width);

END;

/
  三.PL/SQL块的命名块和匿名块

  PL/SQL程序块:命名的程序块 和 匿名程序块。
  命名程序块:可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。
  PL/SQL程序块可被独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。

ORACLE提供了四种类型的可存储的程序:

   . 函数

   . 过程

   . 包

   . 触发器

  1.函数

  函数是命名了的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下:


CREATE OR REPLACE FUNCTION name [(parameter [IN|OUT|IN OUT] datatype[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]

  2.过程

  存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值存储过程不能由SQL语句直接使用,只能通过call关键字/EXECUT命令或PL/SQL程序块内部调用,定义存储过程的语法如下:


CREATE [OR REPLACE] PROCEDURE name [(parameter [IN | OUT | INOUT] datatype [,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]

IN: 必须为过程、函数的IN参数赋初值,只传入,不传出,不能在代码中再赋值。(传值)

OUT: 只传出,不传入,不接收赋值(传址)

IN OUT: 既能输入,又能更改其值,并输出。

后两种情况,只允许输入已存在的变量。

例范:

过程的例子:

CREATE OR REPLACE PROCEDURE Test(v_ height number, v_area number ) IS

v_width number;

BEGIN

v_width := v_area /v_height;

DBMS_OUTPUT.PUT_LINE(‘ v_width:‘|| v_width);

END;

/

CREATE OR REPLACE PROCEDURE Ptest(v_ename IN emp.ename%TYPE) IS

v_empno emp.empno%TYPE;

BEGIN

SELECT empno INTO v_empno FROM emp WHERE ename = v_ename;

v_ename := ‘SOCTT23’;

DBMS_OUTPUT.PUT_LINE(‘enmpno ‘||v_empno||‘ is ‘||v_ename);

END Ptest;

CREATE OR REPLACE PROCEDURE Ptest2(v_out IN number) IS

BEGIN

DBMS_OUTPUT.PUT_LINE(NVL(v_out,0));

-- v_out := 10;

DBMS_OUTPUT.PUT_LINE(v_out);

END;

如果显示编译错误,可是使用SHOW ERROR显示错误发生的地点和原因

查看存储过程: select * from user_procedures;

删除: DROP PROCEDURE 过程名

无参的PROCEDURE:

CREATE OR REPLACE PROCEDURE Test IS

v_width number;

BEGIN

v_width := 6 /2;

DBMS_OUTPUT.PUT_LINE(‘ v_width:‘|| v_width);

END;

/

函数的例子:要求输入圆的半径,求面积

CREATE OR REPLACE FUNCTION circle_area ( p_radius IN number) RETURN number IS

v_pi number := 3.1415926;

v_area number;

BEGIN

v_area := v_pi* POWER(p_radius,2);

RETURN v_area;

END circle_area;

调用:注意,不能使用exec 函数名的形式!

第一种方式:

SQL> select circle_area(3) from dual;

CIRCLE_AREA(3)

--------------

28.2743334

第二种方式:

SQL> declare

2  v_num number;

3  begin

4  v_num := circle_area(3);

5  dbms_output.put_line(v_num);

6  end;

7  /

28.2743334

PL/SQL块还可以接收用户的输入信息,例如:现在要求用户输入一个雇员编号,之后根据输入的内容进行查询,查询雇员的姓名。

• 用户的输入信息使用“&”完成。

DECLARE

eno NUMBER ;

en VARCHAR2(30) ;

BEGIN -- 输入的信息保存在eno里

eno := &no ; -- 之后根据eno的值,对数据库进行查询操作

SELECT first_name INTO en FROM customers WHERE customer_id=eno ;

DBMS_OUTPUT.put_line(‘编号为:‘||eno||‘雇员的姓名为:‘||en) ;

EXCEPTION

WHEN no_data_found

THEN DBMS_OUTPUT.put_line(‘没有此客户‘) ;

END ;

/

时间: 2024-10-16 05:58:59

2015/8/17笔记整理 第12章 PL/SQL编程简介1 块 过程 函数的相关文章

第三章 PL/SQL编程

3.1 PL/SQL基础知识    3.1.1 什么是PL/SQL?        PL/SQL是结合Oracle过程语言和结构化查询语言的一种扩展语言        3.1.1.1 PL/SQL体系结构(教材76页图3.2)        3.1.1.2 PL/SQL块简介             定义:PL/SQL是一种块结构语言,它将一组语句放在一个块中.            组成:声明部分.执行部分.异常处理部分.            结构:[DECLARE]            

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

本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQL程序设计终极指南>志在打造PL/SQL领域最为系统.全面.实战.权威的著作,通过一系列非常突出的优势在大量的同类书中脱颖而出,成为该领域的标准读物. PL/SQL本身涉及的知识点浩瀚.庞杂,初学者根本无法依靠自身能力理清头绪,学习成本极高.本书对知识点进行了体系化的梳理,化繁杂为有序,突出重点,直指核

Oracle实战笔记(第六天)之PL/SQL基础

一.PL/SQL介绍 1.概念 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL可以用来编写存储过程.存储函数.触发器等等. PL/SQL是结构化SQL,就是在标准SQL中加入了IF...ELSE... For....等控制过程的SQL. 2.学习必要性 提高程序的运行性能传统的使用程序操作数据库的方式需要获得connection

《深入Java虚拟机学习笔记》- 第12章 整数运算

Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算.当byte.short和char类型值参与算术运算时,首先会将它们转换为int类型.这些操作码都不会抛出异常,溢出在这里通常可以被忽略. 整数加法 操作码 操作数 说明 iadd (无) 从栈中弹出两个int类型数,相加,然后将所得int类型结果压回栈 ladd (无) 从栈中弹出两个long类型数,相加,然后将所得long类型结果压回栈 将一个常量与局部变量相加 操作码 操作数 说明 iinc vindex

《白帽子讲WEB安全》学习笔记之第12章 WEB框架安全

第12章 WEB框架安全 12.1 MVC框架安全 在Spring框架中可以使用spring security来增加系统的安全性. 12.2 模板引擎与XSS防御 12.3 WEB框架与CSRF防御 在MVC中防御CSRF: q  在Session中绑定token.如果不能保存到数据库中的Session,则使用Cookie. q  在form表单中自动填写token字段 q  在Ajax请求中封装token. q  在服务器端对比POST提交的token与Session绑定的Tiken是否一致.

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

源码-PL/SQL从入门到精通-第四章-PL/SQL控制语句(基础中的基础)

控制语句对任何一门语言.任何一个程序员而言,都是基础中的基础. 学了PL/SQL,才体会到Java语法的简洁,简直不是一个时代的东西:当然,他们的定位本来就不一样,不能以己之长比之他人之短. --第4章开始 --代码4.1 最简单的IF语句使用示例 DECLARE v_count NUMBER(10) := 0; --定义计数器变量 v_empno NUMBER(4) := 7888; --定义员工编号 BEGIN SELECT COUNT(1) --首先查询指定的员工编号是否存在 INTO v

源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1

随书附带的源码没有序号,部分有bug,调试过程中一并更正. --代码2.1 使用书序结构计算员工薪资 DECLARE v_sal1 NUMBER; v_sal2 NUMBER; v_sumsal NUMBER; BEGIN SELECT sal INTO v_sal1 FROM emp WHERE empno = &empno1; SELECT sal INTO v_sal2 FROM emp WHERE empno = &empno2; v_sumsal := v_sal1 + v_sa

Czbk Web前端视频教程 前端全套教程 汪磊2015版Web前端视频教程 共12章 包含源码

<Web大前端-北京1期就业班[2015-11-2开课]>├<1.html>│ ├<1017_HTML01>│ │ ├01_基础班介绍.avi│ │ ├02_文件和文件夹管理.avi│ │ ├03_特殊案件和快捷键的使用.avi│ │ ├04_互联网原理.avi│ │ ├05_服务器和http.avi│ │ ├06_服务器的小演示.avi│ │ ├07_认识txt纯文本格式.avi│ │ ├08_HTML是描述文档语义的语言.avi│ │ ├09_HTML语义.avi│