当前位置:文档之家› 过程_函数和程序包

过程_函数和程序包

过程_函数和程序包
过程_函数和程序包

过程、函数和和序包

姓名:学号:专业:班级:同组人:实验日期:

【实验目的与要求】

?掌握过程的创建与调用

?掌握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);

print

给出运行结果:

(3)定义一个返回多个值的存储过程。

create or replace procedure p_test(name out varchar2,age out number,sex out varchar2,sal out number)

is

begin

name:='scott';

age:=26;

sex:='男';

sal:=8000;

end;

declare

v_name varchar2(20);

v_age number(10);

v_sex varchar2(5);

v_sal number(10);

begin

p_test(v_name,v_age,v_sex,v_sal);

dbms_output.put_line(v_name);

dbms_output.put_line(v_age);

dbms_output.put_line(v_sex);

dbms_output.put_line(v_sal);

end;

给出运行结果:

3.练习:根据测试表完成下列程序的编写,并给出测试结果:

(1)已知有如下表和相应的数据,请根据要求完成实验。

create table departments(

DEPARTMENT_ID NUMBER(4) primary key,

DEPARTMENT_NAME V ARCHAR2(30),

MANAGER_ID NUMBER(6),

LOCATION_ID NUMBER(4)

);

insert into departments values(1,'技术部',1,1);

insert into departments values(2,'人事部',2,2);

insert into departments values(3,'市场部',3,3);

insert into departments values(4,'财务部',4,4);

根据上表结构编写存储过程,实现以下功能,并给出测试结果。

1)根据指定的部门更新指定部门名(DEPARTMENT_NAME)的管理者(MANAGER_ID)id。

CREATE OR REPLACE PROCEDURE

DEP_PRO(V_DEP_NAME IN VARCHAR2,V_DEP_ID IN NUMBER)

IS

BEGIN

UPDATE DEPARTMENTS

SET MANAGER_ID =V_DEP_ID

WHERE DEPARTMENT_NAME =V_DEP_NAME;

END;

DECLARE

BEGIN

DEP_PRO('技术部',5);

END;

更新前:

更新后:

2)根据部门ID(DEPARTMENT_ID)删除指定部门

CREATE OR REPLACE PROCEDURE

DEP_DEL_PRO(V_DEP_NAME IN VARCHAR2)

IS

BEGIN

DELETE DEPARTMENTS

WHERE DEPARTMENT_NAME=V_DEP_NAME;

END;

--

DECLARE

BEGIN

DEP_DEL_PRO('技术部');

END;

(2)编写给雇员增加工资的存储过程CHANGE_SALARY,通过IN类型的参数传递要增加工资的雇员编号和增加的工资额。(操作数据库表为EMP).

1)编写存储过程CHANGE_SALARY,给出程序代码:

CREATE OR REPLACE PROCEDURE

CHANGE_SALARY(P_EMPNO IN NUMBER DEFAULT 7788,

P_RAISE NUMBER DEFAULT 10)

IS

V_ENAME VARCHAR2(10);

V_SAL NUMBER(5);

BEGIN

SELECT ENAME,SAL INTO V_ENAME,V_SAL FROM EMP WHE

RE EMPNO=P_EMPNO;

UPDATE EMP SET SAL=SAL+P_RAISE WHERE EMPNO=P_EM

PNO;

DBMS_OUTPUT.PUT_LINE('雇员'||V_ENAME||'的工资被改为

'||TO_CHAR(V_SAL+P_RAISE));

COMMIT;

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('发生错误,修改失败!');

ROLLBACK;

END;

2)调用存储过程:EXECUTE CHANGE_SALARY(7788,80)

9.2.函数

1.最简单的函数:

--简单函数

(1)创建函数

create function f(name in varchar2)return varchar2

is

begin

return name;

end;

(2)调用函数

declare

v_name varchar2(10);

begin

v_name:=f('scott');

dbms_output.put_line(v_name);

end;

给出运行结果:

2.稍微复杂的函数

--编写函数

create or replace function salarylevel(salary number) return varchar2

is

begin

if salary < 1000 then

return '工资太低了,要加油了';

elsif salary <3000 then

return '还可以,但是也要努力啊';

elsif salary <5000 then

return '这个还可以';

else

'你的工资现在来说,是比较高了';

end if;

end;

--调用函数

declare

v_salarylevel varchar2(50);

begin

v_salarylevel := salarylevel(1000);

