当前位置:文档之家› 07第七章 包和子程序

07第七章 包和子程序

07第七章 包和子程序
07第七章 包和子程序

第七章包和子程序

1.1目标

1.过程和函数

2.过程和函数在plsql中调用

3.包

1.2知识点

1.过程和函数的作用,语法结构,参数的类型

2.在plsql语句块中调用函数和过程

3.包和包体的作用,语法结构

1.3难点

1.过程和函数的作用,语法结构,参数的类型

2.包和包体的作用,语法结构

1.4讲解内容

前面Plsql是匿名的存储过程,可以批量执行sql操作,并且可以加入条件控制,但是每次执行的plsql脚本不能在服务器端保存,而过程和函数可以将plsql语句块按功能划分,并保存起来,实现代码的复用,简单的讲,过程和函数是对plsql语句块的封装,是有名字的plsql 语句块。

1.4.1过程

过程语法结构:

Create or replace procedure存储过程名称as←创建或重定义存储过程名称,

Begin

执行过程的语句块…

End; ←执行语句块用begin和end包围,相当于程

序中的{},表示语句块的开始和结束

Create or replace procedure存储过程名称(参数1,参数2)as←创建或重定义存储过程名称,

Begin

执行过程的语句块…

End;

要点:

1.参数默认是输入参数,注明out为输出参数in out为输入输出参数

2.没有参数的过程和函数,在过程名称后面不用带()括号

3.有参数的过程和函数,形式参数的数据类型不需要指定长度

4.局部变量放在as 和begin之间,begin和end之间是plsql语句块

示例:

create or replace procedure pro1 as

begin

dbms_output.put_line('dd');

end;

create or replace procedure pro2(v_val1 in out varchar2,v_val2 in out varchar2) as begin

dbms_output.put_line('v_val1:'||v_val1);

dbms_output.put_line('v_val2:'||v_val2);

end;

1.4.2函数

函数的语法结构

和过程类似,区别在于多了一个返回值

Create or replace function函数名称return类型as←创建或重定义函数,必须带return

和返回一个数据的类型

Begin

函数执行的语句块

return返回值←返回值,和创建函数声明中返回类型要一致

End;

示例:

create or replace function fun1 return varchar2as

begin

return'ddd';

end;

create or replace function fun2(v_val1 in out varchar2,v_val2 in out varchar2) return varchar2as

begin

dbms_output.put_line('v_val1:'||v_val1);

dbms_output.put_line('v_val2:'||v_val2);

return'ddd';

end;

1.4.3过程和函数在plsql中调用

在plsql语句块中调用函数和过程

declare

v_val1 varchar2(200):='aaaa';

v_val2 varchar2(200):='dddd';

v_result varchar2(400);

begin

--调用过程1

pro1;

--调用过程2

pro2(v_val1,v_val2);

--调用函数1

v_result:=fun1;

--调用函数2

v_result:=fun2(v_val1,v_val2);

end;

要点:

1.过程可以再sqlplus命令行方式下调用,也可以再plsql语句块中调用,而函数只能在

plsql语句块中调用。

2.过程在命令行下调用使用 call 过程名,在plsql中调用不需要call

1.4.4包

包的概念是将某一系列的函数或过程进行封装打包以便于管理和方便使用,创建包分为创建包体和创建包体2部分

1.4.4.1包头

create or replace package pak1 as

--定义数据类型

type curemptype is ref cursor;

count int;

--定义包的过程和函数

procedure getrecord(curemp_ref out curemptype);

end;

要点:在包头中定义引用游标类型和在plsql语句块declare部分定义有一点区别,在类型名后多一个is

1.4.4.2包体

create or replace package body pak1 as

procedure getrecord(curemp_ref out curemptype) as

begin

open cur_emp for select * from emp;

end;

end;

要点:返回引用游标的存储过程只在过程中打开游标

1.5作业

以scott示例用户表为基础编写存储过程

1.编写一个过程,通过参数传递部门编号,查询并打印相关部门的员工姓名、工作、入职

日期、薪金等详细信息。

2.编写一个函数,给工作是办事员的员工加薪30%,给工作是销售的加薪50%要求使用游

标,函数返回修改的记录个数。

3.编写一个可供java程序调用的存储过程,过程参数定义为输入输出的引用游标,返回

emp表的记录集

4.另外有一个网上商城的系统,为了这个系统创建一个订单处理的包,这个包中有一个存

储过程,用于删除订单,在删除订单的时候要求订单式新建或中止状态的才可以删除,否则抛出异常信息。还有一个函数,用于计算指定订单编号的总金额,每个订单有1个或多个子项,每个子项有单价和数量,函数有一个参数接收订单编号返回订单金额。

以上存储过程和函数都要采用包的方式创建。

oracle子程序和包

