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. Кто-нибудь может мне с этим помочь?
У меня была та же проблема несколько дней назад, но мне было лень, и я прекратил искать решение, но сейчас я нашел решение.
Вместо процедуры я создал функцию, которая возвращает 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
После глубокого исследования я обнаружил, что на самом деле я не могу получить что-то от 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);
для этого.