oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)
匿名PL/SQL块回顾
DECLARE (可选) 定义在PL/SQL块中要使用的对象 BEGIN (必须) 执行语句 EXCEPTION (可选) 错误处理语句 END; (必须) 匿名块(以DECLARE或BEGIN开始)每次使用时都要进行编译。 匿名块不存储在数据库中,并且它不能从其它的PL/SQL块中进行调用。
过程、函数、包和触发器:都是带名块。(请注重同匿名块的比较) 过程、函数、包和触发器:可以存储在数据库中,并且可以在需要的时候运行。 过程、函数、包和触发器:可以从其它PL/SQL块中进行调用。 子程序:过程、函数
子程序是带名的PL/SQL块,能够接受参数和被环境调用。在PL/SQL中两类子程序:过程和函数
子程序说明(header)决定 : PL/SQL子程序的类型是过程还是函数。 子程序的名称 参数列表 当子程序是函数时必须要有返回值(使用RETURN子句) 关键字IS或AS是必须的。 子程序体:是一个拥有声明、执行和异常处理部分的PL/SQL块。 声明部分介于IS|AS和BEGIN之间。在匿名块中必须使用DECLARE关键字显示的指出声明部分,而在子程序中没有DECLARE关键字。 执行部分介于BEGIN和END关键字之间,这部分必须存在。 异常处理部分介于EXCEPTION和 END之间是可选的部分
创建过程(语法)
Example 创建存储过程,输出系统的日期和时间 CREATE OR REPLACE PROCEDURE display_time IS BEGIN dbms_output.put_line(systimestamp); END display_time; 使用三种方式调用上面创建的存储过程 方式一:使用sqlplus命令EXECUTE(简写EXEC) 调用 EXECUTE display_time; 方式二:使用sql命令CALL调用 CALL display_time( ); 方式三:在PL/SQL块中调用 BEGIN display_time; END; 参数和模式
形式参数(Formal parameters):在过程中声明的参数就是形式参数(p_FirstName, p_LastName, p_Major )。
CREATE OR REPLACE PROCEDURE insert_emp [形式参数] (no emp.empno%TYPE, name emp.ename%TYPE, Job emp.job%TYPE, mgr emp.mgr%TYPE, hiredate emp.hiredate%TYPE , salary emp.sal%TYPE , comm emp.comm%TYPE , deptno emp.deptno%TYPE ) IS BEGIN INSERT INTO emp VALUES(no,name,job,mgr,hiredate,salary,comm,deptno); END; 调用上述储存过程[匿名块来调用储存过程(储存过程是带名块。)]
DECLARE v_no emp.empno%TYPE:=10000, v_name emp.ename%TYPE :=‘Jones’, v_job emp.job%TYPE := 'SALESMAN', v_mgr emp.mgr%TYPE :=7369, v_hiredate emp.hiredate%TYPE :=SYSDATE, v_salary emp.sal%TYPE := 800, v_comm emp.comm%TYPE :=NULL, v_deptno emp.deptno%TYPE :=10 BEGIN insert_emp(v_no, v_name, v_job, v_mgr, v_hiredate, v_salary, v_comm, v_deptno ); END;
参数和模式 过程可以通过参数和调用环境进行数据传递。 有三种传递模式—IN、OUT和IN OUT。如果没有为形式参数指定模式,则使用缺省模式IN。
对形式参数的约束:在过程声明中,限制CHAR和VARCHAR2参数的长度以及限制NUMBER参数的精度和/或刻度范围都是非法的。 CREATE OR REPLACE PROCEDURE ParameterLength ( p_Parameter1 IN OUT VARCHAR2(10), p_Parameter2 IN OUT NUMBER(3,2)) AS BEGIN p_Parameter1 := 'abcdefghijklm'; p_Parameter2 := 12.3; END ParameterLength; / 过程声明非法
参数和模式--参数的缺省值
CREATE OR REPLACE PROCEDURE add_dept (p_name IN dept.dname%TYPE DEFAULT 'unknown', p_loc IN dept.loc%TYPE DEFAULT 'NEW YORK') IS BEGIN INSERT INTO dept (deptno,dname, loc) VALUES (dept_seq.NEXTVAL, p_name, p_loc); END add_dept; 执行:(用匿名块来执行 带名块)
SQL>BEGIN add_dept; add_dept ('TRAINING'); add_dept ( p_loc =>'BOSTON ', p_name => 'EDUCATION'); add_dept ( p_loc => 'CHICAGO') ; END; SQL>SELECT * FROM dept; 删除过程 DROP PROCEDURE raise_salary;
创建函数
CREATE [OR REPLACE] FUNCTION function_name [(argument1 [IN | OUT | IN OUT] data_type , argument2 [IN | OUT | IN OUT] data_type,…)] RETURN data_type IS |AS [declaration_section;] BEGIN executable_section; RETURN expression; [EXCEPTION exception_handlers; RETURN expression;] END [function_name]; 相关说明
OR REPLACE关键字指出如果过程存在,首先删除它,然后用新版本创建。 Parameter、mode和datatype的含义与过程相同,但是应该尽量避免使用OUT和IN OUT参数模式。 return_datatype是函数返回的数值的类型,不能对数据类型的尺寸进行限定。 PL/SQL块以BEGIN开始或以局部变量声明开始,以END或END function_name结束。在PL/SQL块中,可以使用多个RETURN语句,但是必须保证至少有一条RETURN语句存在。函数每一次运行只有一个RETURN语句被执行。
举例:。。。。。。。。。。。。。。。。。。。。。。 CREATE OR REPLACE FUNCTION get_sal (p_id IN emp.empno%TYPE) RETURN NUMBER IS v_salary emp.sal%TYPE :=0; BEGIN SELECT sal INTO v_salary FROM emp WHERE empno = p_id; RETURN v_salary; END get_sal;
执行 函数 注意:因为函数具有返回值,所以调用函数是作为一个表达式的一部分,而不能像调用过程那样作为一个独立的语句使用。 方式一:使用变量接收返回值 VAR salary NUMBER; EXEC :salary:=get_sal(7369); PRINT salary;方式二:在SQL语句中直接调用函数 SELECT get_sal(7369) FROM DUAL; 方式三:使用DBMS_OUTPUT调用函数 SET SERVEROUTPUT ON EXEC dbms_output.put_line('工资是:'|| get_sal(7369));
删除函数 DROP FUNCTION get_sal;
创建包
包是一个可以将相关对象存储在一起的PL/SQL结构,是Oracle数据库的一种模式对象。包有两个独立的部分—包的规范和主体,这两部分独立的存储在数据字典中。 包所包含的程序对象是过程、函数、变量、常数、游标和异常。
包比独立的过程和函数有更多的优点: 包使组织应用开发更有效。 包使授权更有效。 包允许修改包的对象而不需要重新编译从属的对象。 包允许ORACLE一次读入多个包对象到内存。 包可包含全局变量和游标,可为包中的全部过程和函数使用。 包允许重载过程和函数。
创建包
建立一个包,要执行两个步骤: (1)用CREATE PACKAGE命令建立包规范。在包规范中说明程序对象,这些对象称为公共对象。公共对象可以在包外引用,也可以在包中的其它对象引用。 (2)用CREATE PACKAGE BODY命令建立包体,在包体中说明和定义程序对象: 定义在包规范中说明的公共对象; 定义附加的包对象(私用对象),由于私用对象是在包体中说明,它不能在包外引用。 CREATE [OR REPLACE] PACKAGE package_name IS|AS public type and item declarations subprogram specifications END package_name; specification
OR REPLACE:如果包规范存在则删除并重新创建包的规范。 package_name:包的名字 public type and item declarations :声明公共的变量、常量、游标、异常和数据类型。 subprogram specifications:声明PL/SQL子程序。 在包规范中声明的变量,默认的初始化值是NULL。
创建包的规范
CREATE OR REPLACE PACKAGE comm_package IS g_comm NUMBER := 0; --initialized to 0 PROCEDURE reset_comm (p_comm IN NUMBER); END comm_package; G_COMM 是一个全局变量,初始化值是0.10。 RESET_COMM 是一个公共的过程,它在包体中定义其执行代码。 创建包体 CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS private type and item declarations subprogram bodies END package_name; OR REPLACE:如果包体存在则删除并重新创建包体。 package_name:包的名字。 private type and item declarations:声明私有的变量、常量、游标、异常和数据类型。 subprogram bodies :定义公有和私有的PL/SQL子程序。 创建包体
CREATE OR REPLACE PACKAGE BODY comm_package IS FUNCTION validate_comm (p_comm IN NUMBER) RETURN BOOLEAN (包中创建函数) IS v_max_comm NUMBER; BEGIN SELECT MAX(comm) INTO v_max_comm FROM emp; IF p_comm > v_max_comm THEN RETURN(FALSE); ELSE RETURN(TRUE); END IF; END validate_comm; PROCEDURE reset_comm (p_comm IN NUMBER) IS (包中创建储存过程) BEGIN IF validate_comm(p_comm) THEN g_comm:=p_comm; --reset global variable ELSE RAISE_APPLICATION_ERROR(-20210,'Invalid commission'); END IF; END reset_comm; END comm_package; 执行
创建一个没有包体包 CREATE OR REPLACE PACKAGE global_consts IS mile_2_kilo CONSTANT NUMBER := 1.6093; kilo_2_mile CONSTANT NUMBER := 0.6214; yard_2_meter CONSTANT NUMBER := 0.9144; meter_2_yard CONSTANT NUMBER := 1.0936; END global_consts; 执行 SQL>EXECUTE DBMS_OUTPUT.PUT_LINE('20 miles = '||20*global_consts.mile_2_kilo|| ' km')
http://www.cnblogs.com/pacoson/p/3523467.html
oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)的更多相关文章
- oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包
匿名PL/SQL块回顾 DECLARE (可选) 定义在PL/SQL块中要使用的对象BEGIN (必须) 执行语句EXCEPTION (可选) 错误处理语句END; (必须)匿名块( ...
- oracle PL/SQL(procedure language/SQL)程序设计
PL/SQL(procedure language/SQL)语言是Oracle对SQL语言的过程化扩充,是一个完整的编程语言.PL/SQL实现了过程化语句(如分支.循环等)与SQL语句的无缝连接,将过 ...
- Oracle笔记--PL/SQL(Procedure Language & Structured Query Language)
1.PL/SQL是一种高级数据库程序设计语言,专门用于在各种环境下对Oracle数据库进行访问.该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理. 2.PL/SQL是对SQ ...
- oracle PL/SQL(procedure language/SQL)程序设计之异常(exception)
什么是异常?在PL/SQL中的一个标识.在程序运行期间被触发的错误.异常是怎样被触发的?产生一个Oracle错误.用户显示触发.怎样处理异常?用异常处理句柄捕获异常.传播异常到调用环境. 捕获异常 E ...
- oracle PL/SQL(procedure language/SQL)程序设计之游标cursors
游标 Cursors--Conception 每一条被Oracle服务器执行的SQL语句都有一个独立的游标与之相关联:隐式游标 Implicit cursors: 用于所有的DML和PL/SQL的SE ...
- oracle PL/SQL(procedure language/SQL)程序设计之触发器(trigger)
创建触发器 触发器类似于过程和函数,都拥有声明.执行和异常处理过程的带名PL/SQL块.与包类似,触发器必须存储在数据库中.前面已经讲过,过程是显式地通过过程调用执行的,同时过程调用可以传递参数.与之 ...
- oracle PL/SQL(procedure language/SQL)程序设计(在PL/SQL中使用SQL)
在PL/SQL程序中,允许使用的SQL语句只有DML和事务控制语句,使用DDL语句是非法的.使用SELECT语句从数据库中选取数据时,只能返回一行数据.使用COMMIT, ROLLBACK, 和SA ...
- oracle PL/SQL(procedure language/SQL)程序设计--控制结构(if else )
IF逻辑结构:IF-THEN-END IFIF-THEN-ELSE-END IFIF-THEN-ELSIF-END IF 语法 IF condition THEN statements;[ELSIF ...
- oracle PL/SQL(procedure language/SQL)程序设计(续集)之PL/SQL函数
PL/SQL函数 examples:“ 构造一个邮件地址 v_mailing_address := v_name||CHR(10)|| ...
随机推荐
- javascript于boolean类型转换,运营商&&和|| 返回值
javascript它是弱类型语言,不管是什么类型的数据可以被转换成boolean种类.转换规则如下面的: 数据类型 转换为boolean后的值 NAN ...
- 【Leetcode】Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...
- 如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目
原文: 如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目 本主题介绍如何在以下产品中使用 一键式发布 发布(部署)Web 应用程序项目: Visual Studio ...
- sql中 in 、not in 、exists、not exists 使用方法和区别
% 的一类. NOT IN:通过 NOT IN keyword引入的子查询也返回一列零值或很多其它值. 以下查询查找没有出版过商业书籍的出版商的名称. SELECT pub_name FROM pub ...
- 关于js中window.location.href,location.href,parent.location.href,top.location.href的使用方法
关于js中"window.location.href"."location.href"."parent.location.href".&qu ...
- C# 6.0 (C# vNext) 的新功能:Exception-Handling Improvements
于 C# 6.0 包裹在异常处理的新功能,有两个方面的改进: 异步处理(async and await)能力 catch block 总结使用.于 C# 5.0 释放 async and await, ...
- 採訪The Molasses Flood:BioShock Infinite 游戏之后又一大作
Xsolla有幸与Flame in the Flood游戏的开发人员之中的一个-----Forrest Dowling进行了採訪,Flame in the Flood这款非常棒的游戏在Kickstar ...
- JavaScript对象(来自百度知道)
JavaScript中对象的创建有以下几种方式: (1)使用内置对象(2)使用JSON符号(3)自定义对象构造 一.使用内置对象 JavaScript可用的内置对象可分为两种:1,JavaScript ...
- 找呀志_java网络编程(4)TCP/IP、Http和Socket差额
经java网络编程(1)网络体系结构及通信协议我知道IP协议相应于网络层.TCP协议相应于传输层.而HTTP协议相应于应用层, 三者从本质上来说没有可比性 TPC/IP协议是传输层协议,主要解决数据怎 ...
- 【Bootstrap】自己主动去适应PC、平面、手机Bootstrap网格系统
酒吧格英语作为一门系统"grid systems",也有人翻译成"网络格系统".使用固定格子设计布局,其风格整齐而简洁,在二战结束后人气,流风格之中的一个. 1 ...