пятница, 5 февраля 2010 г.

Application Express: использование TEXTAREA с возможностью изменения размера из фреймворка ExtJS

  1. Создать JavaScript-файл или добавить в Header Definition:
     function makeResizableTextAreas(){  
       var els=Ext.select("textarea",true);  
       els.each(function(el){  
        var dwrapped = new Ext.Resizable(el, {  
          wrap:true,  
          pinned:true,  
          handles:'e',  
          dynamic: true,  
          width:el.getWidth(),  
          height:el.getHeight(),  
          minWidth:el.getWidth(),  
          minHeight: el.getHeight()  
       });  
       })  
     }  
    
  2. Добавить в onload body вызов данной функции или использовать метод onReady фреймворка ExtJS:
     Ext.onReady(function(){  
       Ext.BLANK_IMAGE_URL = '/i/1px_trans.gif';  
       // Create namespace if doesn't already exist  
       Ext.namespace('Ext.ux');  
       //Здесь последовательность вызовов функций, например:  
       makeResizableTextAreas();  
     });  
    

понедельник, 1 февраля 2010 г.

Интеграция Oracle Application Express и ExtJS

ExtJS - одна из наиболее популярных и функциональных JavaScript-библиотек для разработки веб-приложений и пользовательских интерфейсов.

Инсталляция

  1. Скачать последнюю версию ExtJS - http://www.extjs.com/products/extjs/download.php
  2. Для EPG: открыть FTP-порт в XMLDB. Для этого зайти в SQL*Plus пользователем SYSTEM:
     SQL> exec dbms_xdb.setftpport('2100');  
     PL/SQL procedure successfully completed.  
     SQL> alter system register;  
     System altered.  
    
  3. Для EPG: распаковать дистрибутив extJS и загрузить его на ftp://server_adress:2100/i/themes/,где server_adress - хост сервера БД
  4. Для EPG: закрыть FTP-порт в XMLDB. Для этого зайти в SQL*Plus пользователем SYSTEM:
     SQL> exec dbms_xdb.setftpport('0');  
     PL/SQL procedure successfully completed.  
     SQL> alter system register;  
     System altered.  
    
  5. Для HTTP-Server: распаковать дистрибутив extJS в директорию /i/themes, где i - image-директория Apex

Использование extJS в Oracle APEX

  1. Home -> Application Builder -> Application 101 -> Shared Components -> Templates -> Edit Page Template
  2. Header Definition:
  3. Добавить следующий фрагмент кода в HTML Header:

  4. Добавить следующий фрагмент в HTML Body Attribute: onload="makeResizable();"
  5. Добавить элемент типа TEXTAREA.
  6. Изменить значение Edit Page -> Display Attributes -> Cursor Focus на «Do not focus cursor»
  7. Запустить данную страницу.

 

вторник, 2 июня 2009 г.

Пример простейшего MDB-компонента

Ниже пример MDB-компонента который слушает очередь (в этом примере jms/TestQueue) и выводит содержимое сообщения в лог-сервера:
 import javax.ejb.ActivationConfigProperty;  
 import javax.ejb.EJBException;  
 import javax.ejb.MessageDriven;  
 import javax.jms.Message;  
 import javax.jms.MessageListener;  
 import javax.jms.TextMessage;  
 @MessageDriven(  
 activationConfig = {  
 @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue") ,  
 @ActivationConfigProperty(propertyName="connectionFactoryJndiName",propertyValue="jms/JMSConnectionFactory"),  
 @ActivationConfigProperty(propertyName="destinationJndiName", propertyValue="jms/TestQueue")  
 }  
 ,mappedName="jms/TestQueue"  
 )  
 public class TestMDBBean implements MessageListener {  
   public void onMessage(Message message) {  
     try {  
       if (message instanceof TextMessage) {  
         TextMessage msg = (TextMessage)message;  
         System.out.println("Message arrived:");  
         System.out.println(msg.getText());  
         System.out.println("\n");  
       }  
     } catch (Exception e) {  
       throw new EJBException(e.toString());  
     }  
   }  
 }  

