分享
 
 
 

ASP调用oracle存储过程

王朝oracle·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

一、ASP动态网站开发技术

随着人们对因特网认识的加深和IT技术的发展,一成不变的静态网页已经越来越满足不了信息交互和电子商务的需求,因此以数据库为核心开发能够实现信息交互和个性化服务的网页已经成为一种潮流。为了迎合动态交互式网页的开发趋势,出现了可以与后台数据库进行互动的Web开发技术,目前比较流行的一类是建立在微软Windows平台IIS基础上的ASP(Active Server Pages)技术。它是将VBscript、JavaScript等特定的脚本语言利用特殊的标记嵌入到HTML中,当Browser端提出请求时,Web服务器会使用相应的脚本解释引擎对脚本解释执行,完成数据库的查询、修改等任务,并把结果动态格式化成HTML形式送回到Browser请求端。

Oracle数据库是目前国内外最常使用的数据库,随着Oracle 8i的发布,它又增添了对Java和对象的支持,大大方便了网络软件的开发。因此目前ASP应用程序的开发在很多场合需要与后台Oracle数据库打交道。下面,我们将以多个专题讨论组的应用为例,着重介绍ASP脚本是如何利用ADO组件的Command对象访问数据库的存储过程的。

多专题讨论组用户提交的信息都统一存储在以下结构的数据库表中:

CREATE TABLE messages(

m_id NUMBER,

m_forumName varchar2(30) NOT NULL,

m_subject varchar2(30) NOT NULL,

m_username varchar2(30) NOT NULL,

m_email varchar2(70) NOT NULL,

m_entrydate date default sysdate,

m_message varchar2(200),

m_ordernum number,

m_reply number);

其中各字段的含义如下:

m_id:每条消息唯一识别的标识号;

m_forumname:讨论专题名称;

m_subject:消息主题;

m_username:用户名;

m_email:E-mail地址;

m_entrydate:提交时间;

m_message:消息内容;

m_ordernum:顺序号;

m_reply:是否为回答消息。

二、ASP脚本调用Oracle数据库包中的存储过程

1.建立数据库包

假设现在数据库表中已经存有多个专题讨论的消息,如果想要在网页上分别显示各专题的名称及各专题的消息数目,首先在Oracle数据库中定义一个名为getForum的存储过程,放在名为forum_retrieve的包中。

如果存储过程返回的结果是多行数据集,此过程必须放在一个包中。包是Oracle数据库的一种对象,它可以将数据类型、存储过程、函数、变量和常量封装在一起,类似于VB中的标准代码模块。包在结构上又分为包头和包体两部分分别存储的,因此这两部分也要分别建立,包头用来定义可被外部引用的元素;包体定义实际代码,即逻辑执行部分。

此例的包头与包体分别定义如下:

CREATE OR REPLACE PACKAGE forum_retrieve

AS

TYPE tforumname IS TABLE of messages.m_forumname %TYPE INDEX BY BINARY_INTEGER;

TYPE tcount IS TABLE of NUMBER INDEX BY BINARY_INTEGER;

PROCEDURE getForums

(

forumname OUT tforumname,

theCount OUT tcount

);

以上是包头的定义,首先对tforumname和tcount这两个PL/SQL表类型进行声明,然后对外部调用到的存储过程进行声明。

CREATE OR REPLACE PACKAGE BODY forum_retrieve

AS

PROCEDURE getForums

(

forumname OUT tforumname,

theCount OUT tcount

)

AS

CURSOR c1 IS

SELECT m_forumname

FROM messages

GROUP by m_forumname

ORDER by m_forumname;

counter NUMBER DEFAULT 1;

BEGIN

FOR c IN c1 LOOP

forumname(counter):=c.m_forumname;

SELECT COUNT(*)

into thecount(counter)

FROM messages

WHERE m_forumname=forumname(counter);

counter :=counter+1;

END LOOP;

END;

以上是对包体的定义,它只包含了一个名为getforums的存储过程。

由于Oracle与SQL Server等其他数据库不同,不能在存储过程中将查询的多行结果直接返回到调用端,每次只能直接返回一行结果,但在这里我们查询的讨论组名称和数目返回的是多行数据,因此我们使用了PL/SQL的光标c1,它首先查询到不同专题名称的结果集,然后建立游标循环分别对每一个讨论组专题统计出各自的消息数目,将专题名称和消息数目分别存到名为forumname和thecount的PL/SQL表变量中,并作为输出变量返回到调用端。tforumname和tcount是PL/SQL的两个表类型,这种类型类似于其他编程语言的数组,它们的定义在存储过程中是无法进行的,因此这也是必须将getforums存储过程放在一个包中的原因。