实验: 子程序和包 实验目的 (1)掌握函数和子程序的创建和使用。 (2)掌握带参数的子程序的使用。 (3)掌握包的创建和使用。 实验内容 1、编写一个包emp_package,用来对emp表进行操作。其中应包含以上几个功能: (1)编写一个不带参数的过程dept_pro,功能是输出每个部门名称和部门人数,建议使用游标。 SQL> ed 已写入file afiedt.buf 1 create procedure emp_pro 2 is 3 CURSOR dept_cur IS select dname,count(empno)人数from emp,dept 4 where emp.deptno=dept.deptno group by dname; 5 begin 6 for v_dept in dept_cur loop 7 dbms_output.put_line(v_dept.dname||' '||v_dept.人数); 8 end loop; 9* end; SQL> / 过程已创建。 (2)输入职工编号,得到职工姓名的存储过程或函数emp_pro或emp_fun CREATE OR REPLACE PROCEDURE emp_pro ( p_name OUT emp.ename%type, p_sal OUT emp.sal%type, p_eno IN emp.empno%type )

IS begin -- Test statements here select ename,sal into p_name,p_sal from emp where empno=p_eno; end; CREATE OR REPLACE FUNCTION emp_fun(p_eno emp.empno%type) RETURN emp.ename%type IS v_ename emp.ename%type; begin -- Test statements here select ename into v_ename from emp where empno=p_eno; return v_ename; end; (3)编写一个函数dept_fun,向函数传递一个部门号,如果dept表中不包含这个部门号,则返回”无此部门。 SQL> ed 已写入file afiedt.buf 1 CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=&deptno) 2 RETURN dept.dname%type 3 IS 4 v_dname dept.dname%type; 5 begin 6 -- Test statements here 7 select dname into v_dname 8 from dept where deptno=v_deptno; 9 return v_dname; 10 EXCEPTION 11 WHEN NO_DA TA_FOUND THEN 12 DBMS_OUTPUT.PUT_LINE('无此部门'); 13* end; SQL> / 输入deptno 的值: 10 原值1: CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=&deptno) 新值1: CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=10) 函数已创建。

ABAQUS子程序

Home 浅谈ABAQUS用户子程序 李青清华大学工程力学系 摘要本文首先概要介绍了ABAQUS的用户子程序和应用程序,然后从参数,功能两方面详细论述了DLOAD, UEXTERNALDB, URDFIL三个用户子程序和GETENVVAR,POSFIL,DBFILE三个应用程序,并详细介绍了ABAQUS的结果文件(.FIL)存储格式。 关键字ABAQUS,用户子程序,应用程序,结果文件 一、前言: ABAQUS为用户提供了强大而又灵活的用户子程序接口(USER SUBROUTINE)和应用程序接口(UTILITY ROUTINE)。ABAQUS 6.2.5一共有42个用户子程序接口,13个应用程序接口,用户可以定义包括边界条件、荷载条件、接触条件、材料特性以及利用用户子程序和其它应用软件进行数据交换等等。这些用户子程序接口使用户解决一些问题时有很大的灵活性,同时大大的扩充了ABAQUS的功能。例如:如果荷载条件是时间的函数,这在ABAQUS/CAE 和INPUT 文件中是难以实现的,但在用户子程序DLOAD中就很容易实现。 二.在ABAQUS中使用用户子程序 ABAQUS的用户子程序是根据ABAQUS提供的相应接口,按照FORTRAN语法用户自己编写的代码。在一个算例中,用户可以用到多个用户子程序,但必须把它们放在一个以.FOR为扩展名的文件中。运行带有用户子程序的算例时有两种方法,一是在CAE中运行,在EDIT JOB菜单的GENERAL子菜单的USER SUBROUTINE FILE对话框中选择用户子程序所在的文件即可;另外是在ABABQUS COMMAND用运行,语法如下: ABAQUS JOB=[JOB] USER?[.FOR]?C 用户在编写用户子程序时,要注意以下几点: 1.用户子程序不能嵌套。即任何用户子程序都不能调用任何其他用户子程

实验6+过程_函数和程序...

实验6过程、函数和程序包 姓名:学号: 专业:班级: 同组人:无实验日期:2013/7/21 【实验目的与要求】 ?掌握过程的创建与调用 ?掌握PL/SQL函数的编写与调用 ?熟悉程序包的使用 【实验内容与步骤】 6.0.实验准备工作:PL/SQL程序文件的编辑与执行 1.使用文档编辑器编辑以下文件,并保存为aa.sql: 2.以scott身份登录,在SQ L Plus中执行@aa命令运行程序: 注:测试时,文件名请用全名(即包含路径,如:@c:\aa) 给出运行结果:

6.1.存储过程 1.最简单的存储过程编写与执行 (1)创建测试表 drop table Exam_Table; create table Exam_Table( e_id number(5), e_name varchar2(20), e_salary number(8,2) ); (2)创建存储过程 create or replace procedure insert_salary (v_id number,v_name varchar2,v_salary number) is begin insert into Exam_Table values (v_id,v_name,v_salary); commit; dbms_output.put_line('数据插入成功'); end; / (3) 执行(调用)存储过程 exec insert_salary(6,'g',2000); (4)查询执行结果