dbms_output.put_line(v_salarylevel);

end;

给出运行结果:

3.函数练习:

(1). 定义一个函数接收三个参数,算出最大值。而后调用该函数,给出测试结果。

给出求三个数最大值函数Max(num1,num2,num3)程序源码:

SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE MYPROCEDURE(V_NUM1FLOAT,V_NUM2 FLOAT,V_NUM3 FLOAT)

IS

BEGIN

IF(V_NUM1>V_NUM2) THEN

IF (V_NUM3>V_NUM1) THEN

DBMS_OUTPUT.PUT_LINE(V_NUM3);

ELSE

DBMS_OUTPUT.PUT_LINE(V_NUM1);

END IF;

ELSE

IF (V_NUM2>V_NUM3) THEN

DBMS_OUTPUT.PUT_LINE(V_NUM2);

ELSE

DBMS_OUTPUT.PUT_LINE(V_NUM3);

END IF;

END IF;

END;

--调用测试:

DECLARE

V1 FLOAT:=10.2;

V2 FLOAT:=34.4;

V3 FLOAT:=34.6;

BEGIN

MYPROCEDURE(V1,V2,V3);

END;

给出运行结果:

(2).根据房屋的相关数据(长,宽),编写函数find_area,根据公式求出其建筑面积和使用面积,并写入到数据库表中,完成后,使用Select 语句查询表中数据,以确认程序编写的正确性。

create or replace function

find_area(v_l in float,v_w in float) return float

is

v_area float;

begin

v_area:=v_l*v_w;

return v_area;

end;

--调用函数find_area

Declare

v_area float;

begin

v_area := find_area(5,4);

dbms_output.put_line(v_area);

end;

1)创建表:建立房屋表House(房屋名称,长,宽,建筑面积,使用面积);

给出相应代码:

create table room(

roomname varchar2(20),

room_l float,

room_w float,

room_b float,

room_u float

);

2)插入三行记录测试,插入值时忽略建筑面积和使用面积

'1号机房',20,5.5

'2号机房',25,5.5

'卧室',200,5.5

给出相应代码:

insert into room (roomname,room_l,room_w,room_u)values('1号机房',20,5.5,find_area(20,5.5));

insert into room (roomname,room_l,room_w,room_u)values('1号机房',25,5.5,find_area(25,5.5));

insert into room (roomname,room_l,room_w,room_u)values('卧室',200,5.5,find_area(200,5.5));

3)利用find_area函数,更新建筑面积和使用面积字段

--建筑面积=长* 宽+ 2.5

--使用面积=长* 宽

给出相应代码:

update room

set room_b=find_area

(room_l,room_w)+2.5,room_U=find_area(room_l,room_w);

4)在select查询表中数据。

给出运行结果:

修改前:

修改后:

9.3.包的声明和使用

阅读以下程序,理解包的声明和使用。

-----------包的声明和使用1-------------------------

DROP TABLE Exam_Emps;

CREATE TABLE Exam_Emps(

id number(5) primary key,

name varchar2(30),

commission_pct number(3,2 )

);

insert into Exam_Emps values (1,'张一',0.13);

insert into Exam_Emps values (2,'张二',0.23);

insert into Exam_Emps values (3,'张三',0.33);

insert into Exam_Emps values (4,'张四',0.43);

commit;

select * from Exam_Emps;

--创建包头

CREATE OR REPLACE PACKAGE comm_package

IS

g_comm NUMBER := 0.10;

PROCEDURE reset_comm (p_comm IN NUMBER);

END comm_package;

/

--创建包体

CREATE OR REPLACE PACKAGE BODY comm_package

IS

-------------在包体中定义的局部函数--------------

/*

如果输入的参数p_comm大于Exam_Emps表中最大的commission_pct 字段,则函数返回FALSE,否则函数返回TRUE

*/

FUNCTION validate_comm (p_comm IN NUMBER)

RETURN BOOLEAN

IS

v_max_comm NUMBER;

BEGIN

SELECT MAX(commission_pct)

INTO v_max_comm

FROM Exam_Emps;

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;

ELSE

RAISE_APPLICATION_ERROR(-20210, '不合理的表达式');

END IF;

END reset_comm;

----------完成在包体中声明的过程:结束------------

END comm_package;

--测试包

EXECUTE comm_package.reset_comm(1);

EXECUTE comm_package.reset_comm(.33);

给出运行结果:

begin

comm_package.reset_comm(0.15);