如果以上forum_retrieve包在创建过程没有出现错误,那么它就已经被编译后存储在Oracle的数据字典中了,在SQL*plus下键入以下命令:

SELECT * FROM user_objects WHERE object_name=forum_retrieve;

会看到名为forum_retrieve的包头和包体的状态,正常应是VALID状态。

2.在ASP文件中调用存储过程

下一步我们就可以在客户端的ASP文件中使用ADO Command对象来调用这个存储过程了。首先在IIS所在主机上要建立好对Oracle数据库ODBC的DSN连接,或直接在ASP文件中建立DSN-Less连接,这完全可以根据个人喜好和具体情况来选择,代码如下:

<%

......

‘建立名为Con的数据库连接(省略)

Set RS = Server.CreateObject( ADODB.RecordSet )

‘建立ADO RecordSet对象。

Set CMD = Server.CreateObject( ADODB.Command )

‘建立ADO Command对象。

SQLstr = {CALL forum_retrieve.getforums({resultset 10,forumname,thecount})}

‘建立存储过程调用字符串。其中forum_retrieve.

‘getforums说明是调用forum_retrieve包中的getforums

‘存储过程,forumname、thecount是存储过程的输出变量,

‘resultset 10说明输出结果集的数量,这里的数字一定

‘要大于实际的输出数量,如果大于设定值,则会出现

‘Oracle error ORA-06512错误。

CMD.ActiveConnection = Con

‘建立CMD对象与Con的联系。

CMD.CommandType = adCmdText

‘调用存储过程时要将Command类型设为adCmdText常量,

‘因此必须在此.asp文件中包含ADOVBS.inc文件。

CMD.CommandText = SQLstr

‘指定Command对象的执行字符串。

SET RS=CMD.Execute()

‘执行CMD,并将返回结果放到RS对象中,下面就可以对

‘RS对象进行操作,将结果格式化成HTML格式。

......

%>

在以上例子中存储过程只有输出变量。如果被调用的存储过程还包含输入变量,SQL连接字符串应修改如下:

SQLstr={call package.procedure(?,..,{resultset 100,output1,output2,...})}

其中?是每个输入变量的占位符,与输入变量的个数一一对应。另外,还要分别对每个输入变量赋值,格式如下:

CMD.Parameters.Append CMD.CreateParameter(输入变量名,adVarChar,adParamInput,30,赋值变量)

其中adVarChar指定变量类型是字符串;adParamInput指定变量为输入变量;30是指定字符串的最大长度,如果输入变量是整型或其他类型,则无须设置此项。所有这些常量的定义都包含在ADOVBS.INC文件中,对于不同的参数类型可查看此文件进行设置。

三、ASP脚本调用Oracle数据库中独立的存储过程

所谓独立的存储过程是指没有放在包中,而是作为单独的对象存储在Oracle数据字典中的过程,ASP脚本对这种存储过程的调用与上述方法略有不同,以下举例说明。例如,要在ASP脚本中调用独立的名为getmessages的存储过程,代码如下:

CREATE OR REPLACE PROCEDURE getmessages

(

forumname IN messages.m_forumname%TYPE,

lastmessage OUT messages.m_id%TYPE

)

AS

BEGIN

......‘内容省略

ENDgetmessages;

在ASP文件中也是使用ADO Command对象对此过程进行调用,代码如下:

<%

......

‘建立名为theCon的数据库连接

Set CMD=Server.CreateObject( ADODB.Command )

CMD.ActiveConnection=theCon

CMD.CommandType=adCmdStoredProc

‘设置Command执行的是存储过程。

CMD.Parameters.Append CMD.CreateParameter(forumName,adVarchar, adParamInput,30,theForumName )‘给存储过程输入变量forumName赋值,theForumName是

‘ASP文件的本地变量,将theForumNam变量的值赋给

‘forumName。

CMD.Parameters.Append CMD.CreateParameter(lastMessage,adInteger, adParamOutput )

‘设置输出变量。

CMD.CommandText=getLastMessages

‘指定要调用的存储过程名。

CMD.Execute‘调用执行存储过程。

getLastMessage=CMD( lastMessage )‘取得输出值。

CMD.ActiveConnection=Nothing‘关闭CMD数据库连接。

Set CMD=Nothing‘释放CMD对象。

‘将取得的结果格式化成HTML形式

......

%>

四、为什么要使用存储过程

1.存储过程可以将多条SQL语句包含在一起执行,ASP和数据库的交互只是输入、输出参数的一次来回传递,传递信息少,因此提高了执行效率。

2.存储过程在数据库中是经过编译后存储的,因此其执行效率比起执行同样功能的SQL语句要高很多。

3.在开发大型应用程序过程中可以将一些标准功能逻辑模块作为存储过程放在数据库中,使得模块化程序开发的结构更加清晰,而且易于维护。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有