2013-07-06 4 views
2

EDIT // 문제가 발생했습니다. - 코드를 PL/SQL 패키지 및 함수에 다시 작성하여 표준을 사용하여 간단하게 호출 할 수 있습니다. select 문. 아래에 원래의 쿼리와 비슷한 위치에있는 누구에게나 유용한 링크가 두 개 남았습니다.PHP에서 dbms_output을 사용할 수 없습니다 (Oracle 데이터베이스에 연결)

링크

원래 쿼리

필자는 오랫동안 PL/SQL dbms_output을 성공적으로 처리하기 위해 PHP 코드를 얻으려고 노력해 왔습니다. 나는 그것이 작동하도록 할 수 없습니다. 나머지 코드는 작동하고 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); 

어떤 의견이라도 훌륭합니다!

+0

어디서 잘못되었는지 확인하기 위해이 코드를 추적 한 적이 있습니까? 특히,'DisplayDbmsOutput'이 호출되고,'DBMS_OUTPUT.GET_LINE'을 호출해야하는 코드로 들어가는가? –

+0

"get dbms_output"오류를 반환하므로 getDmbsOutput 내에서 문제가 발생한다고 생각하므로 (! $ r) [$ r = GetDbmasOutput]이 반환됩니다. 왜 그것이 실패하는지 나는 확신하지 못한다. – Xanphis

+0

'doParse' 나'doExecute'처럼 유효한 값을 반환하지 않거나'doBind' 호출 중 하나가 실패했습니다. 이 루틴은 당신이 쓴 것입니까? 그렇다면 무엇이 잘못되었는지 자세히 알려주는 코드를 추가하여 인쇄 할 수 있습니다. –

답변

2

DBMS_OUTPUT은 버퍼에 쓰고 읽습니다. 이 패키지의 가장 일반적인 용도는 SQL * Plus와 같은 클라이언트에 텍스트를 표시하는 것입니다.이 클라이언트에는 set serveroutput on 명령을 사용하여 자동으로 버퍼를 표시하는 기능이 내장되어 있습니다.

그러나 프로그래밍 방식으로 패키지를 사용합니다. 다음 dbms_output.enable()

  • 우리가 버퍼에 쓰기 :

    1. 우리는 버퍼를 초기화해야 dbms_output.put_line()
    2. 우리는 우리가 우리가 버퍼에서 검색 할 필요가 기록 된 것을 표시 할 : dbms_output.get_line()를 - 또는 dbms_output.get_lines() 많은에게
    3. 이 있다면 마지막으로 문서가 더있다 dbms_output.disable()

    로 버퍼를 닫 전 정보 및 몇 가지 작업 예제를 제공합니다.


    Find out more. 난 당신이 DBMS_OUTPUT을 사용하는 이유를 진짜 문제는 가정합니다. 일반적으로 프로그램 단위 또는 아키텍처 계층간에 메시지를 전달하는 더 나은 메커니즘이 있습니다.

  • +0

    답변 해 주셔서 감사합니다. 이미 각자의 4 포인트를 코드에 넣었습니다. 스크립트를 비활성화하고 비활성화했습니다. 그것은 여전히 ​​작동하지 않습니다 ... 나는 문서화를 겪었으며 실제로 도움이되지 못했습니다. 그것을 사용하는 이유는 PL/SQL 서브 프로그램 (최단 경로)에서 출력을 얻는 방법을 알고있는 유일한 방법이기 때문입니다. – Xanphis

    관련 문제