大型数据库技术Oracle04.docx

上传人:b****1 文档编号:656653 上传时间:2023-04-29 格式:DOCX 页数:51 大小:487.13KB
下载 相关 举报
大型数据库技术Oracle04.docx_第1页
第1页 / 共51页
大型数据库技术Oracle04.docx_第2页
第2页 / 共51页
大型数据库技术Oracle04.docx_第3页
第3页 / 共51页
大型数据库技术Oracle04.docx_第4页
第4页 / 共51页
大型数据库技术Oracle04.docx_第5页
第5页 / 共51页
大型数据库技术Oracle04.docx_第6页
第6页 / 共51页
大型数据库技术Oracle04.docx_第7页
第7页 / 共51页
大型数据库技术Oracle04.docx_第8页
第8页 / 共51页
大型数据库技术Oracle04.docx_第9页
第9页 / 共51页
大型数据库技术Oracle04.docx_第10页
第10页 / 共51页
大型数据库技术Oracle04.docx_第11页
第11页 / 共51页
大型数据库技术Oracle04.docx_第12页
第12页 / 共51页
大型数据库技术Oracle04.docx_第13页
第13页 / 共51页
大型数据库技术Oracle04.docx_第14页
第14页 / 共51页
大型数据库技术Oracle04.docx_第15页
第15页 / 共51页
大型数据库技术Oracle04.docx_第16页
第16页 / 共51页
大型数据库技术Oracle04.docx_第17页
第17页 / 共51页
大型数据库技术Oracle04.docx_第18页
第18页 / 共51页
大型数据库技术Oracle04.docx_第19页
第19页 / 共51页
大型数据库技术Oracle04.docx_第20页
第20页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

大型数据库技术Oracle04.docx

《大型数据库技术Oracle04.docx》由会员分享,可在线阅读,更多相关《大型数据库技术Oracle04.docx(51页珍藏版)》请在冰点文库上搜索。

大型数据库技术Oracle04.docx

大型数据库技术Oracle04

实验4PL/SQL编程基础

姓名:

计算机科学与技术

学号:

专业:

网络工程

班级:

同组人:

实验日期:

【实验目的与要求】

⏹掌握PL/SQL基本语法

⏹掌握PL/SQL简单存过程的编写

【实验内容与步骤】

4.1.实验准备工作

1.测试用表的创建与数据添加

(1).创建测试表

