Ключевые слова:php, oracle, (найти похожие документы)
From: Довганюк Сергей <dovganuk_sergey@mail.ru.>
Newsgroups: email
Date: Mon, 25 Sep 2005 18:21:07 +0000 (UTC)
Subject: Написание PHP скрипта для построения отчета из Oracle
Как просто построить сложный отчет или Oracle, Excel, PHP и все, все, все.
Несколько лет назад, вначале становления нашей информационной среды на
основе СУБД Oracle, для отображения результатов отчета в Excel
использовалось простое внедрение SQL запроса на лист Excel.
Отчеты в виде простой таблицы были легко реализуемы, но подход имел
существенный недостаток - сложный отчет (много подитогов, сложное
форматирование) было очень тяжело реализовывать. Приходилось писать код
на VB.
Сложность отчетов росла и нам пришлось искать другой подход для
отображения отчетов в Excel. В итоге появилось следующее решение:
1) Макет отчета строится в Excel. При этом определяется его
форматирование, расположение на листе при печати и т.д.
2) Макет сохраняется в виде html файла (файл -> сохранить как Web
страницу). Как правило, сохраняется только текущая страница, что должно
быть указано в диалоге сохранения. Не всегда Excel воспроизводит
первоначальное форматирование документа (границы ячеек и т.д.) верно при
повторном открытии, впрочем, как и броузеры. Перед сохранением советую
предварительно просмотреть макет отчета в броузере (файл ->
предварительный просмотр Web страницы).
3) Далее нам нужно встроить код подучившейся html страницы в хранимую
процедуру которая отвечает за формирование отчета. Это будет иметь
примерно следующий вид (Oracle 8i):
CREATE OR REPLACE FUNCTION print_kniga (iKniga integer) RETURN html_string IS
...
R html_string := html_string();
...
BEGIN
...
R.extend; R(R.count) := '<html xmlns:o="urn:schemas-microsoft-com:office:office"';
R.extend; R(R.count) := 'xmlns:x="urn:schemas-microsoft-com:office:excel"';
R.extend; R(R.count) := 'xmlns="http://www.w3.org/TR/REC-html40">';
R.extend; R(R.count) := '<head>';
R.extend; R(R.count) := '<meta http-equiv=Content-Type content="text/html; charset=windows-1251">';
R.extend; R(R.count) := '<link rel=Original-File href="file:///C:/Мои%20документы/...">';
R.extend; R(R.count) := '<meta name=ProgId content=Excel.Sheet>';
...
return R;
END;
где html_string тип вида
CREATE OR REPLACE TYPE html_string AS TABLE OF VARCHAR(1000)
В случае с Oracle для быстрого дополнения html кода конструкциями языка
PL/SQL код html копировался в документ Word и производились замены:
а) заменялся символ ' на ''
б) заменялся символ ^p (знак абзаца) на последовательность ';^pR.extend;R(R.count) := '
в) первая строка html кода менялась вручную.
4) Для связки вывода хранимой процедуры с броузером или Excel
использовался Apache с PHP (5). На PHP был написан небольшой скрипт
(oracle.php) для придания результату работы хранимой процедуры вида
настоящей html страницы.
<?
if ($_GET["xls"] == 1) {
header("Content-type: application/vnd.ms-excel");
}
$conn = OCILogon($_GET["l"], $_GET["p"]);
$sql = "select * from table(cast(" . stripslashes($_GET["f"]) . " as html_string))";
if ($_GET["debug"] == 1) {
echo $sql;
}
$stmt = OCIParse($conn, $sql);
OCIExecute($stmt, OCI_DEFAULT);
While (OCIFetch($stmt)) {
echo OCIResult($stmt, 1) . "\n";
}
?>
Принцип работы скрипта прост.
URL имеет два вида
а) для броузера
http://www/oracle.php?l=login&p=password&f=stored_procedure_name(stored procedure params)
б) для Excel
http://www/oracle.php?xls=1&l=login&p=password&f= stored_procedure_name(stored procedure params)
5) Далее все просто, можно или просмотреть отчет в броузере или внедрить
его в лист Excel.
Метод применим для использования с любыми СУБД поддерживающими хранимые процедуры.
Скрипт может быть написан на любом, подходящем вам, языке.