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/