select * from Exam_Table; 给出执行的最后结果: 2.参数的使用:in/out/in out参数 阅读以下程序,理解不同类型参数使用的不同,运行程序,给出运行结果。 (1) 用两个参数:in ,out 传入一个姓名,输出:某某人你好: create or replace procedure mp(v_in varchar2,v_out out varchar2) is begin v_out:=v_in||'你好'; end; declare v_name varchar2(10); begin mp('scott',v_name); dbms_output.put_line(v_name); end;--输出:scott你好 给出运行结果:

Oracle子程序存储过程

Oracle_子程序_存储过程 select user from dual; set serveroutput on --存储过程 CREATE OR REPLACE PROCEDURE proce_Test --创建过程 is --局部变量 BEGIN dbms_output.put_line('大家好' ); END proce_Test; --执行存储过程建议按f5 执行存储过程 execute proce_test; begin proce_test; end; --------------------------------------------------------------------------------------- ----------------------------------------------- -- 此处说明定义存储过程时不能给形参施加限制(大小),存储过程创建出错,也会保留在服务器上------------------------------------------------ ------错误问题说明 Create procedure Sp_Test1(a varchar2,b out varchar2) -- 此处不能加size,执行存储过程会出错.但该存储过程依然保存在数据库中,此名字已经被占用,当修改正确后,再执行时会抱该对象已经存在的异常,所以建议使用or replace is Begin b :=a; End Sp_Test1; drop procedure sp_Test1 --create or replace procedure --test(a varchar2,b out varchar2) is --begin

第10章 存储过程、函数和包

第10章存储过程、函数和包 存储过程(PROCEDURE)、函数(FUNCTION)和包(PAKAGE)是以编译的形式存储在数据库中的数据库的对象,并成为数据库的一部分,可作为数据库的对象通过名字被调用和访问。 存储过程通常是实现一定功能的模块;函数通常用于计算,并返回计算结果;包分为包头和包体;用于捆绑存放相关的存储过程和函数,起到对模块归类打包的作用。 存储过程、函数和包是数据库应用程序开发的重要方法,三者既有区别,也有联系。 ?存储过程和存储函数。 ?过程的参数和调用。 ?包和包的应用。 10.1 存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的。 10.1.1 认识存储过程和函数 和PL/SQL程序相比,存储过程有很多优点,具体归纳如下: ·存储过程和函数以命名的数据库对象形式存储于数据库当中。存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。 ·存储过程和函数可由数据库提供安全保证,要想使用存储过程和函数,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。 ·存储过程和函数的信息是写入数据字典的,所以存储过程可以看作是一个公用模块,用户编写的PL/SQL程序或其他存储过程都可以调用它(但存储过程和函数不能调用PL/SQL 程序)。一个重复使用的功能,可以设计成为存储过程,比如:显示一张工资统计表,可以设计成为存储过程;一个经常调用的计算,可以设计成为存储函数;根据雇员编号返回雇员的姓名,可以设计成存储函数。 ·像其他高级语言的过程和函数一样,可以传递参数给存储过程或函数,参数的传递也有多种方式。存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;函数有一定的数据类型,像其他的标准函数一样,我们可以通过对函数名的调用返回函数值。 存储过程和函数需要进行编译,以排除语法错误,只有编译通过才能调用。

ORACLE系统包介绍

