手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp编程>列表

ASP调用oracle存储过程

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
  一、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.

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!