dbms_output.put_line('g_comm = ' || comm_package.g_comm ); end;

/

给出运行结果:

-----------包的声明和使用2-------------------------

drop table Exam_Emp;

create table Exam_Emp(

id number (5),

name varchar2(30),

salary number(8,2)

);

insert into Exam_Emp values(1,'张一',3000);

insert into Exam_Emp values(2,'张二',3400);

insert into Exam_Emp values(3,'张三',5600);

commit;

create or replace package tax_pkg as

function tax(v_value in number) return number;

end tax_pkg;

/

create or replace package body tax_pkg

as

-------------包体中的函数执行部分---------------

function tax(v_value in number) return number

is

begin

if v_value < 1000 then

return (v_value * 0);

elsif v_value < 5000 then

return (v_value * 0.10);

elsif v_value <10000 then

return (v_value * 0.15);

else

return (v_value * 0.20);

end if;

end tax;

-------------包体中的函数:结束-----------------

end tax_pkg;

/

-- 测试包中定义的函数

select salary,tax_pkg.tax(salary) from Exam_Emp;

给出运行结果:

9.4 作业与思考练习题

编写一个函数以检查所指定雇员的薪水是否有效范围内。不同职位的薪水范围为:

Designation Raise

Clerk 1500-2500

Salesman 2501-3500

Analyst 3501-4500

Others 4501 and above.

如果薪水在此范围内,则显示消息"Salary is OK",否则,更新薪水为该范围内的最低值。

请给出程序源码:

CREATE OR REPLACE FUNCTION Sal_Level(no emp.empno%TYPE) RETURN CHAR AS

vjob emp.job%TYPE;

vsal emp.sal%TYPE;

vmesg CHAR(50);

BEGIN

SELECT job,sal INTO vjob,vsal FROM emp WHERE empno=no;

IF vjob='CLERK' THEN

IF vsal>=1500 AND vsal<=2500 THEN

vmesg:='Salary is OK.';

ELSE

vsal:=1500;

vmesg:='Have updated your salary to '||TO_CHAR(vsal);

END IF;

ELSIF vjob='SALESMAN' THEN

IF vsal>=2501 AND vsal<=3500 THEN

vmesg:='Salary is OK.';

ELSE

vsal:=2501;

vmesg:='Have updated your salary to '||TO_CHAR(vsal);

END IF;

ELSIF vjob='ANALYST' THEN

IF vsal>=3501 AND vsal<=4500 THEN

vmesg:='Salary is OK.';

ELSE

vsal:=3501;

vmesg:='Have updated your salary to '||TO_CHAR(vsal); END IF;

ELSE

IF vsal>=4501 THEN

vmesg:='Salary is OK.';

ELSE

vsal:=4501;

vmesg:='Have updated your salary to '||TO_CHAR(vsal); END IF;

END IF;

UPDATE emp SET sal=vsal WHERE empno=no;

RETURN vmesg;

END;

/

DECLARE

vmesg CHAR(50);

vempno emp.empno%TYPE;

BEGIN

vempno:=&empno;

vmesg:=Sal_Level(vempno);

DBMS_OUTPUT.PUT_LINE(vmesg);

END;

/

请给出程序运行结果:

实验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你好 给出运行结果:

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

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

C语言函数说明与返回值

C语言函数说明与返回值 在学习C语言函数以前,我们需要了解什么是模块化程序设计方法。 人们在求解一个复杂问题时,通常采用的是逐步分解、分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分为若干功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块像搭积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。 在C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现C语言程序。 利用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性,而且还可以把程序中普通用到的一些计算或操作编成通用的函数,以供随时调用,这样可以大大地减轻程序员的代码工作量。 函数是C语言的基本构件,是所有程序活动的舞台。函数的一般形式是: type-specifier function_name(parameter list) parameter declarations { body of the function } 类型说明符定义了函数中return语句返回值的类型,该返回值可以是任何有效类型。如果没有类型说明符出现,函数返回一个整型值。参数表是一个用逗号分隔的变量表,当函数被调用时这些变量接收调用参数的值。一个函数可以没有参数,这时函数表是空的。但即使没有参数,括号仍然是必须要有的。参数说明段定义了其中参数的类型。

