【问题标题】:get dbms output message from oracle in php在 php 中从 oracle 获取 dbms 输出消息
【发布时间】:2016-09-13 23:47:42
【问题描述】:
      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 中显示的内容。谁能帮我解决这个问题?

【问题讨论】:

  • 你为什么要这样做? DBMS_OUTPUT 通常仅用于临时消息 - 例如。出于测试目的 - 而不是将数据从一个系统传递到另一个系统的方法。如果我是你,我会研究 ref 游标 - 这是将数据从 select 语句传回调用代码的首选解决方案。
  • 嗯,需要一个快速的解决方案来将 pl/sql 过程与用户界面(像 html 页面这样简单的东西)集成在一起
  • 哦,我已经尝试过引用游标......
  • 你不能让引用光标方法工作吗?
  • 是的,我没有尝试过的代码(将其删除以尝试其他内容)

标签: php oracle plsql execute-immediate dbms-output


【解决方案1】:

几天前我也遇到了同样的问题,但我很懒惰,我不再寻找解决方案,但是,我现在找到了解决方案。

我创建了一个返回 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

【讨论】:

  • 我已经尝试过使用 ref 游标,我也会尝试您的解决方案。谢谢!
  • 完美运行!谢谢!
【解决方案2】:

经过深入研究,我发现我实际上无法从 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 函数中添加了另一个 :c 变量,并为它添加了ocibindbyname($stid, 'c', $outVal, 300);

【讨论】:

  • 作为此解决方案的说明,chr(10) 仅适用于 SQL Developer...在 PHP 中,不幸的是它不会将其显示为新行。
  • 也许您需要chr(13)||chr(10) 而不仅仅是chr(10)
  • 在 SQL Developer 中 chr(10) 就足够了,我也尝试过使用 chr(13)||chr(10),正如你所说,但在 PHP 中是一样的(所有结果一行显示)
  • 那是因为您的浏览器将其呈现为 HTML。换行符在 HTML 中没有任何意义。
  • 我已经考虑过了,只是希望如果我通过 php 从 oracle 传递它会起作用
猜你喜欢
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多