也就是说如果o_flag是多行数据,该怎么办
解决方案 »
- 无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装。
- 过滤关键词有没有什么好的办法?
- 【急死我了】为何phpexcel在win2003下就是运行不正常呢!
- 用PHPLIB的Templatete类的人士有没有碰到这样的问题?
- 这句话怎么解释?? This will result in significant performance gains
- 框架,会对性能照成影响吗?
- 我用这个函数向mysql中插入10000条数据,结果插了5000条页面就提示完成了,啥原因啊,php不敢用啊
- 求高效读取文本文件的指定行内容
- 如何把多层的树型菜单和数据库连接上???
- FORM提交后变量问题
- 讨论一下PHP代码与效率的问题
- 我架设的 蓝色魔法论坛(BMForum) v4.5为什么不好用啊?
假设现在数据库表中已经存有多个专题讨论的消息,如果想要在网页上分别显示各专题的名称及各专题的消息数目,首先在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格式。
ora_parse($cursor, "begin Pl_M_INFO (:i_qqnum,:i_flag,:i_info,:o_flag); end;");o_flag在oracle里面设定输出和楼上说的是一样的。