当一个函数没有明确说明类型时, C语言的编译程序自动将整型( i n t)作为这个函数的缺省类型,缺省类型适用于很大一部分函数。当有必要返回其它类型数据时,需要分两步处理: 首先,必须给函数以明确的类型说明符;其次,函数类型的说明必须处于对它的首次调用之前。只有这样,C编译程序才能为返回非整型的值的函数生成正确代码。 4.1.1 函数的类型说明 可将函数说明为返回任何一种合法的C语言数据类型。 类型说明符告诉编译程序它返回什么类型的数据。这个信息对于程序能否正确运行关系极大,因为不同的数据有不同的长度和内部表示。 返回非整型数据的函数被使用之前,必须把它的类型向程序的其余部分说明。若不这样做,C语言的编译程序就认为函数是返回整型数据的函数,调用点又在函数类型说明之前,编译程序就会对调用生成错误代码。为了防止上述问题的出现,必须使用一个特别的说明语句,通知编译程序这个函数返回什么值。下例示出了这种方法。 第一个函数的类型说明sum()函数返回浮点类型的数据。这个说明使编译程序能够对sum( ) 的调用产生正确代码。 函数类型说明语句的一般形式是: type_specifier function_name (; ) 即使函数使用形参,也不要将其写入说明句。若未使用类型说明语句,函数返回的数据类型可能与调用者所要求的不一致,其结果是难以预料的。如果两者同处于一个文件中,编译程序可以发现该错误并停止编译。如果不在同一个文件中,编译程序无法发现这种错误。类型检查仅在编译中进行,链接和运行时均不检查。因此,必须十分细心以确保绝不发生上

过程_函数和程序包

过程、函数和和序包 姓名:学号:专业:班级:同组人:实验日期: 【实验目的与要求】 ?掌握过程的创建与调用 ?掌握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);

第6讲函数与程序结构

第六讲函数和程序结构 6.1 概述 一、问题提出 前面的程序中,都用到了主函数“main”及C语言提供的输入输出库函数scanf和printf等函数,目前除了调用库函数实现某些功能外,所有的练习中程序功能均在主函数中完成,当问题有一定规模和复杂度时不可避免地会出现如下问题: ①程序越来越长,难于理解且可读性下降。 ②重复代码增多,某段程序可能被执行多次。 ③某一问题中的代码,无法在其他同类问题中再用,必须重复原来设计 编码的过程。 ④程序各部分之间联系复杂、保特重用代码段的一致性等原因导致程序 调试难度加大。 二、函数机制的引入 由于以上问题,所以需要一种机制,能够有效地分解复杂的描述,控制程序规模和复杂性,C语言中,这种机制就是函数。使用函数,把一段处理过程抽象出来,作为程序中独立的函数实体,这样通过函数之间的调用就可以完成复杂的处理任务了。函数机制的本质是封装一段操作,对其他模块隐藏函数内部的实现过程,只提供调用方法,即接口参数和返回值。被抽象成函数的程序段通常是功能独立、具有独立逻辑意义的程序段和重复出现的代码段。 三、函数机制的提供的好处 ①函数可以被多次调用, 从而减少程序的长度。 ②增加程序的可读性。 ③程序的模块化、结构化更强。 四、函数的定义与调用 C语言中, 函数名是上述封装体的名称。函数定义是按照规定形式对函数的描述。函数调用是要求执行函数的描述。一个实用的C语言源程序总是由许多函数组成, 这些函数多数都是根据实际任务由用户来编写的, 在这些函数中, 可以调用C语言提供的库函数, 也可调用用户自己写的或他人编写的函数。 五、函数的执行 C程序总是从主函数 main 开始执行, 到主函数的最后一个“}”确处结束。在 main 中, 调用库函数或自己定义的函数时, 控制权转移到函数, 主程序等待, 待函数执行完毕后, 控制返回到调用处, 主函数继续执行。其他函数中调用函数的过程与此相同。 六、掌握函数的使用与函数的定义 从C语言函数来讲, 一方面要掌握库函数的调用方法, 尽可能地熟悉系统提供的常用库函数的功能, 尽量使用库函数实现程序功能。另一方面,库函数毕竟不能解决所有的问题, 需要掌握自己定义函数的方法。

实验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、 【问题描述】编写两个函数,函数功能分别是:求两个整数的最大公约数和最小公倍数,要求输入输出均在主函数中完成。 【输入形式】两个数,用空格隔开 【输出形式】两个数,用空格隔开 【样例输入】15 25 【样例输出】5 75 【样例说明】15和25的最大公约数是5,最小公倍数是75 #include using namespace std; int gys(int m, int n) { int i, res; for(i=1; i<=m; i++) if(m%i==0&&n%i==0) res=i; return res; } int gbs(int m, int n) { int i, res; for(i=m*n; i>=m; i--) if(i%m==0&&i%n==0) res=i; return res; } int main( ) { int a,b; cin>>a>>b; cout<

