用ora如何接收oracle存储过程的多行返回(返回数据集)

jay79 2004-03-23 03:14:51
从php调用oracle的存储过程,有输入和输出。

现在输出的是数据集(多行),php如何获得多行?
用的数据库接口函数是php里面的ora函数库

单个数据输出可以的(Pl_M_INFO 是返回单个数据的)

ora_parse($cursor, "begin Pl_M_INFO (:i_qqnum,:i_flag,:i_info,:o_flag); end;");
$i_qqnum='3004';
$i_flag='1';
$i_info='111111';
$o_flag='';
ora_bind($cursor, "i_num", ":i_num", 32, 1);
ora_bind($cursor, "i_flag", ":i_flag", 32, 1);
ora_bind($cursor, "i_info", ":i_info", 32, 1);
//输出参数
ora_bind($cursor, "o_flag", ":o_flag", 32, 2);
Ora_Exec ($cursor);
echo "The Ruturn o_flag:".$o_flag."\n";
...全文
704 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jay79 2004-03-25
  • 打赏
  • 举报
回复
就是table collect的值TYPE tforumname IS TABLE of messages.m_forumname %TYPE INDEX BY BINARY_INTEGER;
jay79 2004-03-24
  • 打赏
  • 举报
回复
asp的偶也知道,php里面的ora函数是否能从调用程序包中提取多行数据
ora_parse($cursor, "begin Pl_M_INFO (:i_qqnum,:i_flag,:i_info,:o_flag); end;");

o_flag在oracle里面设定输出和楼上说的是一样的。
kingyond 2004-03-24
  • 打赏
  • 举报
回复
以下是该问题的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 tforum

name,

  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格式。
kingyond 2004-03-24
  • 打赏
  • 举报
回复
同样等待答案...
jay79 2004-03-24
  • 打赏
  • 举报
回复
执行程序包也是这个问题,主要是如何回多行数据的事情
jay79 2004-03-24
  • 打赏
  • 举报
回复
看来没人知道用ora函数来取数了?

那么oci呢?我用oci可以返回oracle的指针,但是oracle里面定义table的话,我又该如何返回table值?
jay79 2004-03-23
  • 打赏
  • 举报
回复
没人帮忙嘛?
jay79 2004-03-23
  • 打赏
  • 举报
回复
也就是说如果o_flag是多行数据,该怎么办

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