Oracle 系统包 DBMS_OUTPUT a)启用 i. dbms_output.enable(buffer_size in integer default 20000); ii. set serveroutput on; b)禁用 i. dbms_output.disable; c)PUT和PUT_LINE i. PUT:所有信息显示在同一行 ii. PUT_LINE信息显示后,自动换行 d)NEW_LINE用于在行的尾部追加行结束符,一般用PUT同时使用 e)GET_LINE和GET_LINES i. DBMS_OUTPUT.GET_LINE(li ne 0UTVARCHAR2,status OUT INTEGER)用于取缓冲区的单行 信息 ii. DBMS_OUTPUT.GET_LINES(lines OUT chararr,numlies IN OUT INTEGER) 用于取得缓冲区的多行信息 DBMS_JOB a)SUBMIT用于建立一个新作业 语法 DBMS_JOB.SUBMIT( job OUT BINARY_INTEGER, what IN VARCHAR2, next_date IN DATE DEFATULT SYSDATE, interval IN VARCHAR2 DEFAULT ' NULL' , no_parse IN BOOLEAN DEFAULT FALSE, instance IN BINARY_INTEGER DEFAULT any_instance, force IN DEFAULT FALSE); 例子 VAR jobno NUMBER; BEGIN DBMS_JOB.SUBMI( :jobno, 'pro_hrs101d0_ins_hrs101t0', sysdate, ‘sysdate+1 '); b)REMOVE!于删除作业队列中的特定作业 语法:DBMS_JOB.REMOVE(jov IN BINARY_INTEGER); 例子:DBMS_JOB.REMOVE(10);--删除JOB号为10 的JOB c)CHANGE用于改变与作业相关的所有信息

子程序

第七章子程序和程序包 目标 本节课的主要目标就是了解子程序和程序包。 为什么会用到子程序? 引入 什么是子程序? 子程序就是能够接受参数并被其他程序所调用的命名PL/SQL块。PL/SQL子程序有两种类型,过程和函数。一般地,过程用于执行一个操作,而函数用于计算一个结果值。 与未命名或匿名PL/SQL块一样,子程序也有声明部分,执行部分和一个可选的异常处理部分。声明部分包含类型、游标、常量、变量、异常和嵌套子程序的声明。 子程序 子程序分为过程(store procedure)和函数(function),是一种特殊的pl/sql语句块。它以编译好的的形式存储在数据库中,可以被后来的语句块调用。 运行时是编译而不是运行,要调用才会有结果。 DML增、删、改用过程,计算用函数。 过程:没有返回值。函数:有且只有一个返回值。

子程序作用: 1、允许模块化编程 2、能够实现较快的执行过程 3、能够减少网络流量 4、可作为一种安全机制 存储过程 创建过程的语法 CREATE[OR REPLACE]PROCEDURE [()] IS|AS BEGIN [EXCEPTION ] END; 存储过程中定义的形式参数,不能指定长度,否则报错。 1.不带参数的存储过程 create or replace procedure test1 is begin

dbms_output.put_line('大家好'); end; 执行: SQL>set serveroutput on SQL>exec test1; 任何的输出都要先执行 SQL>set serveroutput on 否则就无法看到输出结果,为什么呢?任何的输出在客户端看不见,他直接往oracle服务器上去输出。执行这句让它在控制台上也输出一份。 2.带输入参数 create or replace procedure test2 ( a in number, b in varchar2 ) is begin dbms_output.put_line(a); dbms_output.put_line(b); end; 调用 SQL>exec test2(1,'a'); 1 a

过程_函数和程序包

过程、函数和和序包 姓名:学号:专业:班级:同组人:实验日期: 【实验目的与要求】 ?掌握过程的创建与调用 ?掌握PL/SQL函数的编写与调用 ?熟悉程序包的使用 【实验内容与步骤】 9.0.实验准备工作:PL/SQL程序文件的编辑与执行 1.使用文档编辑器编辑以下文件,并保存为aa.sql: 2.以scott身份登录,在SQ L Plus中执行@aa命令运行程序: 给出运行结果:

9.1.存储过程 1.最简单的存储过程编写与执行 (1)创建测试表 drop table Exam_Table; create table Exam_Table( e_id number(5), e_name varchar2(20), e_salary number(8,2) ); (2)创建存储过程 create or replace procedure insert_salary (v_id number,v_name varchar2,v_salary number) is begin insert into Exam_Table values (v_id,v_name,v_salary); commit; dbms_output.put_line('数据插入成功'); end; / (3) 执行(调用)存储过程 exec insert_salary(6,'g',2000); (4)查询执行结果 select * from Exam_Table; 给出执行的最后结果:

2.参数的使用:in/out/in out参数 阅读以下程序,理解不同类型参数使用的不同,运行程序,给出运行结果。 (1) 用两个参数:in ,out 传入一个姓名,输出:某某人你好: create or replace procedure mp1(v_in in varchar2,v_out out varchar2) is begin v_out:=v_in||'你好'; end; declare v_name varchar2(10); begin mp1('scott',v_name); dbms_output.put_line(v_name); end;--输出:scott你好 给出运行结果: (2)-- in out类型参数 create or replace procedure mp(name_in in varchar2, name_out out varchar2, name_in_out in out varchar2) is begin dbms_output.put_line(name_in); name_out:= '返回的参数name_out是' || name_in; name_in_out := 'name_in_out是' || name_in || name_in_out; end; variable name_out varchar2(100); variable name_in_out varchar2(20); exec mp('11',:name_out,:name_in_out);

实验5 过程 函数 和程序包

大型数据库技术实验报告实验课程:大型数据库技术(Oracle) 专业 :班级: 姓名:学号:同组人:实验日期: 实验项目实验八过程、函数和和程序包 实验 类型 设计性实验 目的要求?掌握过程的创建与调用 ?掌握PL/SQL函数的编写与调用?熟悉程序包的使用 (实验内容及步骤) 【实验步骤】 8.0.实验准备工作:PL/SQL程序文件的编辑与执行 1.使用文档编辑器编辑以下文件,并保存为aa.sql: 2.以scott身份登录,在SQ L Plus中执行@aa命令运行程序:成绩

给出运行结果: 8.1.存储过程 1.最简单的存储过程 (1)创建测试表 drop table empl; create table empl( e_id number(5), e_name varchar2(20), e_salary number(8,2) ); (2)创建存储过程 create or replace procedure insert_salary (v_id number,v_name varchar2,v_salary number) is begin insert into empl values (v_id,v_name,v_salary); commit; dbms_output.put_line('数据插入成功'); end; / (3) 执行(调用)存储过程 exec insert_salary(6,'g',2000);

(4)查询执行结果 select * from empl; 给出执行的最后结果: 2.存储过程应用实例:列车购票与退票过程简单模拟 drop table ticket; create table ticket ( trainno varchar2(10), ticketnum varchar2(10), primary key (trainno,ticketnum) ); -- 存储过程声明 create or replace procedure init is begin for i in 1..100 loop insert into ticket values ('1111', to_char(i, '0000')); end loop; for i in 1..100 loop insert into ticket values ('2222', to_char(i, '0000')); end loop; for i in 1..100 loop insert into ticket values ('3333', to_char(i, '0000')); end loop;

包和子程序(考试复习)

第七章包和子程序 1.1目标 1.过程和函数 2.过程和函数在plsql中调用 3.包 1.2知识点 1.过程和函数的作用,语法结构,参数的类型 2.在plsql语句块中调用函数和过程 3.包和包体的作用,语法结构 1.3难点 1.过程和函数的作用,语法结构,参数的类型 2.包和包体的作用,语法结构 1.4讲解内容 前面Plsql是匿名的存储过程,可以批量执行sql操作,并且可以加入条件控制,但是每次执行的plsql脚本不能在服务器端保存,而过程和函数可以将plsql语句块按功能划分,并保存起来,实现代码的复用,简单的讲,过程和函数是对plsql语句块的封装,是有名字的plsql 语句块。 1.4.1过程 过程语法结构: Create or replace procedure存储过程名称as←创建或重定义存储过程名称, Begin 执行过程的语句块… End; ←执行语句块用begin和end包围,相当于程 序中的{},表示语句块的开始和结束

Create or replace procedure存储过程名称(参数1,参数2)as←创建或重定义存储过程名称, Begin 执行过程的语句块… End; 要点: 1.参数默认是输入参数,注明out为输出参数in out为输入输出参数 2.没有参数的过程和函数,在过程名称后面不用带()括号 3.有参数的过程和函数,形式参数的数据类型不需要指定长度 4.局部变量放在as 和begin之间,begin和end之间是plsql语句块 示例: create or replace procedure pro1 as begin dbms_output.put_line('dd'); end; create or replace procedure pro2(v_val1 in out varchar2,v_val2 in out varchar2) as begin dbms_output.put_line('v_val1:'||v_val1); dbms_output.put_line('v_val2:'||v_val2); end; 1.4.2函数 函数的语法结构 和过程类似,区别在于多了一个返回值 Create or replace function函数名称return类型as←创建或重定义函数,必须带return 和返回一个数据的类型 Begin 函数执行的语句块 return返回值←返回值,和创建函数声明中返回类型要一致 End; 示例: create or replace function fun1 return varchar2as begin return'ddd'; end;

内置包Oracle

内置程序包 Oracle提供了许多内置程序包,它们用于扩展数据库的功能。在开发应用程序时,可以利 用这些程序包。数据库用户SYS拥有Oracle提供的所有程序包。它们被定义为公有同义词, 并将执行权限授予了PUBLIC用户组,任何用户都可以访问它们。 Oracle提供的程序包的部分列表见表8.1。 续表 下面简单介绍几个常用的内置程序包。 8.2.1 DBMS_OUTPUT DBMS—OUTPUT程序包允许显示PL/SQL块和子程序的输出结果,这样便于测试和调试它们。 PUT和PUT_LINE过程将信息输出到SGA中的缓冲区。通过调用过程GET_LINE或通过 SET SERVEROUTPUT ON,可以显示缓冲区中的信息。 默认缓冲区大小是2000字节。最小值是2000,最大值是1,000,000。DBMS一OUTPUT包 有以下常用过程。 ENABLE

ENABLE过程用来启用对PUT、PUT_ LINE和NEW_LINE等过程的调用,它只有一个输入参数, 即缓冲区大小(BUFFER_SIZE)。缓冲区大小的输入值用于设置默认缓存的信息量。调用 ENABLE将清除任何已废弃会话中缓存的数据。 DISABLE DISABLE没有输入和输出。DISABLE用于禁用对PUT、PUT_LINE和NEW_LINE的所有调用。 调用DISABLE过程还可清除缓冲区中的任何剩余信息。 PUT PUT有一个输入参数,此参数被重载以接受VARCHAR2、NUMBER和DATE值。PUT用于在缓冲 区中存储一条信息。TO_CHAR将使用默认格式设置格式化这些项。 PUT_ LINE PUT_ LINE有一个输入参数,此参数被重载以接受VARCHAR2、NUMBER和DATE值。如果这些 值是要混合使用,则必须显式使用TO_CHAR函数。PUT_LINE过程用于将一条信息存储在缓 冲区中,后接一个行结束标记。 NEW_LINE NEW_LINE没有参数。它用于向缓冲区中添加换行符。换行符充当行结束标记。对 PUT_LINE 或NEW_LINE的每次调用都将产生一行。 例13演示了DBMS_OUTPUT包的用法。 例13: 例13的输出结果如下所示。 8.2.2DBIVIS_LOB

第九章_自陷程序和子程序

第九章自陷程序和子程序 9.1 LC-3自陷程序 9.1.1 介绍 回忆先前一章的图8.5的程序,为了成功地获得从键盘输入,程序员需要知道以下几件事情(第8章): 1、键盘与显示器的硬件数据寄存器:显示器的数据寄存器是为了能够显示一个提示符,而键盘数据寄存器则是让程序知道到哪儿去寻找输入的字符。 2、键盘与显示器的硬件状态寄存器:显示器的状态寄存器是为了让程序知道什么时候可以显示提示符中的下一个字符,而键盘状态寄存器则让程序知道什么时候有人键入了一个字符。 3、键盘输入和执行程序之间的异步关系。 这是大多数应用程序员不知道的知识。实际上,在现实中,如果应用程序员(或有时称为“用户程序员”)必须在这个层面上理解输入与输出,那么在商业上将会很少运用输入/输出,程序员也会大大减少。 另外,如果允许用户程序员直接访问KBDR和KBSR等来实现输入/输出的行为,将会造成另外一个问题出现。输入/输出行为包含了被许多程序所共享的设备寄存器的使用,这就意味着,如果一个用户程序员被允许访问硬件寄存器,他/她没有谨慎处理,这会给其他用户程序制造混乱。这样,让用户程序员访问这些寄存器是不明智的。我们说硬件寄存器是有特权的,那些不拥有适当特权级别的程序是不能访问它们的。 特权的概念带来了一大堆麻烦。不幸的是,我们在这里不能做更多的涉及,把它留给以后做更认真的处理。现在,我们只是注意到这里有用户程序不能访问的资源,只有那些被赋予足够特权的程序才可以控制它们,而没有特权的程序则不可以。说完这些,我们继续手头上的问题,如何“更好”的解决需要输入和/或输出的用户程序。 一个更简单同时也是更安全的解决需要I/O的用户程序问题的方案包括自陷(TRAP)指令和操作系统。操作系统拥有适当的特权级别。 我们已经在第5章介绍了TRAP指令。我们看到,在某些任务中,用户程序通过调用TRAP指令使操作系统做这个工作。这样,用户程序不必要知道前面提到的复杂的细节,并且其他用户程序也会被保护起来,避免用户程序员的不恰当行为的后果。 图9.1显示了一个用户程序在到达地址x4000时,需要执行一个输入输出任务。用户程序请求操作系统代表它完成这个任务。操作系统控制机器,处理TRAP指令指定的请求,然后把控制权返还给用户程序。我们经常把这个用户程序的请求称为服务调用或系统调用。 9.1.2 TRAP机制 TRAP机制包括一些要素,如下: 1、一组由操作系统代表用户程序去执行的服务程序。它们是操作系统的一部分,在存储器中的起始地址是任意的。LC-3被设计为总共可以识别256个服务程序。附录A中的表

王银兵61332111-编写存储过程函数处理数据一(1)

实验十:存储过程、函数和程序包 实验目的: 1.能够正确编写存储过程 2.能够正确定义和使用存储过程参数 3.能够正确调用存储过程 实验要求: 1.按以下步骤完成如下操作,并对出现的现象进行解释 2.将命令和操作过程记录到实验过程记录中 实验步骤和方法: 1.启动本地Oracle服务器 2.以scott用户普通身份连接到PL/SQL developer 3.按要求编写PL/SQL存储过程,并用两种方式调用各个存储过程(在查询中尽量思 考,找到不一样的解题方案) 1)编写给每个员工发放额外补贴500的存储过程。(提示:COMM字段值增加500) 2)创建新增部门的存储过程INSERT_DEPT,部门号、部门名称和部门所在位置 作为参数。(关于参数存储过程的用法:in参数的使用)