#include using namespace std; #include int fun(int num); int main( ) { int num; cin>>num; cout<0) { n++; t/=10; } return num%(int)pow(10,n-1); } 3、 【问题描述】有一分段函数如下,编写函数进行计算,在主函数中输入x值,输出y值。 【样例输入1】-1.5 【样例输出1】0.00250501 【样例输入2】5.6 【样例输出2】31.8957 【样例输入3】12.5 【样例输出3】4.06202 #include #include using namespace std; double fun(double x) { double y; if(x<=0) y=sin(x)+1; else if(x<10)

程序设计说明书

学号:201201011367 程序名称:便捷记事本 程 序 设 计 说 明 书 学院:计算机电子信息工程学院 班级: 12级信息管理与信息系统 姓名:佐佐

一.前言 Windows操作系统是由微软公司开发的视窗操作系统,是目前世界上用户最多且兼容性最好的操作系统,windows软件自然也是大势所趋,因此我们大家学习windows编程设计能够深化对它的认识,有助于大家更好的学习windows编程。 本次程序设计试验是在我校专业微机三室采用windowsXP操作系统的微机进行试验,编程工具是Microsoft Visual C++ 6.0(完整绿色版)在windowsXP 操作系统上具有很好的兼容性,试验结果准确可靠。 本程序是我半年来学习windows编程在老师的指导下写的一款常用的小程序—记事本。为了考察我们这学期的window程序编程能力和对课程的考察,老师通过考察课的形式检验我们.此次考察课老师让我们编写一款windows小程序并上交程序设计说明书.以下是我的这个程序的设计说明. 二.设计目的 使学生综合使用所学过的windows程序设计知识,掌握windows程序设计的基本结构思路和方法,利用所学的基本知识和技能,发挥自学能力和查找资料的能力,解决稍微复杂的windows程序设计问题,加深对所学知识的理解与掌握,增强学生利用自己所学知识解决实际问题的能力,为以后的程序开发打下基础。而且使同学们能够熟练地利用MSDN查找在程序中遇到的API函数和消息等。熟悉在Visual C++ 6.0 中编辑、编译、调试和运行一个实际窗口式应用程序的步骤和方法。理解并掌握VC++的API编程步骤与方法,能进行简单的Windows 程序设计提高实际动手能力。

王银兵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('雇员信息保存完成!');

程序说明书

程序功能说明书 程序功能说明:这个程序的主要功能是实现学生信息的录入、查询和删除功能,学生信息以文件形式保存(文件名data)。 程序启动后,首先通过load()函数从文件data中读取信息,然后进入一个 死循环(whlie(1)),显示提示界面,使用者根据提示信息选择操作,如果输入的是1,就开始录入信息(input),具体录入步骤见后文input()介绍。如果输入2,进入查询函数(find ()),具体查询步骤见后文find()函数介绍。如果输入3,进入如删除函数(del),具体删除方法见后文del函数介绍。如果输入错误就开始下一次循环。 一、功能截图 主界面 学生信息录入

学生信息查询 学生信息删除 三、本程序使用以下函数:del():实现学生信息删除find()实现学生信息查找input()实现学生信息录入load()读取文件信息save()保存信息 main()主函数 函数应用详细说明: 1、Del()

本函数实现学生信息的删除,函数开始需要输入要删除的学生的姓名,然后进入循环,循环50次,用获得的姓名与已有的姓名进行比较,如果有相同的就将其名字的第一位赋值为‘\0’,这样就代表删除,因为程序判断是否存在一个人的标准是看他名字的长度是否为0的,为0就是不存在。然后保存删除后的信息到文件,并提升删除成功2、find() 本函数实现学生信息的查询功能,函数开始需要输入要查询的学生的姓名,然后进入循环,循环50次,每次都用获得的姓名与已有的姓名进行比较,如果有相同的就显现出相应的信息。并坐上flag标记为1,表示已经找到了该同学的信息。

