2
      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で表示する必要があるものを表示します。誰でもこれで私を助けることができますか?

4

2 に答える 2

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
于 2016-05-18T05:38:28.303 に答える
0

詳細な調査の結果、実際には dbms_output から何かを取得できないことがわかったので、問題に対する一種の解決策を作成しました。PL/SQLプロシージャにOUTパラメータを追加し、すべての結果を連結しました。改行を追加しchr(10)、オラクルでさまざまな行の結果をシミュレートしました。

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

于 2016-05-17T19:22:01.477 に答える