пятница, 10 апреля 2009 г.

Автономные транзакции

Обработка транзакций - главная обязанность программного механизма любой базы данных, и Oracle здесь не является исключением. Чтобы понять суть дела, давайте определим, что составляет транзакцию. В Oracle транзакция - это логическая единица работы, выполняемая между точками commit/rollback (фиксация/откат) одним или более SQL- (или PL/SQL-) предложениями. Это означает, что в программе, которая явно содержит предложение commit или rollback, все измененные в текущей транзакции данные будут или зафиксированы (commit) в базе, или будет произведен откат (rollback), и все изменения будут отменены.

Это может представить проблему при обработке ошибок, как проиллюстрировано ниже:
 CREATE OR REPLACE PROCEDURE p_update_employee  
 IS  
 BEGIN  
  -- ...  
  -- логика приложения  
  --  
  COMMIT;  
  --  
 EXCEPTION  
 WHEN OTHERS THEN  
  ROLLBACK;  
  INSERT INTO error_logs VALUES (20101, sqlerrm);  
  COMMIT;  
 END;  
 /  
В процедуре p_update_employee обращение к фразе WHEN OTHERS производится по любой ошибке Оracle. Цель - записать сообщение об ошибке в таблицу приложения, названную здесь error_logs. Поскольку мы хотим выделить ошибки, обнаруженные логикой приложения с указанием породивших их проблем, нам надо выполнить явный откат до задействования предложения INSERT, чтобы только затем последующий commit зафиксирует сообщение об ошибке. Такая реализация представляется несколько неуклюжей, поскольку программа реально включает в себя два процессных трека - логику приложения и регистрацию ошибок.
Автономная транзакция может разрешить эту проблему.

Автономная транзакция отделяется от начальной транзакции, создавая, тем самым, возможность для прикладной программы независимо фиксировать/откатывать (commit/rollback) свои транзакции.

Автономные транзакции должны быть объявлены с использованием фразы
PRAGMA AUTONOMOUS_TRANSACTION в PL/SQL-программе. Вот как выглядит декларация подпрограммы (routine), обрабатывающей ошибку:
 CREATE OR REPLACE PROCEDURE p_error(  
   i_error IN NUMBER,  
   i_text IN VARCHAR2)  
 IS  
  PRAGMA AUTONOMOUS_TRANSACTION;  
 BEGIN  
  INSERT INTO error_logs (error_code, error_text)   
   VALUES (i_error, i_text);  
  --  
  COMMIT;  
  --  
 END;  
 /  
Теперь процедура p_error работает независимо от вызываемой во время выполнения этой подпрограммы.
Вот пример, как мы можем "переделать" ("retool") подпрограмму p_update_employee:
 CREATE OR REPLACE PROCEDURE p_update_employee  
 IS  
  lx_test EXCEPTION;  
 BEGIN  
  -- ...  
  -- Логика приложения  
  --  
  RAISE lx_test;  
  --  
  COMMIT;  
  --  
 EXCEPTION  
 WHEN OTHERS THEN  
  ROLLBACK;  
  p_error(20101, sqlerrm);  
 END;  
 /  
Заметим, что в секции EXCEPTION фраза WHEN OTHERS вызывает откат (rollback) данных, измененных приложением, тогда как подпрограмма p_error вызывает фиксацию (commit) только, чтобы сохранить последнюю вставленную запись в журнал ошибок (error log).

Источник: Oracle Professional eXTRA #2.9, eNewsletter Autonomous Transactions

Количество изменённых записей

Пример процедуры:
 BEGIN  
   UPDATE emp e SET e.mgr=7698 WHERE e.job='SALESMAN';  
   dbms_output.put_line(sql%rowcount||' ROWS UPDATED');  
 END;  

Вывод:
 set serveroutput on  
 4 ROWS UPDATED