如果没有找到输入名字的信息(flag等于0),flag为0,就提示没有这个人,并要求重新输入。 如果找到了输入名字的信息,就显示信息已查到,并询问是否需要继续查找,然后根据用户的选择执行继续查找或停止查找。 3、input() 本函数实现学生信息的录入功能。函数开始需要进入一个循环(最多循环50次)找一个没有存储学生信息的位置,而前面说了,判断一个位置是否有储存信息的标准是这个位置的学生的名字长度是否为0,如果为0就表示没有存信息。这里就是这样判定的。 找到空位后就结束循环(break),并要求输入要录入的各种信息(姓名、学号等),然后提示信息录入完成,然后要求选择是否继续录入下一位同学信息,然后根据用户的选择进行操作,若选择继续录入就继续循环,否则跳出循环,录入结束。

包和子程序(考试复习)

第七章包和子程序 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;

信息学第九课过程与函数

第九课过程与函数 前面我们曾经学习了程序设计中的三种基本控制结构(顺序、分支、循环)。用它们可以组成任何程序。但在应用中,还经常用到子程序结构。 通常,在程序设计中,我们会发现一些程序段在程序的不同地方反复出现,此时可以将这些程序段作为相对独立的整体,用一个标识符给它起一个名字,凡是程序中出现该程序段的地方,只要简单地写上其标识符即可。这样的程序段,我们称之为子程序。 子程序的使用不仅缩短了程序,节省了内存空间及减少了程序的编译时间,而且有利于结构化程序设计。因为一个复杂的问题总可将其分解成若干个子问题来解决,如果子问题依然很复杂,还可以将它继续分解,直到每个子问题都是一个具有独立任务的模块。这样编制的程序结构清晰,逻辑关系明确,无论是编写、阅读、调试还是修改,都会带来极大的好处。 在一个程序中可以只有主程序而没有子程序(本章以前都是如此),但不能没有主程序,也就是说不能单独执行子程序。pascal中子程序有两种形式:函数和过程。 一、函数 在此之前,我们曾经介绍并使用了pascal提供的各种标准函数,如ABS,SUCC等等,这些函数为我们编写程序提供了很大的方便。但这些函数只是常用的基本函数,编程时经常需要自定义一些函数。 (一)函数的说明 在pascal中,函数也遵循先说明后使用的规则,在程序中,函数的说明放在调用该函数的程序(主程序或其它子程序)的说明部分。函数的结构主程序的结构很相似。 函数定义的一般格式: function <函数名> (<形式参数表>):<类型>; {函数首部}

说明: ①函数由首部与函数体两部分组成。 ②函数首部以关键字function开头。 ③函数名是用户自定义的标识符。 ④函数的类型也就是函数值的类型,所求得的函数值通过函数名传回调用它的程序。可见,函数的作用一般是为了求得一个值。 ⑤形式参数简称形参,形参即函数的自变量。自变量的初值来源于函数调用。在函数中,形参一般格式如下: 变量名表1:类型标识符1;变量名表2:类型标识符2;…;变量名表n:类型标识符n 可见形参表相当于变量说明,对函数自变量进行说明,但应特别注意:此处只能使用类型标识符,而不能直接使用类型。 ⑥当缺省形参表(当然要同时省去一对括号)时,称为无参函数。 ⑦函数体与程序体基本相似,由说明部分和执行部分组成。 ⑧函数体中的说明部分用来对本函数使用的标号、常量、类型、变量、子程序加以说明,这些量只在本函数内有效。 ⑨函数体的执行部分由begin开头,end结束,中间有若干用分号隔开的语句,只是end 后应跟分号,不能像程序那样用句号"."。 ⑩在函数体的执行部分,至少应该给函数名赋一次值,以使在函数执行结束后把函数值带回调用程序。

程序是对解决某个问题的方法步骤的描述

