不帅 发表于 2015-1-16 22:21:22

MYSQL编程:PL/SQL综合实例

这一切听起来不错,无疑DBaaS具有很多相对于RDBMS的优势。然而MySQL学习教程,DBaaS也有其局限性,云服务中固有的局限性就是之一。当客户开始将数据放入云端时,他们会遭遇到无法控制的网络性能问题。

本节将在后面进修的PL/SQL基本上剖析一个较庞大的实例,以教会读者编写完全的PL/SQL程序的办法。

实例计划

1.功效计划
某高校开辟的研讨生招生体系,请求计划PL/SQL程序对考生的成就数据举行处置,处置的逻辑是依据每门专业课的最低分数线和总分的最低分数线主动将考生回类为登科考生、调度考生和中选考生。
为此计划两个数据表,graduate数据表寄存考天生绩,result数据表寄存处置了局,PL/SQL程序完成的功效就是将graduate数据表中的数据逐行扫描,依据分数线举行判别,盘算出各科总分,在result数据表中将标记字段主动增加上“登科”或“中选”。
2.数据表计划
Graduate数据表布局如表9.3所示。




创立数据表

为了简化起见,实例的两个数据表都创建在默许的scott用户下,如许读者能够完整摹拟实例分歧的情况举行进修。
1.创立graduate数据表
在.58所示的创立表的【一样平常信息】选项卡中依照以下步骤举行设置。
在【称号】文本框中输出“GRADUATE”。
在【计划】下拉列表框当选择“SCOTT”。
在【表空间】下拉列表框当选择“USERS”。
在【表布局界说区】依照图所示举行设置。
完成设置后单击按钮。

读者也能够在【SQLPlusWorksheet】中实行以下SQL代码,间接创立数据表SCOTT.GRADUATE。
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
CREATETABLE"SCOTT"."GRADUATE"(
"BH"NUMBER(10)NOTNULL,
"XM"VARCHAR2(10)NOTNULL,
"LB"VARCHAR2(10)NOTNULL,
"YINGYU"NUMBER(4,1)NOTNULL,
"ZHENGZHI"NUMBER(4,1)NOTNULL,
"ZHUANYE1"NUMBER(4,1)NOTNULL,
"ZHUANYE2"NUMBER(4,1)NOTNULL,
"ZHUANYE3"NUMBER(4,1)NOTNULL)
TABLESPACE"USERS"
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
【配套程序地位】:第9章creategraduate.sql。
2.创立result数据表
在.59所示的创立表的【一样平常信息】选项卡中依照以下步骤举行设置。
在【称号】文本框中输出“RESULT”。
在【计划】下拉列表框当选择“SCOTT”。
在【表空间】下拉列表框当选择“USERS”。
在【表布局界说区】依照图所示举行设置。
完成设置后单击按钮。

读者也能够在【SQLPlusWorksheet】中实行以下SQL代码,间接创立数据表SCOTT.RESULT。
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
CREATETABLE"SCOTT"."RESULT"(
"BH"NUMBER(10)NOTNULL,
"XM"VARCHAR2(10)NOTNULL,
"LB"VARCHAR2(10)NOTNULL,
"YINGYU"NUMBER(4,1)NOTNULL,
"ZHENGZHI"NUMBER(4,1)NOTNULL,
"ZHUANYE1"NUMBER(4,1)NOTNULL,
"ZHUANYE2"NUMBER(4,1)NOTNULL,
"ZHUANYE3"NUMBER(4,1)NOTNULL,
"TOTALSCORE"NUMBER(5,1)NOTNULL,
"FLAG"VARCHAR2(4)NOTNULL)
TABLESPACE"USERS"
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
【配套程序地位】:第9章createresult.sql。

录进数据

使用【表数据编纂器】向SCOTT.GRADUATE数据表录进以下实行数据。如.60所示。

读者也能够在【SQLPlusWorksheet】中实行以下SQL代码,间接向数据表SCOTT.GRADUATE中录进测试数据。


【配套程序地位】:第9章insertgraduate.sql。

程序计划

