С вчерашнего дня доступен для скачивания и патчевания SQL Developer версии 1.5.3
Скачивать целиком здесь. Патчить версию 1.5.1 можно прямо из девелопера: пункт меню Help -> Check for updates.
Я пропатчился - у меня слетели все сохраненные соединения. Правда я их восстановил без проблем. Но осадок остался.
Показаны сообщения с ярлыком oracle. Показать все сообщения
Показаны сообщения с ярлыком oracle. Показать все сообщения
12 дек. 2008 г.
26 нояб. 2008 г.
Составная форма
Вот этот вопрос на sql.ru сподвиг написать пример составной формы. Сам пример можно заценить здесь.
Суть в том, чтобы отдельные части сложных форм писать отдельно, как независимые пэйджи. А потом с помощью htmldb_Get эти части аккумулировать в одном месте. Получается эдакий эффект фрэймов.
Более того, этот приём очень эффективен, если нужно ообновить только какую-то часть страницы, а не перегружаться полностью. Собственно ajax в действии.
Добавлю еще, что если у вас на такой аггрегированной странице какой-нибудь из встроенных PPR репортов использует pagination (переход по страницам отчета) или сортировку, то они не будут работать корректно. Чтобы исправить ситуацию нужно на главной странице переопределить javascript функцию $a_report.
Обратите внимание в скрипте на "СЮДА_НУЖНО_ПОДСТАВИТЬ_НОМЕР_ПЭЙДЖА". Там должен быть номер страницы, которая содержит PPR отчет, в котором должен работать pagination. Естественно лучше туда этот номер подставить динамически, например функцией $s.
Напоминаю, PPR отчет - это отчет в котором рефреш страницы и сортировка происходят при помощи ajax, т.е. без полной перерисовки страницы.
Суть в том, чтобы отдельные части сложных форм писать отдельно, как независимые пэйджи. А потом с помощью htmldb_Get эти части аккумулировать в одном месте. Получается эдакий эффект фрэймов.
Более того, этот приём очень эффективен, если нужно ообновить только какую-то часть страницы, а не перегружаться полностью. Собственно ajax в действии.
Добавлю еще, что если у вас на такой аггрегированной странице какой-нибудь из встроенных PPR репортов использует pagination (переход по страницам отчета) или сортировку, то они не будут работать корректно. Чтобы исправить ситуацию нужно на главной странице переопределить javascript функцию $a_report.
function $a_report(G,D,F,C,A){
lThis=$u_js_temp_drop();
var B=$x("report_"+G+"_catch");
B.id="report_"+G+"_catch_old";
var E="p="+$v("pFlowId")+":"+СЮДА_НУЖНО_ПОДСТАВИТЬ_НОМЕР_ПЭЙДЖА+":"+$v("pInstance")+":FLOW_PPR_OUTPUT_R"+G+"_";
if(!!A){
E+=A+"::RP&fsp_region_id="+G}
else{
E+="pg_R_"+G+":NO&pg_max_rows="+F+"&pg_min_row="+D+"&pg_rows_fetched="+C}
var H=new htmldb_Get(null,null,null,null,null,"f",E);
var I=H.get();
lThis.innerHTML=I;
B.innerHTML=$x("report_"+G+"_catch").innerHTML;
B.id="report_"+G+"_catch";
lThis.innerHTML="";
return
}
Обратите внимание в скрипте на "СЮДА_НУЖНО_ПОДСТАВИТЬ_НОМЕР_ПЭЙДЖА". Там должен быть номер страницы, которая содержит PPR отчет, в котором должен работать pagination. Естественно лучше туда этот номер подставить динамически, например функцией $s.
Напоминаю, PPR отчет - это отчет в котором рефреш страницы и сортировка происходят при помощи ajax, т.е. без полной перерисовки страницы.
23 нояб. 2008 г.
Крэкс, фэкс, пэкс или архитектура приложений под Oracle
Хотел написать полноценную статью, но из-за загруженности решил, что лучше уж напишу заметку, чем вообще ничего. Итак...
Если у вас стоит задача написания нового приложения с использованием базы данных Oracle, то естественно возникает и вопрос: на чем его писать и, соответственно, какую архитектуру приложения выбрать.
Конечно, для некоторых команд этот вопрос может быть заведомо решен - пишем на Java, .Net, Forms... и так далее. Список огромный - каждый выбирает по вкусу, или точнее то, чем владеет. Относительно с недавних пор всё больше разработок ведется на Apex. Отличный инструмент, но и не лишен некоторых недостатков. Ну и совсем свежачок - Flex. Вот на счет последних двух и хотелось написать. Собственно, заклинание из заголовка статьи немного созвучно набору технологий Apex, Flex, Ajax.
Для начала Apex. Инструмент простой, но очень эффективный. В принципе, позволяет создавать web приложения любой сложности. При этом избавляет от значительной части рутинной работы. Архитектура Apex приложений по сути проста – база данных сама генерирует html контент. Т.е. никаких специфических средних звеньев не требуется, если не брать в расчет web сервер (встроенный либо нет). И само приложение всё хранится в таблицах базы данных. А дальше идут недостатки, обусловленные как раз такой архитектурой. Неудобство разработки внутри html приложения, отсутствие нормальной версионности файлов, сложность вклиниться во внутренние механизмы рендеринга страниц – особенно критично в случаях, когда вы строите приложение сильно отличающееся от стандартных шаблонов. Опять же рендеринг создаёт дополнительную нагрузку на базу, хотя я и не сталкивался пока с серьезными проблемами по этой части, но тем не менее.
А теперь Flex. Очень богатые интерфейсные возможности при минимуме усилий. Можно создавать полноценные десктоп приложения. Разработка ведется вполне классическим способом, с поддержкой всевозможных сопутствующих систем версионности и т.д. Короче, конфетка! Но есть и «но». Flex общается с базами данных посредством web или http сервисов. Еще вроде Adobe предлагает Data Services, middle tire компонент для взаимодействия с базами данных, но я этим вопросом вплотную не занимался, потому как мне не интересен вариант использования дополнительного звена между приложением и базой, да ещё и java based.
Но во Flex очень просто реализуется взаимодействие приложения с javascript страницы, в которую он встроен. Причем это взаимодействие работает в обе стороны: javascript может вызывать методы flex приложения, и flex может вызвать любую внешнюю javascript функцию. Собственно в этом вся и соль – встроить Flex приложение внутрь Apex. Сам Apex при этом выполняет функции доставки данных, контроля доступа, управления сессиями, а Flex в свою очередь выполняет функции клиентского приложения.
То есть получается приложение, интерфейс которого полностью сделан во Flex. Такие вещи как авторизация, жизненный цикл сессий и транзакций управляется Apex. Вся логика обработки данных лежит в базе. Apex перестаёт создавать дополнительную нагрузку, поскольку он уже не рендерит страницы (Flex приложение грузится разом).
Чем не идеальная архитектура? И главное, ничего лишнего и всё бесплатно :)
Подумайте, может оно того стоит! Я кстати уже опробовал - мне понравилось.
Если у вас стоит задача написания нового приложения с использованием базы данных Oracle, то естественно возникает и вопрос: на чем его писать и, соответственно, какую архитектуру приложения выбрать.
Конечно, для некоторых команд этот вопрос может быть заведомо решен - пишем на Java, .Net, Forms... и так далее. Список огромный - каждый выбирает по вкусу, или точнее то, чем владеет. Относительно с недавних пор всё больше разработок ведется на Apex. Отличный инструмент, но и не лишен некоторых недостатков. Ну и совсем свежачок - Flex. Вот на счет последних двух и хотелось написать. Собственно, заклинание из заголовка статьи немного созвучно набору технологий Apex, Flex, Ajax.
Для начала Apex. Инструмент простой, но очень эффективный. В принципе, позволяет создавать web приложения любой сложности. При этом избавляет от значительной части рутинной работы. Архитектура Apex приложений по сути проста – база данных сама генерирует html контент. Т.е. никаких специфических средних звеньев не требуется, если не брать в расчет web сервер (встроенный либо нет). И само приложение всё хранится в таблицах базы данных. А дальше идут недостатки, обусловленные как раз такой архитектурой. Неудобство разработки внутри html приложения, отсутствие нормальной версионности файлов, сложность вклиниться во внутренние механизмы рендеринга страниц – особенно критично в случаях, когда вы строите приложение сильно отличающееся от стандартных шаблонов. Опять же рендеринг создаёт дополнительную нагрузку на базу, хотя я и не сталкивался пока с серьезными проблемами по этой части, но тем не менее.
А теперь Flex. Очень богатые интерфейсные возможности при минимуме усилий. Можно создавать полноценные десктоп приложения. Разработка ведется вполне классическим способом, с поддержкой всевозможных сопутствующих систем версионности и т.д. Короче, конфетка! Но есть и «но». Flex общается с базами данных посредством web или http сервисов. Еще вроде Adobe предлагает Data Services, middle tire компонент для взаимодействия с базами данных, но я этим вопросом вплотную не занимался, потому как мне не интересен вариант использования дополнительного звена между приложением и базой, да ещё и java based.
Но во Flex очень просто реализуется взаимодействие приложения с javascript страницы, в которую он встроен. Причем это взаимодействие работает в обе стороны: javascript может вызывать методы flex приложения, и flex может вызвать любую внешнюю javascript функцию. Собственно в этом вся и соль – встроить Flex приложение внутрь Apex. Сам Apex при этом выполняет функции доставки данных, контроля доступа, управления сессиями, а Flex в свою очередь выполняет функции клиентского приложения.
То есть получается приложение, интерфейс которого полностью сделан во Flex. Такие вещи как авторизация, жизненный цикл сессий и транзакций управляется Apex. Вся логика обработки данных лежит в базе. Apex перестаёт создавать дополнительную нагрузку, поскольку он уже не рендерит страницы (Flex приложение грузится разом).
Чем не идеальная архитектура? И главное, ничего лишнего и всё бесплатно :)
Подумайте, может оно того стоит! Я кстати уже опробовал - мне понравилось.
13 окт. 2008 г.
SQL Developer Data Modeling
Свершилось. Вышла первая Early Adopter версия SQL Developer Data Modeling - инструмента для проектирования er-диаграмм.
Качаем, устанавливаем, пробуем. Ну и пишем отзывы и впечатления.
Моё имхо - не очень. Оно конечно работает, и есть много всяких возможностей, но для меня с ходу показалась неудобной и тормозючей. Вобщем, это не моя мечта :)
Качаем, устанавливаем, пробуем. Ну и пишем отзывы и впечатления.
Моё имхо - не очень. Оно конечно работает, и есть много всяких возможностей, но для меня с ходу показалась неудобной и тормозючей. Вобщем, это не моя мечта :)
8 окт. 2008 г.
22 сент. 2008 г.
Новости и сплетни
Где-то далеко-далеко началась Oracle Open World 2008. Видимо из-за этого маститые блоггеры почти ничего не пишут уже больше месяца - готовились, видать. Чтож, будем ждать новостей с того берега океана.
А пока еще одна новость - металинк теперь по умолчанию имеет flex интерфейс. Меньше месяца назад я предполагал, что оракл торопится запустить новую версию как раз к открытию OOW 2008, и оказался прав :)
Ну а дальше сплетни из недостоверных источников. Apex 3.2, как известно, будет уметь мигрировать приложения oracle forms. Так вот эта самая миграция будет возможна двумя способами и оба будут весьма ограничены. Один будет генерить обычные апекс-веб-интерфейсы, а второй будет генерить флэш (возможно это будет флэкс?). Вот это для меня честно говоря удивило. Других изменений в этой версии не ожидается.
А вот версия apex 4 должна будет иметь гораздо больше новых вкусных функциональных возможностей. И выпуск этой версии предполагается до конца этого года! Я так думаю будет некоторая задержка, но видимо ждать осталось недолго.
Но повторюсь: последние 2 новости - это всего лишь сплетни, так что ни за что не ручаюсь.
А пока еще одна новость - металинк теперь по умолчанию имеет flex интерфейс. Меньше месяца назад я предполагал, что оракл торопится запустить новую версию как раз к открытию OOW 2008, и оказался прав :)
Ну а дальше сплетни из недостоверных источников. Apex 3.2, как известно, будет уметь мигрировать приложения oracle forms. Так вот эта самая миграция будет возможна двумя способами и оба будут весьма ограничены. Один будет генерить обычные апекс-веб-интерфейсы, а второй будет генерить флэш (возможно это будет флэкс?). Вот это для меня честно говоря удивило. Других изменений в этой версии не ожидается.
А вот версия apex 4 должна будет иметь гораздо больше новых вкусных функциональных возможностей. И выпуск этой версии предполагается до конца этого года! Я так думаю будет некоторая задержка, но видимо ждать осталось недолго.
Но повторюсь: последние 2 новости - это всего лишь сплетни, так что ни за что не ручаюсь.
18 сент. 2008 г.
Документация Apex
С сайта оракла пропала вся документация по Apex. Уж не знаю что они там делают, но вообще последнее время бесят страшно! Оракловые вебы - это какое-то сплошное недорозумение.
Для тех кому критично нужно глянуть что-то в доке и нет локальной копии (как у меня), нашел какое-то зеркало здесь.
Для тех кому критично нужно глянуть что-то в доке и нет локальной копии (как у меня), нашел какое-то зеркало здесь.
16 сент. 2008 г.
Apex. NTLM. XE.
.. и розачарованию моему не было предела!
NTLM аутентификация работать в XE не будет. Ровно как и в 11g с использованием Embedded HTTP Server (aka XMLDB).
Вот соответсвующая строчка в документации:
Unlike mod_plsql, the embedded gateway connects to the database as the special user ANONYMOUS, but accesses database objects with the user privileges assigned to the DAD. The database rejects access if the browser user attempts to connect explicitly with the HTTP Authorization header.
Для тех же, кто использует mod_plsql, инструкция по использованию NTLM лежит здесь
NTLM аутентификация работать в XE не будет. Ровно как и в 11g с использованием Embedded HTTP Server (aka XMLDB).
Вот соответсвующая строчка в документации:
Unlike mod_plsql, the embedded gateway connects to the database as the special user ANONYMOUS, but accesses database objects with the user privileges assigned to the DAD. The database rejects access if the browser user attempts to connect explicitly with the HTTP Authorization header.
Для тех же, кто использует mod_plsql, инструкция по использованию NTLM лежит здесь
8 сент. 2008 г.
Apex. Экспорт отчетов.
Как реализовать экспортов отчетов в word, excel и иже своими силами.
Общая идея:
1. Создать таблицу с полем BLOB, куда будут генериться отчеты.
2. Создать OnDemand процесс, который будет из APEX_APPLICATION_PAGE_REGIONS выдергивать запрос для отчета. На основе этого запроса сгенерить xml данные. К этим данным применить xslt stylesheet и результат записывать в созданную до этого таблицу.
3. Написать javascript, который запустит этот процесс, а потом запустит на скачивание сформированный документ.
Ниже приводится "рыба". Понятно, что в итоге можно получить очень гибкую систему, позволяющую иметь полный контроль над выводом отчетов с помощью xslt.
Рабочий пример находится здесь: http://apex.oracle.com/pls/otn/f?p=33753:1:0
Итак, создаем таблицу и последовательность для первичного ключа:
Функции:
В приложении создадим три айтема уровня приложения: TEMP_ITEM_1, TEMP_ITEM_2, TEMP_ITEM_3
И OnDemand процесс:
Дальше финт ушами: нужно мастером создать форму на основе таблицы BREPORTS.Обозначить первичный ключ ID, источник ключа Existing trigger. Из колонок выбрать только BREPORT и не создавать никаких кнопок типа delete и update... В созданной странице (пусть это будет PAGE 2), нужно зайти в свойства айтема P2_BREPORT (типа File Browse) и изменить свойство Source на BREPORT:MIMETYPE:FILENAME::CHARSET:attachment:Download. Это нужно для работы функции apex_util.get_blob_file_src в OnDemand процессе: там параметр 'P2_BREPORT' - имя айтема File Browse на этой форме.
Теперь на странице с отчетом нужно в header вписать скрипт:
И последнее, в области отчета создать элемент Display as Text (does not save state) у которого source =
Здесь внимание: 'Report' - это имя region'а c отчетом.
Собственно всё.
Общая идея:
1. Создать таблицу с полем BLOB, куда будут генериться отчеты.
2. Создать OnDemand процесс, который будет из APEX_APPLICATION_PAGE_REGIONS выдергивать запрос для отчета. На основе этого запроса сгенерить xml данные. К этим данным применить xslt stylesheet и результат записывать в созданную до этого таблицу.
3. Написать javascript, который запустит этот процесс, а потом запустит на скачивание сформированный документ.
Ниже приводится "рыба". Понятно, что в итоге можно получить очень гибкую систему, позволяющую иметь полный контроль над выводом отчетов с помощью xslt.
Рабочий пример находится здесь: http://apex.oracle.com/pls/otn/f?p=33753:1:0
Итак, создаем таблицу и последовательность для первичного ключа:
create table breports(
id number(10) constraint pk_breports primary key,
breport blob,
mimetype varchar2(30),
filename varchar2(255),
charset varchar2(10),
created_by varchar2(30),
created_on date default sysdate
)
/
create sequence s_breports start with 1 increment by 1 maxvalue 9999999999
/
Функции:
-- Вспомогательная функция для конвертации в BLOB
create or replace function clob_to_blob(c in clob ) return blob is
pos pls_integer := 1;
buffer raw( 32767 );
res blob;
lob_len pls_integer := dbms_lob.getlength( c );
begin
dbms_lob.createtemporary(res, true);
dbms_lob.open(res, dbms_lob.lob_readwrite);
loop
buffer := utl_raw.cast_to_raw( dbms_lob.substr( c, 16000, pos));
if utl_raw.length( buffer ) > 0 then
dbms_lob.writeappend( res, utl_raw.length( buffer ), buffer );
end if;
pos := pos + 16000;
exit when pos > lob_len;
end loop;
return res; -- res is open here
end clob_to_blob;
/
-- функция экспорта отчета
create or replace
function export_report(p_app number, p_page number, p_region varchar2) return number as
l_query clob;
l_str varchar2(4000);
l_stylesheet xmltype := xmltype('<?xml version="1.0" ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><body><table><tr><xsl:for-each select="./ROW[1]/*"><xsl:call-template name="header"/></xsl:for-each></tr><xsl:apply-templates select="ROW"/></table></body></html></xsl:template><xsl:template match="ROW"><tr><xsl:for-each select="./*"><xsl:call-template name="data"/></xsl:for-each></tr></xsl:template><xsl:template name="header"><td><xsl:value-of select="name(.)"/></td></xsl:template><xsl:template name="data"><td><xsl:value-of select="text()"/></td></xsl:template></xsl:stylesheet>');
l_mimetype varchar2(30) := 'application/msword';
l_filename varchar2(30);
l_charset varchar2(30) := 'UTF8';
l_created_by varchar2(30) := v('APP_USER');
l_ln number;
l_null varchar2(30);
begin
select region_source into l_query
from APEX_APPLICATION_PAGE_REGIONS
where application_id = p_app
and page_id = p_page
and region_name = p_region;
select s_breports.nextval into l_ln from dual;
l_filename := 'report_'||to_char(l_ln)||'.doc';
l_str := 'insert into breports (id, breport, mimetype, filename, charset, created_by)
select '||to_char(l_ln)||', clob_to_blob(xmltransform(d,s).getclobval()), '''||l_mimetype||''', '''||l_filename||''', '''||l_charset||''', '''||l_created_by||''' from (select xmlagg(column_value) d from table(xmlsequence(cursor('||l_query||')))) xd, (select xmltype('''||l_stylesheet.getclobval()||''') s from dual) xs';
execute immediate l_str using l_null;
commit;
return l_ln;
exception
when no_data_found
then return 0;
end export_report;
В приложении создадим три айтема уровня приложения: TEMP_ITEM_1, TEMP_ITEM_2, TEMP_ITEM_3
И OnDemand процесс:
declare
l_ret number;
begin
l_ret := export_report(:TEMP_ITEM_1, :TEMP_ITEM_2, :TEMP_ITEM_3);
htp.p(apex_util.get_blob_file_src('P2_BREPORT', l_ret));
end;
Дальше финт ушами: нужно мастером создать форму на основе таблицы BREPORTS.Обозначить первичный ключ ID, источник ключа Existing trigger. Из колонок выбрать только BREPORT и не создавать никаких кнопок типа delete и update... В созданной странице (пусть это будет PAGE 2), нужно зайти в свойства айтема P2_BREPORT (типа File Browse) и изменить свойство Source на BREPORT:MIMETYPE:FILENAME::CHARSET:attachment:Download. Это нужно для работы функции apex_util.get_blob_file_src в OnDemand процессе: там параметр 'P2_BREPORT' - имя айтема File Browse на этой форме.
Теперь на странице с отчетом нужно в header вписать скрипт:
<script language="JavaScript" type="text/javascript">
function exportReport(pApp, pPage, pRegion){
var get = new htmldb_Get(null,$x('pFlowID').value,'APPLICATION_PROCESS=EXPORT_REPORT',1);
get.add('TEMP_ITEM_1', pApp);
get.add('TEMP_ITEM_2', pPage);
get.add('TEMP_ITEM_3', pRegion);
gRet = get.get(null);
get = null;
open(gRet, '_parent');
}
</script>
И последнее, в области отчета создать элемент Display as Text (does not save state) у которого source =
<a href="javascript:exportReport(&APP_ID.,&APP_PAGE_ID., 'Report')">Export to Word</a>
Здесь внимание: 'Report' - это имя region'а c отчетом.
Собственно всё.
5 сент. 2008 г.
4 сент. 2008 г.
Хромированный Apex
Тут на днях наделал шуму выпуск гуглом нового браузера Chrome. Оставлю за кадром свои личные пристрастия к браузером, а отмечу лишь то, ради чего можно установить этот браузер разработчикам приложений на Oracle Apex.
1. Создание ярлыков приложений. Эта функция позволяет создать на рабочем столе ярлык, который запустит апекс приложение без всяких лишних браузеровских меню и панелей. Удобно например создать ярлык для Application Builder'а:

2. Растягивающиеся textarea! Наверное самая "вкусная" фича при разработке в апексе. В Firefox для этого приходилось устанавливать Apex Builder plugin.

3. Встроенный оттладчик html/javascript/css - Chrome Inspector. Собственно местная альтернатива Firebug:

В целом для разработки вполне пригоден без лишней плагиноустановки. Неплохой ход от гугла.
1. Создание ярлыков приложений. Эта функция позволяет создать на рабочем столе ярлык, который запустит апекс приложение без всяких лишних браузеровских меню и панелей. Удобно например создать ярлык для Application Builder'а:

2. Растягивающиеся textarea! Наверное самая "вкусная" фича при разработке в апексе. В Firefox для этого приходилось устанавливать Apex Builder plugin.

3. Встроенный оттладчик html/javascript/css - Chrome Inspector. Собственно местная альтернатива Firebug:

В целом для разработки вполне пригоден без лишней плагиноустановки. Неплохой ход от гугла.
2 сент. 2008 г.
Custom authentication Apex
Долгое время собирался написать сам, но за неимением времени лучше дам ссылку на хорошую заметку, как реализовать свою аутентификацию для приложения Apex. Ничего сложного. Таблица с пользователями и паролями + пакет для управления. Читать здесь.
29 авг. 2008 г.
Вышел патчсет 3.1.2 для Apex
Новость не особо радостная, но всё же. Вышел патчсет для апекса. Доступен как в виде полной инсатляции Apex 3.1.2, так и в виде патчсета для 3.1.1 (MetaLink Patch Number 7313609).
В списке фикснутых багов с ходу не увидел багу, с которой недавно столкнулся, но подробно не исследовал. А именно, что если создать процесс уровня приложения с типом On New Session: After Authentication, то в нем то ли пременная APP_USER не устанавливается, то ли сам процесс не запускается. Времени потестить не было. Но факт, что это штуковина у меня с ходу не завелась :( Или я не умею её готовить? :)
В списке фикснутых багов с ходу не увидел багу, с которой недавно столкнулся, но подробно не исследовал. А именно, что если создать процесс уровня приложения с типом On New Session: After Authentication, то в нем то ли пременная APP_USER не устанавливается, то ли сам процесс не запускается. Времени потестить не было. Но факт, что это штуковина у меня с ходу не завелась :( Или я не умею её готовить? :)
27 авг. 2008 г.
Полный список текстовых сообщений APEX
select * from flows_020100.wwv_flow_messages$
Здесь есть все сообщения Апекс. Чтобы перевести или изменить их, достаточно в Shared Components -> Text Messages создать сообщение для языка вашего приложения с соответсвующим именем wwv_flow_messages$.name и вашим текстом.
Обновилась документация по Apex
Обращаю внимание, что на днях обновилась документация по Apex 3.1. Новый список книг находится вот здесь. Страница на otn пока еще старая.
Кроме того, что доку привели к формату как в 11g, так еще изменили немного структуру. Например Apex API теперь находятся не в User Guide, а имеют отдельный API Reference
Кроме того, что доку привели к формату как в 11g, так еще изменили немного структуру. Например Apex API теперь находятся не в User Guide, а имеют отдельный API Reference
20 авг. 2008 г.
Apex. Саморегистрация пользователей.
Задача на первый взгляд простая. Сделать на сайте регистрацию пользователей. Делов то: нарисовал public page c нужными полями да кнопкой, которая всё это дело отправит в хранимую процедуру, которая в свою очередь создаст пользователя в базе.
Вот с последним как раз может возникнуть вопрос: как создать пользователя в apex с помощью pl/sql. Начнем с того, что в приложениях апекс могут использоваться разные схемы аутентификации. От используемой схемы как раз и зависит решение.
Например, если используется аутентификация на основе "Database Accounts", то достаточно будет создать пользователя в базе данных
Никаких привилегий при этом давать пользователю не нужно. После того как апекс проверит существование пользователя и соответсвие пароля для этого пользователя в базе данных, сессия будет продолжаться под пользователем APEX_PUBLIC_USER (в общем случае :)) Недостатки способа - почти никаких, за исключением того что владелец схемы , в которой находится процедура создания пользователя, должна иметь привилегию CREATE USER. Ну и обработка ошибок и контроль существующих аккаунтов основаны на внутренних механизмах Oracle.
Если используется схема аутентификации Application Express, то тогда пара пользователь-пароль будет проверяться по внутреннему репозиторию Apex. Чтобы создать в нем пользователя можно использовать API-функцию APEX_UTIL.CREATE_USER
Но тут возникнет проблема с недостаточными привилегиями, потому как выполняться процедура будет под анонимным пользователем apex (страница регистрации то у нас PUBLIC). Обойти это можно, предварительно залогинив пользователя с административными привилегиями с помощью функции APEX_CUSTOM_AUTH.LOGIN. Только после создания пользователя нужно не забыть сделать APEX_CUSTOM_AUTH.LOGOUT.
В этом варианте есть одна неприятность: из-за выполнения LOGIN забивается весь дополнительный вывод htp, который делается для обработки результатов регистрации. Во всяком случае у меня этот глюк обойти не удалось в своё время. Как при этом обрабатывать ошибки регистрации - я без понятия :)
Ну и третий вариант, создать собственную схему аутенификации, над которой можно иметь полный контроль. В этом варианте у вас будет своя таблица с пользователями и паролями (можно зашифрованными), в которую при регистрации новых пользователей можно просто вставлять записи. Этот вариант самый предпочтительный. А как создать свою схему аутентификации напишу позже, там ничего сложного :)
Остальные схемы (SSO, LDAP, DAD..) я не рассматриваю, потому что ни разу не встречал и ничего толком о них пока не знаю.
Вот с последним как раз может возникнуть вопрос: как создать пользователя в apex с помощью pl/sql. Начнем с того, что в приложениях апекс могут использоваться разные схемы аутентификации. От используемой схемы как раз и зависит решение.
Например, если используется аутентификация на основе "Database Accounts", то достаточно будет создать пользователя в базе данных
execute immediate 'create user user_name identified by password';
Никаких привилегий при этом давать пользователю не нужно. После того как апекс проверит существование пользователя и соответсвие пароля для этого пользователя в базе данных, сессия будет продолжаться под пользователем APEX_PUBLIC_USER (в общем случае :)) Недостатки способа - почти никаких, за исключением того что владелец схемы , в которой находится процедура создания пользователя, должна иметь привилегию CREATE USER. Ну и обработка ошибок и контроль существующих аккаунтов основаны на внутренних механизмах Oracle.
Если используется схема аутентификации Application Express, то тогда пара пользователь-пароль будет проверяться по внутреннему репозиторию Apex. Чтобы создать в нем пользователя можно использовать API-функцию APEX_UTIL.CREATE_USER
Но тут возникнет проблема с недостаточными привилегиями, потому как выполняться процедура будет под анонимным пользователем apex (страница регистрации то у нас PUBLIC). Обойти это можно, предварительно залогинив пользователя с административными привилегиями с помощью функции APEX_CUSTOM_AUTH.LOGIN. Только после создания пользователя нужно не забыть сделать APEX_CUSTOM_AUTH.LOGOUT.
В этом варианте есть одна неприятность: из-за выполнения LOGIN забивается весь дополнительный вывод htp, который делается для обработки результатов регистрации. Во всяком случае у меня этот глюк обойти не удалось в своё время. Как при этом обрабатывать ошибки регистрации - я без понятия :)
Ну и третий вариант, создать собственную схему аутенификации, над которой можно иметь полный контроль. В этом варианте у вас будет своя таблица с пользователями и паролями (можно зашифрованными), в которую при регистрации новых пользователей можно просто вставлять записи. Этот вариант самый предпочтительный. А как создать свою схему аутентификации напишу позже, там ничего сложного :)
Остальные схемы (SSO, LDAP, DAD..) я не рассматриваю, потому что ни разу не встречал и ничего толком о них пока не знаю.
31 июл. 2008 г.
Flex наступает 2
Неожиданно скорое продолжение получает мой предыдущий пост о перспективах для разработчиков приложений под Oracle и, в частности, о нарастующей роли Flex'а в этой области.
На сколько я понял, вчера Oracle предложили попользовать новую версию сайта своей тех.поддержки, попросту новый Metalink. Я самого письма не видел - если не трудно, поделитесь кто-нить его текстом.
Вообще, я целиком и полностью за RIA приложения. Возможности интерфейсов на самом деле впечатляющие. А если вы пробовали еще и написать что-нибудь на Flex, то тем сильнее понимаете все его преимущества.