1)创建一个通过部门编号返回部门名称的存储函数GET_DEPT_NAME。 2)创建比较两个数大小的函数,返回较大值。

5.按要求编写包: 1)创建管理部门信息的包pacdept,具有从dept表获得指定部门信息,修改部门 名称,添加部门信息的功能(注:各模块应包含异常处理模块)。(可以参考下 一页的案例1)

思考:1、在实验中是否懂得了存储过程以及带参数的存储过程的用法?

【案例1】创建管理雇员信息的包EMPLOYE,具有从EMP表获得雇员信息,修改雇员名称,修改雇员工资和写回EMP表的功能。 步骤1:登录SCOTT账户,输入以下代码,并编译: CREATE OR REPLACE PACKAGE EMPLOYE --包头部分 IS PROCEDURE SHOW_DETAIL; PROCEDURE GET_EMPLOYE(P_EMPNO NUMBER); PROCEDURE SAVE_EMPLOYE; PROCEDURE CHANGE_NAME(P_NEWNAME VARCHAR2); PROCEDURE CHANGE_SAL(P_NEWSAL NUMBER); END EMPLOYE; / CREATE OR REPLACE PACKAGE BODY EMPLOYE --包体部分 IS EMPLOYE EMP%ROWTYPE; -------- 显示雇员信息 -------- PROCEDURE SHOW_DETAIL AS BEGIN DBMS_OUTPUT.PUT_LINE('----- 雇员信息 -----'); DBMS_OUTPUT.PUT_LINE('雇员编号:'||EMPLOYE.EMPNO); DBMS_OUTPUT.PUT_LINE('雇员名称:'||EMPLOYE.ENAME); DBMS_OUTPUT.PUT_LINE('雇员职务:'||EMPLOYE.JOB); DBMS_OUTPUT.PUT_LINE('雇员工资:'||EMPLOYE.SAL); DBMS_OUTPUT.PUT_LINE('部门编号:'||EMPLOYE.DEPTNO); END SHOW_DETAIL; -------- 从EMP表取得一个雇员 --------- PROCEDURE GET_EMPLOYE(P_EMPNO NUMBER) AS BEGIN SELECT * INTO EMPLOYE FROM EMP WHERE EMPNO=P_EMPNO; DBMS_OUTPUT.PUT_LINE('获取雇员'||EMPLOYE.ENAME||'信息成功'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('获取雇员信息发生错误!'); END GET_EMPLOYE; --------- 保存雇员到EMP表 --------- PROCEDURE SAVE_EMPLOYE AS BEGIN UPDATE EMP SET ENAME=EMPLOYE.ENAME,SAL=EMPLOYE.SAL WHERE EMPNO=EMPLOYE.EMPNO; DBMS_OUTPUT.PUT_LINE('雇员信息保存完成!');

oracle包以及简单操作样例

一、包的概念 PL/SQL为了满足程序模块化的需要,除了块(block)和子程序结构外,还引入了包的构造。 (1)包是一种数据库对象,将逻辑上相关的PL/SQL类型、对象和子程序组合成一个更大的单位,是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。 (2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 (3)与类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即它们的作用域不同。公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL 程序访问,而私有元素只能被包内的函数和过程序所访问。 (4)PL/SQL的包具有信息隐蔽性(information hiding),仅在算法和数据结构设计有关层可见。可将过程说明和过程体组成一个程序单位。也可将过程说明与它的过程体分开,在这种情况下,将过程放置在一个包中,可隐蔽实现的细节。也可在包中定义过程,而该过程在包说明中没有定义过程说明,这样定义的过程仅在包内使用。

(5)在PL/SQL程序设计中,使用包不仅可以使程序设计模块化,对外隐藏包内所使用的信息(通过使用私用变量),而写可以提高程序的执行效率。因为,当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高。如果ORACLE具有Procedure选件,包可以编译、存贮在ORACLE数据库中,其内容可为许多应用共享。 二、包的作用 包可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放于包中,相当于一个容器。将声明语句放入包中的好处是:用户可以从其他PL/SQL块中对其进行引用,因此包为PL/SQL提供了全程变量。 三、包定义: (1)一个包由两个分开的部分组成: (2)包定义(PACKAGE):包定义部分是为应用程序的接口,声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。

第十章子程序与程序包

子程序与程序包
1. 子程序概述
? 什么是子程序? 一个命名的 PL/SQL 块,编译并存储在数据库中。 ? 为什么要使用子程序? 在第八,九章,我们学习了 PL/SQL 块和游标,可以在一个代码块中解 决复杂的业务逻辑,但是我们也发现,我们的代码块是临时的,只能使 用一次,如果这个业务我们需要再次使用,我们需要重新编写。基于此, 我们将要重用的业务块进行命名,存储在数据库中,这就是子程序。 ? 子程序的构成? 子程序的结构和普通的 PL/SQL 块是一致的,也包括如下部分: 声明部分 可执行部分 异常处理部分(可选) ? 子程序的分类? 存储过程 函数 ? 子程序的优点? 模块化【将程序分解为逻辑模块】 可重用性【可以被任意数目的程序调用】 可维护性【简化维护操作】 安全性【通过设置权限,使数据更安全】
2. 存储过程
过程是用于完成特定任务的子程序, 通过使用过程不仅可以简化客户端应用 程序的开发和维护,而且还可以提高应用程序的运行性能。 1) 创建存储过程的语法如下: CREATE [OR REPLACE] PROCEDURE [()]--创建过程, 可指定运行过程需传递 的参数 IS|AS --可以声明变量 BEGIN --包括在过程中要执行的语句 [EXCEPTION ] --处理异常 END; [注]过程体内不能使用查询语句,只能用于赋值(SQL 语句块都如此) 如果过程体语句有错误也能创建成功 没有参数就不写,不用()

第5章 PLSQL开发子程序和包

第5章开发子程序和包 5.1子程序简介 子程序是指被命名的PL/SQL块,这种块可以带有参数,可以在不同应用中多次调用。PL/SQL有两种类型的子程序:过程和函数。其中,过程用于执行特定操作,而函数则用于返回特定数据。通过将商业逻辑和企业规则集成到PL/SQL子程序中,可以简化客户端应用的开发和维护,提高应用的性能。 5.2过程 5.2.1创建过程 过程一般用于执行一个指定的操作,可以将常用的特定操作封装成过程。 语法: 上述语法中,procedure_name用于指定过程名称,argument1、argument2等则用于指定过程的参数,IS或AS用于开始一个PL/SQL块。当指定参数数据类型时,不能指定其长度。另外,创建过程时,既可以指定输入参数(IN),又可以指定输出参数(OUT)及输入输出参数(IN OUT)。通过在过程中使用输入参数,可以将应用环境的数据传递到执行部分。通过使用输出参数,可以将执行部分的数据传递到应用环境。定义子程序参数时,如果不指定参数模式,则默认输入参数;如果需要定义输出参数,则必须指定OUT关键字;如果需要定义输入输出参数,则必须指定IN OUT关键字。以下通过示例说明创建过程和使用各种参数模式的方法。接下来我们看一下过程的创建。

1.创建无参过程 以下通过删除表中重复记录为例,说明创建该种过程的方法。 假设表tb_test中的数据如图4.1.1 创建一个无参函数,完成删除此表中重复记录的操作,如图5.1.2所示 图5.1.2 创建无参过程 过程pro_update_rec创建之后可以进行调用,在sql plus环境中可以使用call或者exec 两个命令。如果不使用exec或者call命令的话,我们也可以使用pl/sql块的方式来调用。 无参过程的调用如图5.1.2所示。

ORACLE程序包的创建与应用

ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) 本篇主要内容如下: 第七章程序包的创建和应用 7.1 程序包简介 7.2 程序包的定义 7.3 包的开发步骤 7.4 包定义的说明 7.5 子程序重载 7.6 加密实用程序 7.7 删除包 7.8 包的管理 7.1 程序包简介 程序包(PACKAGE,简称包)是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,作为一个完整的单元存储在数据库中,用名称来标识包。它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。包类似于c#和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 与高级语言中的类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即它们的作用域不同。公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL程序访问,而私有元素只能被包内的函数和过程序所访问。 当然,对于不包含在程序包中的过程、函数是独立存在的。一般是先编写独立的过程与函数,待其较为完善或经过充分验证无误后,再按逻辑相关性组织为程序包。 程序包的优点 简化应用程序设计:程序包的说明部分和包体部分可以分别创建各编译。主要体现在 以下三个方面: 1)可以在设计一个应用程序时,只创建各编译程序包的说明部分,然后再编写引用该程序 包的PL/SQL块。 2)当完成整个应用程序的整体框架后,再回头来定义包体部分。只要不改变包的说明部分, 就可以单独调试、增加或替换包体的内容,这不会影响其他的应用程序。 3)更新包的说明后必须重新编译引用包的应用程序,但更新包体,则不需重新编译引用包 的应用程序,以快速进行应用程序的原形开发。

