php - 无法让 dbms_output 在 PHP 中工作(连接到 Oracle 数据库)

标签 php sql oracle plsql

编辑//问题已解决 - 我已将代码重新编写到 PL/SQL 包和函数中,因此我现在可以使用标准 select 语句简单地调用它。我将在下面留下我的原始查询和一些我发现对处于类似位置的任何人有用的链接。

链接

原始查询

我已经尝试了很长一段时间来让我的 PHP 代码成功处理我的 PL/SQL dbms_output。我似乎无法让它发挥作用。其余代码有效,并且在 SQL Developer 中我得到了正确的输出。错误报告也可以工作,就好像我在代码中遗漏了任何内容一样,我得到了报告的错误(例如,不缓存网络)。它只是没有给我最终的输出。这是我的 PHP 代码的 dbms_output 部分。

// Fetch and display any dbms_output
function DisplayDbmsOutput($con)
{
  $r = GetDbmsOutput($con);

 if (!$r)
     print "<p>Error getting dbms_output</p>\n";
 else
    foreach ($r as $line)
      echo $line."<br>\n";
}

// Returns an array of dbms_output lines, or false.
 function GetDbmsOutput($con)
{
  $res = false;
  $stid = doParse($con, "BEGIN DBMS_OUTPUT.GET_LINE(:LN, :ST); END;");
  if ($stid) {
    if (doBind($stid, ":LN", $ln, 255) &&
        doBind($stid, ":ST", $st, "")) {
      $res = array();
      while ($succ = doExecute($stid)) {
        if ($st)
           break;
         $res[] = $ln;
      }
      if (!$succ)
        $res = false;
    }
    @OCIFreeStatement($stid);
  }
  return ($res);
} 

// Cache Network
CacheNetwork($con, true);  

 // turn serveroutput on
SetServerOutput($con, true);

 // Create dbms_output
$s = doParse($con, "
DECLARE
cost NUMBER;
path_id NUMBER;
res_numeric NUMBER;
res_array SDO_NUMBER_ARRAY;
Nav_Info Test_Turns.Navigation_Info%TYPE;
Walk_Dist chadwick_link$.cost%TYPE;
Starting_Node_ID chadwick_link$.Start_Node_ID%TYPE;
Ending_Node_ID chadwick_link$.End_Node_ID%TYPE;
start_node_id Number;
goal_node_id Number;
goal_node varchar(20);
txtArray dbms_output.chararr;
numLines integer := 4;

BEGIN
start_node_id := 34;
goal_node_id := 19;
goal_node := '%' || ' ' || (to_Char(goal_node_id)) || ',' || '%';

path_id := sdo_net_mem.network_manager.shortest_path('CHADWICK', start_node_id, goal_node_id);
cost := SDO_NET_MEM.PATH.GET_COST('CHADWICK', path_id);
res_array := SDO_NET_MEM.PATH.GET_LINK_IDS('CHADWICK', path_id);
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
   Select Start_Node_ID INTO Starting_Node_ID from chadwick_link$ where Link_ID = res_array(indx);
   Select End_Node_ID INTO Ending_Node_ID from chadwick_link$ where Link_ID = res_array(indx);
   Select Navigation_Info INTO Nav_Info from Test_Turns_Two where Starting_Node = Starting_Node_ID and Finishing_Node = Ending_Node_ID  and possible_finish_nodes Like goal_node;
   select cost INTO Walk_Dist from chadwick_link$ where link_id = res_array(indx);
   DBMS_OUTPUT.PUT(Nav_Info || ' ' || Walk_Dist || ' meters');
END LOOP;
DBMS_OUTPUT.PUT('You have arrived at your destination');
DBMS_OUTPUT.PUT(' ');
END;
");
if ($s)
doExecute($s);

// Display the output
DisplayDbmsOutput($con);

任何建议都会很棒!

最佳答案

DBMS_OUTPUT 写入缓冲区并从中读取。该包最常见的用途是在客户端(例如 SQL*Plus)中显示文本,该客户端内置支持使用 set serveroutput on 命令自动显示缓冲区。

但是我们以编程方式使用该包。

  1. 我们需要初始化缓冲区:dbms_output.enable()
  2. 然后我们写入缓冲区:dbms_output.put_line()
  3. 当我们想要显示我们编写的内容时,我们需要从缓冲区中检索它:dbms_output.get_line() - 或dbms_output.get_lines()(如果有)很多
  4. 最后使用dbms_output.disable()关闭缓冲区

该文档包含更多信息和一些可行的示例。 Find out more.


我认为真正的问题是你为什么使用 DBMS_OUTPUT。通常有更好的机制可以在程序单元或体系结构层之间传递消息。

关于php - 无法让 dbms_output 在 PHP 中工作(连接到 Oracle 数据库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17504882/

相关文章:

php - How to Mock Aws\S3\S3Client for phpunit//如何模拟魔术方法

php - PHP表单上传文件,文件名UTF编码错误

php - Codeception:生成验收测试在并行虚拟机上引发异常

sql - 存储过程是什么时候引入到 SQL Server 产品中的?

mysql - mysql表的重新计数或缓存计数

sql-server - 搭建多样化的数据库测试环境

sql - 将非整数插入整数列时如何强制违反约束?

php - WooCommerce 管理产品 "general data"邮箱问题

sql - Oracle 在解析 prepared statement 时是否选择了默认的执行计划?

sql - 限制随机选择中的记录