EDIT // 문제가 발생했습니다. - 코드를 PL/SQL 패키지 및 함수에 다시 작성하여 표준을 사용하여 간단하게 호출 할 수 있습니다. select 문. 아래에 원래의 쿼리와 비슷한 위치에있는 누구에게나 유용한 링크가 두 개 남았습니다.PHP에서 dbms_output을 사용할 수 없습니다 (Oracle 데이터베이스에 연결)
링크
- http://www.plsql-tutorial.com/plsql-functions.htm
- Creating and calling PL/SQL functions
- http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.apdv.plsql.doc%2Fdoc%2Fr0054067.html
원래 쿼리
필자는 오랫동안 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);
어떤 의견이라도 훌륭합니다!
어디서 잘못되었는지 확인하기 위해이 코드를 추적 한 적이 있습니까? 특히,'DisplayDbmsOutput'이 호출되고,'DBMS_OUTPUT.GET_LINE'을 호출해야하는 코드로 들어가는가? –
"get dbms_output"오류를 반환하므로 getDmbsOutput 내에서 문제가 발생한다고 생각하므로 (! $ r) [$ r = GetDbmasOutput]이 반환됩니다. 왜 그것이 실패하는지 나는 확신하지 못한다. – Xanphis
'doParse' 나'doExecute'처럼 유효한 값을 반환하지 않거나'doBind' 호출 중 하나가 실패했습니다. 이 루틴은 당신이 쓴 것입니까? 그렇다면 무엇이 잘못되었는지 자세히 알려주는 코드를 추가하여 인쇄 할 수 있습니다. –