子程序包TLM说明

******************************************************************************* 子程序LOVE1 ******************************************************************************* *计算平面外(LOVE波型)问题的特征值和特征向量(1次形函数) SUBROUTINE LOVE1(OMEGA0,NL,H,Vs,RHO,HG,BJ,N,KBETA,Y,DBETA0) *OMEGA0:圆频率 *NL:薄层数 *H:层厚H(I) *Vs:剪切波速Vs(I) *RHO:质量密度RHO(I) *HG:阻尼比HG(I) *BJ:模型底部边界条件:刚性边界:BJ=0;阻尼器边界:BJ=1;旁轴边界:BJ=2 *N:=NL *KBETA:特征值KBETA(N) *Y:特征向量Y(N,N) *DBETA0:Dβ(N)=Y T AsY[式(8-129)] USE IMSL NONE IMPLICIT NL,BJ,N INTEGER REAL*8 OMEGA0 H(NL),Vs(NL),RHO(NL),HG(NL) REAL*8 KBETA(N),Y(N,N),DBETA0(N) COMPLEX*16 AsE(2,2),GsE(2,2),ME(2,2) COMPLEX*16 *单元矩阵As 、Gs、M、Es[式(8-19)] G(NL) COMPLEX*16 COMPLEX*16 AsG(N,N),GsG(N,N),MG(N,N),EsG(N,N) *集总矩阵As 、Gs、M、Es[式(8-20)] ALPHA0(N),BETA0(N),EV AL0(N) COMPLEX*16 REAL*8 G0 I,II,J,I1,I2 INTEGER DO 10 I=1,NL G0=RHO(I)*Vs(I)*Vs(I) G(I)=G0*DCMPLX(1.0D0,2.0D0*HG(I)) 10 CONTINUE *计算单元矩阵并组装总矩阵 GsG=DCMPLX(0.0D0,0.0D0); MG=DCMPLX(0.0D0,0.0D0) EsG=DCMPLX(0.0D0,0.0D0) AsG=DCMPLX(0.0D0,0.0D0); DO 20 J=1,NL-1 GsE=DCMPLX(0.0D0,0.0D0) GsE(1,1)=G(J)/H(J) GsE(1,2)=(-1.0D0)*GsE(1,1) GsE(2,1)=GsE(1,2) GsE(2,2)=GsE(1,1) GsG(J:J+1,J:J+1)=GsG(J:J+1,J:J+1)+GsE

相关主题
文本预览
相关文档 最新文档