Итак, беглый осмотр нового металинка и... С виду неплохой дизайн. SCM работает вполне шустренько.И, о боже :) не работает ни один скролл (правда только в firefox, в IE всё в порядке)! Заметные задержки при открытии выпадающих списков. Ладно - в целом ничего, ничего критичного за исключением скроллов. Идем дальше.
Закладка Knowledge. Видимо реализована отдельным flex модулем, судя по скорости загрузки. Опять же заметные тормоза на прорисовке меню. Дальше переходим к какой-нибудь статье. Опять тормоза. Видимо подгрузка снова отдельного модуля Knowledge Browser? Поиск - тормоза на эффектах выползания результатов. Короче на лицо злоупотребление ненужными эффектами.
Очевидно, что есть попытка использовать deep linking, но опять же работает кое-где и кое-как. Запомнить линк на найденную статью сходу не получилось - запоминает только результат поиска.
На остальные закладки пока вообще можно не ходить - там либо подгружается "старый" html based интерфейс, либо попросту смотреть нечего.
Дальше здесь и здесь в отзывах задается вполне резонный вопрос: зачем flash для сайта тех.поддержки? Это вызывает дополнительные трудности при доступе из-за политик безопасности организаций и т.д.
Опять же привязка к версии flash player'а.
Тем более этов выглядит странно, что Oracle выкладывает заведомо неполноценную версию. Торопятся к Oracle Open World 2008? Так имхо как-то не совсем удачно.
Вообще flex сам по себе позволяет избежать постоянного рендеринга страниц и предоставляет серьезную отзывчивость интерфейсов. Т.е. теоритически, получив немного большие тормоза на первоначальной загрузке, пользователь должен насладиться всем богатсвом и удобством флекс приложения в действии. А весят эти приложения в общем-то не так и много. Так что не знаю, стоит ли заморачиваться по поводу траффика. Не жрут его они много сами по себе.
Еще замечу, что пока еще действующая apex-реализация металинка тоже не выделяется удобством пользования и скоростью работы. Видимо, что-то в "консерватории" не так :)
Вобщем, первые впечатления - легкое недоумение "зачем?" и тихая радость "будущее не за горами" :)
На сколько я понял, вчера Oracle предложили попользовать новую версию сайта своей тех.поддержки, попросту новый Metalink. Я самого письма не видел - если не трудно, поделитесь кто-нить его текстом.
Вообще, я целиком и полностью за RIA приложения. Возможности интерфейсов на самом деле впечатляющие. А если вы пробовали еще и написать что-нибудь на Flex, то тем сильнее понимаете все его преимущества.