CreateTableTESTTABLE(

RECORDNUMBERnumber(4)NotNull,

CURRENTDATEDateNotNull

Tablespace"USER";--这里的表空间其实可以不去管,这样它就会在当前用户的表空间中创建一个表

(2).使用for语句在测试表中加入测试数据

Declare

maxrecordsConstantInt:

=20;

iInt:

=1;

Begin

ForiIn1..maxrecordsLoop

InsertIntohqf.testtable(recordnumber,currentdate)--hqf为模式名,应改动

Values(i,Sysdate);

dbms_output.put_line('现在输入的内容是:

'||i||''||Sysdate);

Commit;--这里切记要commit否则将不会将数据提交到表中

EndLoop;

dbms_output.put_line('记录已经按照计划全部插入,请查看!

');

End;

//注:

hqf为登录用户名,需根据情况改动,如:

实验中一般用scott.

(3).查询表中数据,给出查询结果截图:

\可用SETSERVEROUTPUTON直接输出!

4.2.最简单的PL/SQL程序

1.输出"Hello,World"

/***************************************

第一个例子:

输出"Hello,World"

***************************************/

setserverouton--设置SQL*Plus将服务器所返回的写出来

begin--块开始

DBMS_OUTPUT.put_line('Hello,World');

--在控制台输出信息,类似C语言的Printf或者java语言中的System.out.print

end;--块结束

运行结果为:

1.接收数据并输出

/***************************************

在此基础上,完成Hello,某某,某某从客户端得到

***************************************/

declare

v_namevarchar2(20);

begin--块开始

v_name:

='&v_name';--与“客户端”交互,类似C语言的scanf语句

DBMS_OUTPUT.put_line('测试结果为:

Hello,'||v_name);

end;--块结束

运行结果为:

4.3.简单变量的使用

1.变量的声明与引用

setserveroutputon;

--PL/SQL变量之简单类型

declare

v_dept_idnumber(5):

=1111;

v_agebinary_integer:

=12;

v_dept_namevarchar2(20):

='人事部';

v_rateconstantnumber(4,2):

=22.12;

v_validbooleannotnull:

=TRUE;

v_hire_datedatenotnull:

=sysdate+7;

begin

v_dept_id:

=2222;

dbms_output.put_line(v_dept_id);

end;

/

运行结果为:

2.Into子句赋值的使用:

declare

v_deptnonumber

(2);

v_locvarchar2(15);

begin

selectdeptno,loc

intov_deptno,v_loc

fromdept

wheredname='SALES';

DBMS_OUTPUT.PUT_LINE(V_deptno||'and'||v_loc);

end;

运行结果为:

实验练习:

编写一PL/SQL程序,实现依次从客户端接收各字段的值,并放于变量中,输完一条记录的所有字段值后,将值写到数据库表Emp中。

请给出程序源码:

setserveroutputon

declare

d_empnonumber(4);

d_enamevatchar2(10);

begin

d_d_empno:

='&编号';

d_ename:

='&姓名';

insertintoemp

(empno,ename)

values

(d_empno,d_name);

end;

/

 

给出测试结果:

3.变量作用域:

阅读以下程序,熟悉变量的斌值方法,理解变量的作用,给出运行结果。

--嵌套块中的变量赋值和作用域

DECLARE

v_weightNUMBER(3):

=100;

v_messageVARCHAR2(255):

='OuterValue';

BEGIN

DECLARE

v_weightNUMBER(3):

=1;

v_messageVARCHAR2(255):

='Innervalue';

BEGIN

v_weight:

=v_weight+1;

v_message:

='Put'||v_message;

DBMS_OUTPUT.PUT_LINE('innerblock'||to_char(v_weight)||v_message);

END;

v_weight:

=v_weight+1;

v_message:

='Put'||v_message;

DBMS_OUTPUT.PUT_LINE('outterblock'||to_char(v_weight)||v_message);

END;

运行结果为:

4.4.使用%type和%rowtype变量

1.使用%type变量

阅读以下程序,理解其功能,给出运行结果。

(1)DROPTABLEEMPL;

createtableEMPL

EMPLOYEE_IDNUMBER(5)notnull,

LAST_NAMEVARCHAR2(20)notnull,

HIRE_DATEDATE,

SALARYNUMBER(8,2),

JOB_IDNUMBER(5),

DEPARTMENT_IDNUMBER(5)

);

 

setserveroutputon;

--PL/SQL变量之%TYPE类型

declare

v_last_nameemp.last_name%TYPE;

v_hire_dateemp.hire_date%TYPE;

v_balancenumber(6,2);

v_min_balancev_balance%type;

begin

dbms_output.put_line('定义%type类型的变量');

end;

/

运行结果为:

(2)declare

v_deptnodept.deptno%type;

v_locdept.loc%type;

begin

selectdeptno,loc

intov_deptno,v_loc

fromdept

wheredname='SALES';

DBMS_OUTPUT.PUT_LINE(V_deptno||'and'||v_loc);

end;

/

运行结果为:

2.使用%Rowtype变量

阅读以下程序,理解其功能,给出运行结果。

(1)DROPTABLEEMPL;

createtableEMPL

EMPLOYEE_IDNUMBER(5)notnull,

LAST_NAMEVARCHAR2(20)notnull,

HIRE_DATEDATE,

SALARYNUMBER(8,2),

JOB_IDNUMBER(5),

DEPARTMENT_IDNUMBER(5)

);

setserveroutputon;

--PL/SQL变量之%ROWTYPE类型

declare

v_emplemp%rowtype;

begin

dbms_output.put_line('定义%rowtype类型的变量');

end;

/

运行结果为:

(2)droptablestock;

createtablestock

symbolvarchar2(50),

pricenumber(6,2)

);

insertintostockvalues('IBM',188.88);

insertintostockvalues('ORCL',100.88);

DECLARE

stock_info1stock%ROWTYPE;

stock_info2stock%ROWTYPE;

stock_info3stock%ROWTYPE;

BEGIN

--对应纪录直接取得相应字段的:

Populatethespecificfieldsinarecord

SELECTsymbol,price

INTOstock_info1.symbol,stock_info1.price

FROMstock

WHEREsymbol='ORCL';

--对应纪录直接放入纪录中

SELECT*INTOstock_info2FROMstock

WHEREsymbol='ORCL';

stock_info3:

=stock_info2;

--记录间可以相互赋值

stock_info3.symbol:

='ORACLE';

--对纪录的各字段赋值。

DBMS_OUTPUT.PUT_LINE('stock_info1:

'||stock_info1.symbol||''||stock_info1.price);

DBMS_OUTPUT.PUT_LINE('stock_info2:

'||stock_info2.symbol||''||stock_info2.price);

DBMS_OUTPUT.PUT_LINE('stock_info3:

'||stock_info3.symbol||''||stock_info3.price);

END;

运行结果为:

思考:

如下所示:

改变表结构。

droptablestock;

createtablestock

symbolvarchar2(50),

pricenumber(6,2),

ownervarchar2(10)

);

对以上程序运行有影响吗?

为什么?

4.5.使用复合变量

1.记录类型

阅读以下程序,理解其功能,给出运行结果。

(1)setserveroutputon;

--PL/SQL变量之RECORD类型1

declare

typenamed_record_typeisrecord(

last_namevarchar2(20),

first_namevarchar2(20),

birthdaydate,

agenumber(3)

);

v_record_1named_record_type;

v_record_2named_record_type;

begin

v_record_1.last_name:

='张';

v_record_1.first_name:

='三丰';

v_record_1.birthday:

='2-2月-1788';

v_record_1.age:

=432;

dbms_output.put_line('定义record类型的变量');

end;

/

运行结果为:

(2)--使用记录类型2:

setserveroutputon;

DECLARE

TYPErempISRECORD(

v_empnonumber(10),

v_enameVARCHAR2(20),

v_salaryNUMBER(10,2)

);

rsm_empremp;

BEGIN

SELECTempno,ename,sal

INTOrsm_emp.v_empno,rsm_emp.v_ename,rsm_emp.v_salary

FROMemp

WHEREsal=(SELECTMAX(sal)FROMemp);

--求出工资最高的雇员

DBMS_OUTPUT.PUT_LINE('HighestPaidEmployeeis'||rsm_emp.v_ename);

DBMS_OUTPUT.PUT_LINE('Idis'||rsm_emp.v_empno||'Salary'||to_char(rsm_emp.v_salary,'999,999.99'));

END;

运行结果为:

 

(3)--使用记录类型3:

setserveroutputon;

DECLARE

TYPErempISRECORD(

v_empnonumber(10),

v_enameVARCHAR2(20),

v_salaryNUMBER(10,2)

);

rsm_empremp;

BEGIN

SELECTempno,ename,sal

INTOrsm_emp

FROMemp

WHEREsal=(SELECTMAX(sal)FROMemp);

--求出工资最高的雇员

DBMS_OUTPUT.PUT_LINE('HighestPaidEmployeeis'||rsm_emp.v_ename);

DBMS_OUTPUT.PUT_LINE('Idis'||rsm_emp.v_empno||'Salary'||to_char(rsm_emp.v_salary,'999,999.99'));

END;

运行结果为:

 

4.6.复合变量的使用

1.完整定义一个记录类型的变量,了解其简单应用。

阅读以下程序,理解其功能,给出运行结果。

Declare

TypemyrecordIsRecord(

r_recordnumberNumber(4),

r_currentdateDate

);

v_myrecordmyrecord;

Begin

Select*

Intov_myrecord

Fromtesttable

Whererecordnumber=80;

dbms_output.put_line('用记录类型的变量取出来的值为:

'||

v_myrecord.r_recordnumber||

v_myrecord.r_currentdate);

End;

给出运行结果:

2.简单的%Rowtype定义变量的实例

阅读以下程序,理解其功能,给出运行结果。

Declare

v_myrowtesttable%Rowtype;

Begin

Select*

Intov_myrow

Fromtesttable

Whererecordnumber=90;

dbms_output.put_line('用rowtype查询的结果是:

'||v_myrow.recordnumber||v_myrow.currentdate);

--dbms_output.put_line('用rowtype查询的结果是:

'||v_myrow.recordnumber||v_myrow.currentdate||myrow.Rowid);

--上句操作说明了行类型的变量中不会把oracle表中的rowid的值带进来

End;

给出运行结果:

4.7.条件判断语句的使用

阅读并理解以下程序,调试并给出运行结果。

1.If语句:

droptableemployee;

createtableemployee(

empnonumber(4),

namevarchar2(30),

salarynumber(8,2)

);

insertintoemployeevalues(7900,'黄蓉',3000);

commit;

 

setserveroutputon;

--执行结果如何呢?

DECLARE

--注意employee.salary%TYPE这一类型定义,定义v_SALARY为emp表的sal字段的类型

--这是plsql一种方便的定义类型方法。

v_SALARYemployee.salary%TYPE;

v_CommentVARCHAR2(35);

BEGIN

/*返回employee的salary*/

SELECTsalary

INTOv_SALARY

FROMemployee

WHEREname='黄蓉';

--WHEREempno=7900;

dbms_output.put_line('薪水是:

'||v_SALARY);

--条件判断语句

IFv_SALARY<1000THEN

v_Comment:

='比较低';

ELSIFv_SALARY<3000THEN

v_Comment:

='Alittlehigher:

凑和';

ELSIFv_SALARY<5000THEN--ELSIF!

不是elseif

v_Comment:

='high:

比较高';

ELSE

v_Comment:

='VERYHIGH:

非常高!

';

ENDIF;

dbms_output.put_line('TheEmployee:

salaryis'||v_SALARY);

dbms_output.put_line('hissalaryis'||v_Comment);

END;

/

给出运行结果:

2.Case语句:

为了简化多个选择用if来做判断,这种case区别于编程语言中的case语句多用于多种情况的判断。

给出运行结果:

4.8.循环语句的使用

阅读并理解以下程序,调试并给出运行结果。

0.建立一个临时表

--建立一个临时表,用于测试

DROPTABLEtemp_table;

CREATETABLEtemp_table(

num_colNUMBER,

char_colVARCHAR2(60)

);

1.LOOP语句

--LOOP语句

DECLARE

v_CounterNUMBER:

=1;

BEGIN

LOOP

--以loopcounter向temp_tableInsert纪录

--.

INSERTINTOtemp_table

VALUES(v_Counter,'Loopindex');

v_Counter:

=v_Counter+1;

--循环终止条件-whentheloopcounter>50

--跳出循环.

IFv_Counter>10THEN

EXIT;

ENDIF;

ENDLOOP;

END;

给出运行结果:

2.FORLOOP语句

--FORLOOP语句

BEGIN

FORv_CounterIN1..10LOOP

dbms_output.put_line('v_Counteris'||v_Counter);

ENDLOOP;

--DBMS_OUTPUT.PUT_LINE(v_Counter);

--在for循环外不可以访问循环变量

END;

给出运行结果:

3.whileLOOP语句

--whileLOOP语句

DECLARE

v_CounterNUMBER:

=1;

BEGIN

--v_Counter<=10--循环.

WHILEv_Counter<=50LOOP

dbms_output.put_line('v_Counteris'||v_Counter);

v_Counter:

=v_Counter+1;

ENDLOOP;

END;

给出运行结果:

4.while语句

--WHILE语句

DECLARE

v_CounterNUMBER:

=1;

BEGIN

WHILEv_Counter<=10LOOP

--以loopcounter向temp_tableInsert纪录

--.

INSERTINTOtemp_table

VALUES(v_Counter,'Loopindex');

v_Counter:

=v_Counter+1;

--循环终止条件-whentheloopcounter>50

--跳出循环.

ENDLOOP;

END;

给出运行结果:

4.9.游标的使用:

1.隐式游标:

(0)创建测试表和加入测试数据

droptableemp_Examloyees;

createtableemp_Examloyees(

EMP_EXAMLOYEE_IDNUMBER(6)primarykey,

FIRST_NAMEVARCHAR2(20),

LAST_NAMEVARCHAR2(25),

EMAILVARCHAR2(25),

PHONE_NUMBERVARCHAR2(20),

HIRE_DATEDATE,

JOB_IDVARCHAR2(10),

SALARYNUMBER(8,2),

COMMISSION_PCTNUMBER(2,2),

DEPARTMENT_IDNUMBER(4)

);

insertintoemp_E

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2