PL/SQL程序由三个块组成:声明部分、执行部分、异常处理部分。PL/SQL有下列程序单元:过程,函数,包说明,包体 。存储过程是作为对象存在于oracle数据库的程序单元。oracle实现存储过程作为过程、函数和包。 PL/SQL不能调用包,可以调用包中可见部分的过程和函数。包是封装同子程序一样持久数据的程序单元。 
参数模式有:IN 、OUT、IN OUT。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 
PL/SQL的结构如下:
DECLARATIVE 
----声明部分:在此声明PL/SQL中使用到的变量、类型、及游标,以及局部变量中的存储过程和函数
BEGIN
----执行部分:过程及SQL语句,及程序的主要部分
EXCPTION
----执行异常部分:错误处理
END;
其中,执行部分不能省略;
Eg1   过程:
CREATE OR REPLACE PROCEDURE print_temp 
IS 
v_average NUMBER; 
v_sum     NUMBER; 
BEGIN 
SELECT AVG(n), SUM(n) INTO v_average, v_sum 
FROM TEMP; 
dbms_output.put_line('Average:'||v_average); 
dbms_output.put_line('Sum:'||v_sum); 
END print_temp; 
sqlplus调用过程: 
SQL>execute insert_temp; 
SQL>execute insert_temp(); 
都是正确的。 
Eg2  函数:
CREATE OR REPLACE FUNCTION tomorrow RETURN DATE 
IS 
next_day DATE; 
BEGIN 
next_day := SYSDATE + 1; 
RETURN next_day; //函数都有返回值,没有function必须有return
END tomorrow; 
Eg3 包
CREATE OR REPLACE PACKAGE students_pkg IS 
PROCEDURE add_student 
(v_student_name   IN students.student_name%TYPE, 
v_college_major IN students.college_major%TYPE, 
v_status         IN students.status%TYPE, 
v_state          IN students.state%TYPE DEFAULT NULL, 
v_license_no     IN students.license_no%TYPE DEFAULT NULL); 
FUNCTION NO_OF_STUDENTS 
(v_major IN major_lookup.major_desc%TYPE DEFAULT NULL, 
v_status IN students.status%TYPE DEFAULT NULL) 
RETURN NUMBER; 
END students_pkg; 
Eg4 包主体(上面包的实例)
CREATE OR REPLACE PACKAGE BODY students_pkg IS 
PROCEDURE add_student 
(v_student_name   IN students.student_name%TYPE, 
v_college_major IN students.college_major%TYPE, 
v_status         IN students.status%TYPE, 
v_state          IN students.state%TYPE DEFAULT NULL, 
v_license_no     IN students.license_no%TYPE DEFAULT NULL) 
IS 
BEGIN 
INSERT INTO students VALUES 
('A'||students_pk_seq.NEXTVAL, 
v_student_name, 
v_college_major, 
v_status, 
v_state, 
v_license_no); 
END add_student; 
FUNCTION NO_OF_STUDENTS 
(v_major IN major_lookup.major_desc%TYPE DEFAULT NULL, 
v_status IN students.status%TYPE DEFAULT NULL) 
RETURN NUMBER 
IS 
ccount INTEGER; 
BEGIN 
SELECT COUNT (*) INTO ccount 
FROM   students, major_lookup 
WHERE students.college_major = major_lookup.major 
AND    major_lookup.major_desc = 
nvl(v_major,major_lookup.major_desc) 
AND   students.status = nvl(v_status,students.status); 
RETURN ccount; 
END NO_OF_STUDENTS; 
END students_pkg; 
使用下面方式调用: 
temp_operations.insert_temp; 
temp_operations.insert_temp(); 
附:PL/SQL模式
PL/SQL程序有3种模式:IN (default),IN OUT,OUT 
(1)、IN 模式参数是一个常量 
IN模式参数是一个常量必须被看作常量。下面的过程将不能编译成功以为第3行是一个IN模式变量 
PROCEDURE print_next_value(v_data IN INTEGER) IS 
BEGIN 
v_data := v_data+1; -- compile error 
dbms_output.put_line(v_data); 
END; 
常量可以用在表达式中,下面的用法是正确的: 
PROCEDURE print_next_value(v_data IN INTEGER) IS 
BEGIN 
dbms_output.put_line(v_data+1); 
END; 
(2)、IN OUT模式 
IN OUT模式的变量既可以在赋值语句的左边,也可以在赋值语句的右边。 
PROCEDURE change_data(v_data IN OUT INTEGER) IS 
BEGIN 
for i in 1..10 loop 
v_data := v_data + 1; 
end loop; 
END; 
(3)、OUT模式 
在下例中,第4行之前,v_data变量是一个null,在使用OUT模式变量前必须先给他赋一个值: 
PROCEDURE provide_data(v_data OUT INTEGER) 
IS 
BEGIN 
v_data := 100; 
FOR i IN 1..10 LOOP 
v_data := v_data +1; 
END LOOP; 
END; 
(4)、参数默认值 
过程或函数说明可以为IN或IN OUT参数定义一个初始默认值。下面两种方法都是正确的
PROCEDURE name 
(argument mode datatype := a_default_value); 
PROCEDURE name 
(argument mode datatype DEFAULT a_default_value); 
下面函数定义了以默认半径为1返回圆的面积: 
FUNCTION circle 
(radius IN NUMBER := 1) RETURN NUMBER IS 
BEGIN 
RETURN 3.14 * radius**2; 
END;

