2016-05-17 5 views
1
 CREATE OR REPLACE PACKAGE BODY simpleState IS 

     PROCEDURE selectFromTable(tableName VARCHAR2, columnName VARCHAR2) IS 
     TYPE c1 IS TABLE OF VARCHAR2(30); 
     Notes c1; 
     BEGIN 
     EXECUTE IMMEDIATE 'Select ' || columnName || ' FROM ' || tableName BULK COLLECT INTO Notes; 
     FOR idx IN Notes.FIRST .. Notes.LAST LOOP 
      DBMS_OUTPUT.PUT_LINE(Notes(idx)); 
     END LOOP; 
     END selectFromTable; 


    $conn = oci_connect("student", "STUDENT", "localhost"); 

    if (!$conn) { 
     $m = oci_error(); 
     echo $m['message'], "\n"; 
     exit; 
    } 

else { 
    print "Connected to Oracle!"; 
} 


    if(isset($_POST["readSubmit"])){ 

     $table = $_POST['ReadTableName']; 
     $column = $_POST['ReadColumn']; 

     $stid = oci_parse($conn, 'begin simpleState.selectFromTable(:a,:b); end;'); 

     ocibindbyname($stid, 'a', $table); 
     ocibindbyname($stid, 'b', $column); 

     if (!$stid) { 
      $e = oci_error($conn); 
      trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); 
     } 


      $r = oci_execute($stid); 
      echo "$r"; 
     oci_free_statement($stid); 
     oci_close($conn);  
     } 

     ?> 

PHPを使用してブラウザのDBMS_OUPUT.PUT_LINEにメッセージを表示しようとしています。しかし、何も表示されません。 PL/SQLコードは動作し、SQL Developerに表示する必要がある内容を表示します。誰もこれで私を助けることができますか?PHPでオラクルからdbms出力メッセージを取得します

+1

なぜこれをやろうとしていますか? DBMS_OUTPUTは一般的にはアドホック・メッセージのためだけに使用されるものです。あるシステムから別のシステムにデータを渡す方法ではなく、テスト目的で使用します。私があなたの場合は、refカーソルを調べます。これはselectステートメントから呼び出しコードにデータを渡すための推奨ソリューションです。 – Boneist

+0

さて、pl/sqlプロシージャをユーザーインターフェイス(HTMLページのような単純なもの)と統合するための高速なソリューションが必要でした – student0495

+0

ああ、私はすでにREFカーソルを試しました.... – student0495

答えて

2

私は数日前に同じ問題を抱えていましたが、私は怠け者でしたが、解決策を探すのを止めましたが、私は今解決策を見つけました。

プロシージャではなく、SYS_REFCURSORを返す関数を作成しました。

CREATE OR REPLACE FUNCTION selectFromTable(tableName VARCHAR2, columnName VARCHAR2) 
    RETURN SYS_REFCURSOR 
AS 
    my_cursor SYS_REFCURSOR; 
    s_query varchar2(500); 
BEGIN 

    s_query := 'SELECT ' || columnName || ' FROM ' || tableName; 

    OPEN my_cursor FOR s_query; 

    RETURN my_cursor; 
END selectFromTable; 
/

PHPコードはかなりシンプルです。

<?php 
    $conn = oci_connect('student', 'STUDENT', 'localhost/XE'); 
    if (!$conn) { 
     $e = oci_error(); 
     trigger_error(htmlentities($e('message'), ENT_QUOTES), E_USER_ERROR); 
    } 

    $tablename = 'STUDENTI'; 
    $columnname = 'NR_MATRICOL'; 

    $query = "begin 
       :cursor := selectFromTable(:tabl, :colm); 
      end;"; 

    $stid = oci_parse($conn, $query); 

    $p_cursor = oci_new_cursor($conn); 

    oci_bind_by_name($stid, ":tabl", $tablename); 
    oci_bind_by_name($stid, ":colm", $columnname); 

    oci_bind_by_name($stid, ":cursor", $p_cursor, -1, OCI_B_CURSOR); 

    oci_execute($stid); 
    oci_execute($p_cursor, OCI_DEFAULT); 

    while (($row = oci_fetch_array($p_cursor, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { 
     echo $row['NR_MATRICOL'] . "<br />\n"; 
    } 
?> 

編集:

$columnname = 'NR_MATRICOL, NUME, PRENUME'; 
を、あなたはあまりにもエコーを追加する必要があります:あなたはより多くの列を印刷する必要がある場合は
、あなたは単にここに列名を追加することができます

echo $row['NR_MATRICOL'] . " - "; 
echo $row['NUME'] . " - "; 
echo $row['PRENUME'] . "<br >"; 

出力は次のようになります。

111 - Popescu - Bogdan 
112 - Prelipcean - Radu 
123 - Bucur - Andreea 
131 - Santa - Claus 
+0

私はrefカーソルで試してみました。ありがとうございました! – student0495

+0

完璧に作業しました!ありがとうございました! – student0495

0

深い調査の後、私は実際にdbms_outputから何かを得ることができないことを知ったので、私は自分の問題に対する解決策を作りました。 PL/SQLプロシージャにOUTパラメータを追加しました。ここですべての結果を連結しています。 chr(10)を追加して、改行を作成し、oracleで異なる行結果をシミュレートしました。

私はPROCEDURE selectFromTable(tableName VARCHAR2, columnName VARCHAR2, p_out OUT VARCHAR2);を追加し、DBMS_OUTPUT.PUT_LINE(Notes(idx));p_out := p_out || Notes(idx) || chr(10);に変更しました。また、私はPHP関数にanoter:cの変数を追加し、ocibindbyname($stid, 'c', $outVal, 300);を追加しました。

+0

この解決策のメモとして、chr(10)はSQL Developerでのみ動作します... PHPでは表示されません残念ながらそれは新しい行として。 – student0495

+0

'chr(10)'の代わりに 'chr(13)|| chr(10)'が必要でしょうか? – Boneist

+0

SQL Developerのchr(10)で十分ですが、私もchr(13)|| chr(10)を試しましたが、PHPで同じです(すべての結果が1行で表示されます) – student0495

関連する問題