Итак, беглый осмотр нового металинка и... С виду неплохой дизайн. SCM работает вполне шустренько.И, о боже :) не работает ни один скролл (правда только в firefox, в IE всё в порядке)! Заметные задержки при открытии выпадающих списков. Ладно - в целом ничего, ничего критичного за исключением скроллов. Идем дальше.
Закладка Knowledge. Видимо реализована отдельным flex модулем, судя по скорости загрузки. Опять же заметные тормоза на прорисовке меню. Дальше переходим к какой-нибудь статье. Опять тормоза. Видимо подгрузка снова отдельного модуля Knowledge Browser? Поиск - тормоза на эффектах выползания результатов. Короче на лицо злоупотребление ненужными эффектами.
Очевидно, что есть попытка использовать deep linking, но опять же работает кое-где и кое-как. Запомнить линк на найденную статью сходу не получилось - запоминает только результат поиска.
На остальные закладки пока вообще можно не ходить - там либо подгружается "старый" html based интерфейс, либо попросту смотреть нечего.
Дальше здесь и здесь в отзывах задается вполне резонный вопрос: зачем flash для сайта тех.поддержки? Это вызывает дополнительные трудности при доступе из-за политик безопасности организаций и т.д.
Опять же привязка к версии flash player'а.
Тем более этов выглядит странно, что Oracle выкладывает заведомо неполноценную версию. Торопятся к Oracle Open World 2008? Так имхо как-то не совсем удачно.
Вообще flex сам по себе позволяет избежать постоянного рендеринга страниц и предоставляет серьезную отзывчивость интерфейсов. Т.е. теоритически, получив немного большие тормоза на первоначальной загрузке, пользователь должен насладиться всем богатсвом и удобством флекс приложения в действии. А весят эти приложения в общем-то не так и много. Так что не знаю, стоит ли заморачиваться по поводу траффика. Не жрут его они много сами по себе.
Еще замечу, что пока еще действующая apex-реализация металинка тоже не выделяется удобством пользования и скоростью работы. Видимо, что-то в "консерватории" не так :)
Вобщем, первые впечатления - легкое недоумение "зачем?" и тихая радость "будущее не за горами" :)
28 июл. 2008 г.
Flash графики в Apex на полную мощность

