也就是说如果o_flag是多行数据,该怎么办

解决方案 »

  1.   

    以下是该问题的ASP解决办法,有谁能转成PHP,在线等待....
      假设现在数据库表中已经存有多个专题讨论的消息,如果想要在网页上分别显示各专题的名称及各专题的消息数目,首先在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格式。
      

  2.   

    asp的偶也知道,php里面的ora函数是否能从调用程序包中提取多行数据
    ora_parse($cursor, "begin Pl_M_INFO (:i_qqnum,:i_flag,:i_info,:o_flag); end;");o_flag在oracle里面设定输出和楼上说的是一样的。
      

  3.   

    看来没人知道用ora函数来取数了?那么oci呢?我用oci可以返回oracle的指针,但是oracle里面定义table的话,我又该如何返回table值?
      

  4.   

    就是table collect的值TYPE tforumname IS TABLE of messages.m_forumname %TYPE INDEX BY BINARY_INTEGER;