1.程序是对解决某个问题的方法步骤的描述;从计算机角度来说,程序是用某种计算机能理解并执行的计算机语言描述解决问题的方法步骤。 2.程序设计就是分析解决问题的方法步骤,并将其记录下来的过程。 3.汇编语言:用这种语言编写的程序需要通过一种软件翻译后才能执行,所以又称汇编语言。称为“面向机器的语言”。 4.高级语言称为“面向过程的语言”。 5.高级语言编写的程序称为“源程序”,必须翻译成二进制程序后才能执行。翻译过程有两种方式:一种是翻译一句执行一句,称为“解释执行”方式,完成翻译工作的程序就称为“解释程序”;另一种是全部翻译成二进制程序后再执行,承担翻译工作的程序就称为“编译程序”,编译后的二进制程序称为“目标程序”。 6.C语言的主要特点:(1)比其它高级语言更接近硬件,比低级语言更容易描述算法,程序易编、易读、易查错、易修改。可以说兼有高级语言和低级语言的优点。 (2)数据类型和运算符十分丰富,程序设计和算法描述更为简单和方便。 (3)语法结构简单,语句数目少,简单易学。 (4)它是一种结构化程序设计语言,提供了完整的程序控制语句,很适合结构化的程序设计方法。 (5)它是一种模块化程序设计语言,适合大型软件的研制和调试。(6)它提供了大量的库函数供调用,简化了 程序设计工作。 7.算法是计算机程序 中解决问题的方法步 骤。 8.流程图:用标准的图 形元素来描述算法步 骤。 9.C语言的字符集就是 ASCII字符集,主要包 括以下几类:(1)大小 写英文字母A~Z、a~z (2)数字0、1、 (9) (3)非字母数字的可 显示字符 (4)转义字符 10.C语言的词类:常 量、变量、运算符、函 数调用、表达式、保留 字。 11.C语言的语句:数据 定义语句、赋值语句、 函数调用语句、表达式 语句、流程控制语句、 复合语句、空语句、其 它语句。 12.一个C程序包括一 个或多个函数,其中有 且仅有一个称为主函 数,其函数名规定为 main。 13.每个函数的定义分 为函数头和函数体。 14.C程序中的每个语 句以“分号”作为语句 的结束。 15.用“/*”和“*/” 括住的任意字符序列, 称为“注释”。 16.C程序的执行总是 从主函数开始,并在主 函数中结束。 17.标识符是由字母或 下划线开头的字母、数 字、下划线组成的字符 序列,长度不得大于32 个字符。字母是区分大 小写的。 18.转义字符:由“反 斜杠字符\”开始后跟 单个字符或若干个字 符组成。 19.保留字:在C语言 中有特殊含义的单词 称为“保留字”,也称 “关键字”,主要用于 构成语句,所有的保留 字均由小写字母组成。 20.在整数的末尾加上 小写字母“l”或大写 字母“L”的是长整型 常量。 21.实型常量只使用十 进制,有两种书写形 式:(1)由整数部分、 小数点、小数部分组 成。其中小数部分或整 数部分可以省略其中 的一个;(2)由尾数部 分、小写字母e或大写 字母E、指数部分组成, 形式如“尾数E指数” 22.字符常量用两个单 引号(‘)前后括住的 单个字符来表示。字母 区分大小写。 23.字符串就是用两个 双引号(“)前后括住 的一串字符。字母区分 大小写。 24.符号常量的定义: #define 符号常量常 量 25.宏定义命令的格式: #define 宏名一串符 号 26.宏替换:把所有的 “宏名”替换成对应的 “一串符号”。 27.变量是指在程序运 行过程中其值可以发 生变化的量,通常是用 来保存程序运行过程 中的输入数据、计算获 得的中间结果和最终 结果。 28.地址:“&变量名” 29.定义变量的语句格 式:数据类型符变量 名1,变量名2; 30.对变量进行定义时, 要注意以下几点: (1)对变量的定义可 以放在函数之外,也可 以放在函数体中或复 合语句中,如果放在函 数体或复合语句中,则 必须集中放在最前面。 (2)被定义为整形的 变量,若其值在 -128~127之间,可以当 做字符型变量使用。 (3)被定义为无符号 整型的变量若其值在 0~255之间,也可以当 做字符型变量使用。 (4)被定义为字符型 的变量,可以当做整型 变量使用,其值将在 -128~127之间;也可以 当做无符号整型变量 使用,其值将在0~255 之间。(5)当定义了某 个变量后,会自动给它 分配连续的内存单元。 内存单元的数目是这 个变量对应的数据类 型占用的字节数。 31.变量赋初值格式:数 据类型符变量名1=初 值1,变量名2=初值2; 32.有名常量的定义: const 数据类型符变 量名1=初值1,变量名 2=初值2; 33.有名常量的值是通 过赋初值的方式获得, 不能用赋值方式获得 值。获得初值后,程序 中将不能改变其值。 34.运算符:用来表示各 种运算的符号称为运 算符。 35.表达式的一般构成 规则:(1)单个的常量、 变量、函数调用都是表 达式;(2)“单目前缀 运算符表达式”是表达 式;(3)“表达式单目 后缀运算符”是表达 式;(4)“表达式双目 运算符表达式”是表达 式;(5)“表达式?表 达式:表达式”是表达 式;(6)有限次使用上 述规则获得的运算符 也是表达式。 36.C语言的表达式:算 数表达式、关系表达 式、逻辑表达式、赋值 表达式、逗号表达式、 条件表达式。 37.结构化程序的三种 基本结构:顺序结构, 选择结构(单分支选择 结构,双分支选择结 构,多分支选择结构), 循环结构(当型循环结 构,直到型循环结构, 次数型循环结构)。 38.指针就是存放数据 的内存单元地址。 39.指针变量也是变 量,但只能存放地址类