Речь пойдет о построении графиков и диаграмм в Oracle Apex 3.1. Дело в том, что Apex для построения флэш графиков использует стороннюю компоненту AnyChart. Но для стандартных графиков используется AnyChart версии 3, в то время как intaractive reports строят графики с помощью AnyChart версии 4. Так вот эта самая четвертая версия выгодно отличается своим внешним видом от своей предшественницы.
Для сравнения галлерея AnyChart 3 и галлерея AnyChart 4 (или уже 5?). Замечу еще, что для AnyChart 4 требуется Flash Player версии 9 и выше, в то время как для AnyChart 3 достаточно Flash Player 8.
Итак, что мы имеем: Apex 3.1 с двумя встроенными компонентами для построения графиков и диаграмм. И к этому всему достаточно бедный интерфейс для их создания в самом апексе, да и то для устаревшей версии.
Будем исправлять ситуацию.
Для начала создадим Application Process типа OnDemand с именем GETDATA следующего содержания:
begin
htp.p('<anychart>
<settings>
<animation enabled="True"/>
</settings>
<charts>
<chart plot_type="CategorizedVertical">
<data_plot_settings default_series_type="Bar" enable_3d_mode="true" z_padding="0.2" z_aspect="0.8">
<bar_series point_padding="0" group_padding="0.2">
<tooltip_settings enabled="True"/>
</bar_series>
</data_plot_settings>
<chart_settings>
<title enabled="true">
<text>Multi-Series: Columns Clustered by Z-Axis</text>
</title>
<axes>
<y_axis>
<scale mode="Overlay"/>
<labels>
<format>{%Value}{numDecimals:0}</format>
</labels>
</y_axis>
</axes>
</chart_settings>
<data>
<series name="Series 1">
<point name="P1" y="22"/>
<point name="P2" y="34"/>
<point name="P3" y="16"/>
<point name="P4" y="32"/>
<point name="P5" y="68"/>
</series>
<series name="Series 2">
<point name="P1" y="23"/>
<point name="P2" y="45"/>
<point name="P3" y="46"/>
<point name="P4" y="86"/>
<point name="P5" y="45"/>
</series>
<series name="Series 3">
<point name="P1" y="25"/>
<point name="P2" y="56"/>
<point name="P3" y="67"/>
<point name="P4" y="32"/>
<point name="P5" y="27"/>
</series>
<series name="Series 4">
<point name="P1" y="33"/>
<point name="P2" y="29"/>
<point name="P3" y="56"/>
<point name="P4" y="49"/>
<point name="P5" y="77"/>
</series>
</data>
</chart>
</charts>
</anychart>
');
end;
Этот процесс всего лишь возвращает данные в виде xml, сформатированном для компоненты AnyChart. Формат xml можно подсмотреть в документации. Я для простоты взял готовый xml оттуда же. А в принципе, как раз на этом шаге можно моделировать график, исходя из своей фантазии и возможностей AnyChart, пользуясь исключительно знакомым pl/sql.
Дальше на странице, где будем "рисовать" график в поле HTML Header добавим:
<script type="text/javascript" src="/i/flashchart/js/AnyChart.js"></script>
И последнее. Создадим на странице HTML Region, в источнике которого пропишем:
<div id="chart1">
<script type="text/javascript" language="javascript">
var chart = new AnyChart('/i/flashchart/swf/AnyChart.swf');
var get = new htmldb_Get(null,$x('pFlowId').value,'APPLICATION_PROCESS=GETDATA',1);
gRet = get.get(null);
get = null;
chart.setData(gRet);
chart.write(chart1);
</script>
</div>
Вуаля! Посмотреть результат проделанного можно здесь - должно быть примерно то же самое что и на картинке в самом начале поста.
PS
Буду очень рад любым комментариям и поправкам к статье.
24 июл. 2008 г.
Очередной хостинг с Apex
22 июл. 2008 г.
Apex internal
Редко пользуюсь, поэтому всё время вылетает из головы следующая вещь. Если вы пользуетесь Oracle XE и сделали апгрэйд апекса до версии 3.1, то в форме логина, для того чтобы войти как администратор апекса, в поле Workspace нужно ввести INTERNAL. Пользователь соответсвенно ADMIN. Пароль тот, который задавали при установке Apex.
Кстати, недавно в блогах проскакивала новость, что вовсю идет работа над Apex 4.0. Что там будет "эдакого" пока неизвестно.
Кстати, недавно в блогах проскакивала новость, что вовсю идет работа над Apex 4.0. Что там будет "эдакого" пока неизвестно.
Подписаться на:
Сообщения (Atom)

