2

EDIT// 問題解決- コードを PL/SQL パッケージと関数に書き直したので、標準の select ステートメントを使用して簡単に呼び出すことができます。元のクエリと、同様の立場にある人にとって役立つと思われるいくつかのリンクを以下に残しておきます。

リンク

元のクエリ

PHP コードで PL/SQL dbms_output を正常に処理できるように長い間試みてきました。私はそれを機能させることができないようです。残りのコードは機能し、SQL 開発者では正しい出力が得られます。エラー報告は、エラーが報告されたコードから何も残していないかのように機能します(たとえば、ネットワークをキャッシュしていません)。それは私の最終的な出力を私に与えていないだけです。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);

どんな提案も素晴らしいでしょう!

4

1 に答える 1

2

DBMS_OUTPUT は、バッファへの書き込みとバッファからの読み取りを行います。このパッケージの最も一般的な用途は、SQL*Plus などのクライアントでテキストを表示することです。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()

ドキュメントには、詳細な情報といくつかの実例があります。 詳細をご覧ください。


本当の問題は、なぜ DBMS_OUTPUT を使用しているのかということだと思います。一般に、プログラム ユニット間またはアーキテクチャ レイヤー間でメッセージを渡すためのより優れたメカニズムがあります。

于 2013-07-06T17:39:29.577 に答える