получить вывод dbms из оракула в стек переполнения

      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);
}

?>

Я пытаюсь отобразить сообщение в DBMS_OUPUT.PUT_LINE в браузере, используя PHP. Но это ничего не отображает. Код PL / SQL работает и отображает то, что он должен отображать в SQL Developer. Кто-нибудь может мне с этим помочь?

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
2

Другие решения

После глубокого исследования я обнаружил, что на самом деле я не могу получить что-то от dbms_output, поэтому я нашел своего рода решение моей проблемы. Я добавил параметр OUT в свою процедуру PL / SQL, где я объединил все свои результаты. Я добавил 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);, Также я добавил anoter: c variabile в свою функцию PHP и добавил ocibindbyname($stid, 'c', $outVal, 300); для этого.

0

По вопросам рекламы [email protected]