创建过程、函数和包

创建过程、函数和包 目标: 创建和使用子程序 创建和使用程序包 过程:procedure 过程的参数类型有in、out、in out 类型的!! 函数:function 函数的参数类型只有in类型,不能有out、in out 类型的!! 包:package set serveroutput on Rem =================================================================== Rem 1、创建简单的存储过程,如何执行存储过程 Rem =================================================================== CREATE or replace procedure my_proc AS(用is也行) BEGIN DBMS_OUTPUT.PUT_LINE('这是一个简单的存储过程的例子!'); end my_proc;等价于end; / --下面是在PL/SQL中执行存储过程 begin my_proc;

end; / --下面是在SQLPLUS中执行存储过程 execute my_proc;等价于 exec my_proc; Rem =================================================================== Rem 2、创建带参数的存储过程 Rem =================================================================== create table t( n_var number ); CREATE OR REPLACE PROCEDURE insert_into_t(p_parm in number) AS BEGIN DBMS_OUTPUT.PUT_LINE('---------start----------------------'); insert into t values(p_parm); end insert_into_t; / --下面是在SQLPLUS中执行存储过程 execute insert_into_t(p_parm => 100);

C语言函数说明与返回值

在学习C语言函数以前,我们需要了解什么是模块化程序设计方法。 人们在求解一个复杂问题时,通常采用的是逐步分解、分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分为若干功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块像搭积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。 在C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现C 语言程序。 利用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性,而且还可以把程序中普通用到的一些计算或操作编成通用的函数,以供随时调用,这样可以大大地减轻程序员的代码工作量。 函数是C语言的基本构件,是所有程序活动的舞台。函数的一般形式是: type-specifier function_name(parameter list) parameter declarations { body of the function } 类型说明符定义了函数中return语句返回值的类型,该返回值可以是任何有效类型。如果没有类型说明符出现,函数返回一个整型值。参数表是一个用逗号分隔的变量表,当函数被调用时这些变量接收调用参数的值。一个函数可以没有参数,这时函数表是空的。但即使没有参数,括号仍然是必须要有的。参数说明段定义了其中参数的类型。 当一个函数没有明确说明类型时, C语言的编译程序自动将整型( i n t)作为这个函数的缺省类型,缺省类型适用于很大一部分函数。当有必要返回其它类型数据时,需要分两步处理: 首先,必须给函数以明确的类型说明符;其次,函数类型的说明必须处于对它的首次调用之前。只有这样,C编译程序才能为返回非整型的值的函数生成正确代码。 4.1.1 函数的类型说明 可将函数说明为返回任何一种合法的C语言数据类型。 类型说明符告诉编译程序它返回什么类型的数据。这个信息对于程序能否正确运行关系极大,因为不同的数据有不同的长度和内部表示。 返回非整型数据的函数被使用之前,必须把它的类型向程序的其余部分说明。若不这样做,C语言的编译程序就认为函数是返回整型数据的函数,调用点又在函数类型说明之前,编译程序就会对调用生成错误代码。为了防止上述问题的出现,必须使用一个特别的说明语句,通知编译程序这个函数返回什么值。下例示出了这种方法。

实验9过程-函数和程序包

实验9过程、函数和和序包 姓名:学号: 专业:班级: 同组人:实验日期: 【实验目的与要求】 ?掌握过程的创建与调用 ?掌握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 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你好 给出运行结果: (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; 给出运行结果: (3)定义一个返回多个值的存储过程。 create or replace procedure p_test(name out varchar2,age out number,sex out varchar2,sal out number) is begin name:='scott'; age:=26; sex:='男'; sal:=8000; end; declare v_name varchar2(20); v_age number(10); v_sex varchar2(5); v_sal number(10); begin p_test(v_name,v_age,v_sex,v_sal); dbms_output.put_line(v_name);

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