1.创立处置历程scott.graduateprocess
在【SQLPlusWorksheet】中实行以下PL/SQL代码,创立处置历程scott.graduateprocess。实行了局如.61所示。

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
/*界说历程参数*/
createorreplaceprocedurescott.graduateprocess(
tempzhengzhiinscott.graduate.zhengzhi%type,
tempyingyuinscott.graduate.yingyu%type,
tempzhuanye1inscott.graduate.zhuanye1%type,
tempzhuanye2inscott.graduate.zhuanye2%type,
tempzhuanye3inscott.graduate.zhuanye3%type,
temptotalscoreinscott.result.totalscore%type)as
/*界说graduaterecord为纪录型变量,一时寄存经由过程游标从graduate数据表中提取的纪录*/
graduaterecordscott.graduate%rowtype;
/*界说graduatetotalscore为数值型变量,统计总分*/
graduatetotalscorescott.result.totalscore%type;
/*界说graduateflag为字符型变量,依据了局放进“中选”或“登科”,然后写进数据表result*/
graduateflagvarchar2(4);
/*界说游标graduatecursor,寄存的是一切的graduate数据表中的纪录*/
cursorgraduatecursoris
select*fromscott.graduate;
/*界说非常处置errormessage*/
errormessageexception;
/*入手下手实行*/
begin
/*翻开游标*/
opengraduatecursor;
/*假如游标没无数据,激活非常处置*/
ifgraduatecursor%notfoundthen
raiseerrormessage;
endif;
/*游标无数据,指针指向第一笔记录,每实行fetch命令,就主动下移,轮回实行到纪录提取终了为止*/
loop
fetchgraduatecursorintograduaterecord;
/*盘算总分*/
graduatetotalscore:=graduaterecord.yingyu+graduaterecord.zhengzhi+graduaterecord.zhuanye1+graduaterecord.zhuanye2
+graduaterecord.zhuanye3;
/*判别单科和总分是不是满意登科请求,若满意,graduateflag变量值为“登科”,不然为“中选”*/
if(graduaterecord.yingyu>=tempyingyuand
graduaterecord.zhengzhi>=tempzhengzhiand
graduaterecord.zhuanye1>=tempzhuanye1and
graduaterecord.zhuanye2>=tempzhuanye2and
graduaterecord.zhuanye3>=tempzhuanye3and
graduatetotalscore>=temptotalscore)then
graduateflag:=登科;
else
graduateflag:=中选;
endif;
/*当游标数据提取终了后,加入轮回”*/
exitwhengraduatecursor%notfound;
/*向了局数据表result中拔出处置后的数据*/
insertinto
scott.result(bh,xm,lb,zhengzhi,yingyu,zhuanye1,zhuanye2,zhuanye3,totalscore,flag)
values(graduaterecord.bh,graduaterecord.xm,graduaterecord.lb,graduaterecord.zhengzhi,graduate
record.yingyu,graduaterecord.zhuanye1,graduaterecord.zhuanye2,graduaterecord.zhuanye3,graduat
etotalscore,graduateflag);
endloop;
/*封闭游标*/
closegraduatecursor;
/*提交了局*/
commit;
/*非常处置,提醒毛病信息*/
exception
whenerrormessagethen
dbms_output.put_line(没法翻开数据表);
/*程序实行停止”*/
end;
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
【配套程序地位】:第9章creategraduateprocess.sql。
2.主程序mainprocess计划
主程序挪用名为graduateprocess的历程来完成处置,代码计划以下:
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
setserveroutputon
/*界说6个出口变量,分离对应graduate数据表中的专业课和总分分数线*/
declare
score1number(4,1);
score2number(4,1);
score3number(4,1);
score4number(4,1);
score5number(4,1);
scoretotalnumber(5,1);
/*将分数线赋值,在这里修正各值就代表分歧的分数线*/
begin
score1:=50;
score2:=56;
score3:=60;
score4:=62;
score5:=64;
scoretotal:=325;
/*挪用处置历程*/
scott.graduateprocess(score1,score2,score3,score4,score5,scoretotal);
end;
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
【配套程序地位】:第9章mainprocess.sql。
在上述历程计划中,综合利用了非常处置、游标、变量等PL/SQL程序计划要素,经由过程主程序向带参数实行的历程传送参数。

实行了局

1.第一组实行了局
(1)将mainprocess.sql文件稍做修改,在【SQLPlusWorksheet】中实行以下PL/SQL程序,实行了局如.62所示。



【配套程序地位】:第9章mainprocess1.sql。
(2)使用【表数据编纂器】检察scott.result数据表的了局,如.63所示。

2.第二组实行了局
(1)将mainprocess.sql文件稍做修改,在【SQLPlusWorksheet】中实行以下PL/SQL程序,实行了局如.64所示。


【配套程序地位】:第9章mainprocess1.sql。
(2)使用【表数据编纂器】检察scott.result数据表的了局,如.63所示。

2.第二组实行了局
(1)将mainprocess.sql文件稍做修改,在【SQLPlusWorksheet】中实行以下PL/SQL程序,实行了局如.64所示。


【配套程序地位】:第9章mainprocess2.sql。

(2)使用【表数据编纂器】检察scott.result数据表的了局,如.65所示。

综合使用PL/SQL的计划要素,就能够计划出良多庞大的处置程序,这也是DBA的一项主要义务。

首先我们要知道,或许有一项技术存在很多理由让我们可以选择使用MySQL学习教程,但是让我们不使用它往往只要有一个理由就足够了。

冷月葬花魂 发表于 2015-1-19 09:22:05

可以动态传入参数,省却了动态SQL的拼写。

愤怒的大鸟 发表于 2015-1-25 11:52:56

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。

简单生活 发表于 2015-2-2 22:01:36

对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。

仓酷云 发表于 2015-2-8 09:08:48

但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)

深爱那片海 发表于 2015-2-25 08:20:32

你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。

蒙在股里 发表于 2015-3-7 18:31:13

SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。

爱飞 发表于 2015-3-15 11:41:46

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。

再见西城 发表于 2015-3-22 00:37:13

原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
页: [1]
查看完整版本: MYSQL编程:PL/SQL综合实例