FUNCTION circle 
(radius IN NUMBER DEFAULT 1) RETURN NUMBER IS 
BEGIN 
RETURN 3.14 * radius**2; 
END; 
(5)、%TYPE 
%TYPE 的意思是变量声明类型和数据库表的指定字段类型一致。 
variable_name table_name.column_name%TYPE;

转载于:https://blog.51cto.com/pioncare2012/710705

PL/SQL 结构与实例相关推荐

  1. PL\SQL结构控制、异常

    PL\SQL结构控制     1.IF条件控制语句(三种基本方式+IF语句的嵌套使用)         (1)IF...         (2)IF...ELSE         (3)IF...EL ...

  2. oracle12 pl/sql

    pl/sql块介绍 介绍 块(block)是pl/sql的基本程序单元,编写pl/sql程序实际上就是编写pl/sql块,要完成相对简单的应用功能,可能只需要编写一个pl/sql块,但是如果想要实现复 ...

  3. ORACLE PL/SQL编程

    PL/SQL程序设计 什么是PL/SQL PL/SQL是 Procedure Language & Structured Query Language 的缩写.PL/SQL是对SQL语言存储过 ...

  4. Oracle PL/SQL编程详解

    Oracle PL/SQL编程详解 - 古立 - 博客园 <我的网络摘抄本> 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅 随笔- 84  文章- 0  评论- 0  & ...

  5. Oracle学习笔记(最重要的是PL/SQL编程)

    一:Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1) sys用户是超级用户,具有最高权限,具有sysdba角色,有create databa ...

  6. Oracle PL/SQL匿名块

    转载:  http://blog.163.com/lyq_163_2009/blog/static/1340826962010712103822138/ PL/SQL单行注释使用--,多行注释使用/* ...

  7. PL/SQL块结构和组成元素

    本篇主要内容如下: 2.1   PL/SQL块 2.2   PL/SQL结构 2.3   标识符 2.4   PL/SQL 变量类型 2.4.1  变量类型 2.4.2  复合类型 2.4.2.1 记 ...

  8. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...

  9. 【PL/SQL】开发程序

    1.开发PL/SQL过程 · 程序是指被命名的PL/SQL块 ·可以存在参数 ·可以被其他应用程序调用 ·语法: CREATE [OR REPLACE] PROCEDURE procedure_nam ...

最新文章

  1. 使用C++ ostringstream来格式化字符串输出
  2. Note:类(Class)
  3. mysql 22001_mysql ERROR 1264 (22003): Out of range value for column 'x' at row 1 错误
  4. Windows 下 OpenGL ES 开发环境搭建
  5. eclipse中tomcat启动不了_Eclipse怎样与Tomcat集成
  6. 1千条数据平均分配给15人_5项数据挂零!但5犯太吓人!CBA第1狠人场均干1人
  7. C++学习之路 | PTA乙级—— 1023 组个最小数 (20分)(精简)
  8. oneplus 驱动_OnePlus投放CyanogenMod,Raspberry Pi 2驱动的机器人等
  9. java学习(六)多线程 中
  10. Word2Vec入门
  11. Win7安装curl工具、解决PowerShell ISE中文乱码问题
  12. 笔记本电脑开不了机怎么重装系统?小熊U盘重装win7系统教程
  13. MMA7660传感器使用心得
  14. 漏洞库:爬取NVD-美国国家信息安全漏洞库
  15. cpu倍频怎么调_认识外频和倍频,可以极限超频,把你CPU性能发挥到最大化
  16. 苹果电脑各型号支持的macOS版本列表
  17. fastjson基本使用
  18. 解密刷子是如何进行APP刷量的?
  19. 后缀名为jnlp的文件的打开方式
  20. windows下安装Python和安装Python解释器

热门文章

  1. 8个超棒的使用javascript开发的视觉特效网站
  2. SilverLight4调用WebService跨域访问问题
  3. Hibernate 缓存的使用
  4. 黑客攻防技术宝典Web实战篇第2版—第3章 Web应用程序技术
  5. OpenAtom Pika 来了!
  6. Java企业面试算法新得体会之3二叉树问题24问
  7. 如何在 Laravel 中使用锁
  8. jq阻止事件冒泡(点击子级不触发父级)的两种方法
  9. centos 安装sublime3
  10. Flink window 用法介绍