php - 在php中从oracle获取dbms输出消息

标签 php oracle plsql execute-immediate dbms-output

      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 中显示的内容。谁能帮我解决这个问题吗?

最佳答案

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

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

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

输出应如下所示:

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

关于php - 在php中从oracle获取dbms输出消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37283540/

相关文章:

regex - 匹配字符列表中的 PL/SQL 正则表达式破折号和括号

javascript - 您应该如何将密码从纯 html/javascript 应用程序发送到 php 页面?

php - youtube嵌入视频节目 “Video Unavailable”

php - 从 PHP 获取 MySQL 主键和外键约束?

sql-server - WAL序号无限大?

java - 使用本地过程将数据插入数据库或使用最近的框架(如 spring 或 Entity Framework )将数据插入数据库之间有什么区别吗?

sql - 循环更新数据库记录?

php - 使用 php ://filter 时向流过滤器添加过滤器参数

sql - 如何计算具有不同约束的同一张表的百分比

java - 如何使用 Blob 对象将大型原始 XML 文件写入 Oracle 数据库?