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中显示的内容。任何人都可以帮我这个吗?
答案 0 :(得分:2)
前几天我遇到了同样的问题,但我很懒,我不再寻找解决方案,但是,我现在找到了解决方案。
作为一个过程,我创建了一个返回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
答案 1 :(得分:0)
经过深入研究,我发现我实际上无法从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);
。我还添加了anoter:c变量到我的PHP函数并添加了ocibindbyname($stid, 'c', $outVal, 300);
。