Коллекции в PL/SQL

15 Февраль 2011 Нет комментариев

Коллекции

Коллекцией называется упорядоченная группа элементов одного типа.

Язык PL/SQL поддерживает три вида коллекций

Плюсы использования коллекций

  • Кеширование статичной информации
  • Отслеживание элементов данных для спец.обработки
  • Хранение списков непосредственно в столбцах таблицы

 

Какой тип коллекций лучше использовать

  • Если необходимо использовать разреженный индексированный список, фактически подходит только один вариант — ассоциативный массив. Можно, конечно, и выделить память, и затем удалить элементы вложенной таблицы, соответствующей переменной, однако это неэффективно во всех случаях, кроме самых маленьких коллекций.

 


  • Если в PL/SQL-приложении требуется отрицательная индексация, необходимо использовать ассоциативные массивы.

  • Если используется Oracle Database 10g и считается полезным выполнять высокоуровневый набор операций с коллекциями, выберите вложенные таблицы вместо ассоциативных массивов.

  • Если надо потребовать ограничения количества строк коллекции, используйте VARRAY.

  • Если предполагается хранить большое количество постоянных данных в столбце таблицы в виде коллекции, вариант только один – это вложенная таблица. Тогда Oracle Database будет физически использовать отдельную таблицу для хранения коллекции, поэтому её рост ничем не ограничен.

  • Если требуется сохранить порядок элементов, хранимых в столбце коллекции, а набор данных предполагается небольшим, используйте VARRAY. Что значит «небольшой»? Это объём данных, размещаемых в одном блоке базы данных.

  • Вот несколько других параметров, когда VARRAY — массив переменной длины более предпочтителен: не надо беспокоиться об удалении данных из середины набора данных; данные имеют верхнюю границу индексирования; а также, если предполагается, главным образом, извлекать всю коллекцию целиком.

 

Псевдофункции коллекций

Читать дальше про “Коллекции в PL/SQL” »

Categories: oracle, SQL Tags: ,

Как узнать нужную версию JDeveloper для OA Framework

8 Февраль 2011 9 comments


Нота на металинке:

How to find the correct version of JDeveloper to use with eBusiness Suite 11i or Release 12.x [ID 416708.1]



Как определить версию OAF


Заходим на любую HTML страницу OEBS и кликаем по ссылке  О данной странице.
Переходим на вкладку Компоненты технологии

Query Region в OA Framework

25 Январь 2011 Нет комментариев


Используя Query Region (OAQueryBean) мы можем использовать различные виды поиска для таблицы.

Когда мы добавляем query region на страницу, OA Framework автоматически создает OAQueryBean связанный с дочерними Table, Advanced table или HGrid используя различные комбинации simple search, advanced search и view панелей.

Читать дальше про “Query Region в OA Framework” »

Personalization in Oracle Apps Framework

21 Январь 2011 Нет комментариев

Персонализация Oracle Application Framework (OAF) позволяет гибко настраивать любую OA Framework страницу.

Справка:Следует помнить, что страницы которые создаются динамически или элементы страницы добавленные программно и не описаны  в метаданных OA Extension, не могут быть персонализированы.

Первоначально страница строится на основе базовых метаданных. Это означает, что перед применением наших настроек, сначала применяются базовые настройки, и только после этого применяются наши. Базовые настройки страницы мы не можем менять или удалять, благодаря этому как бы мы не напортачили с нашими настройками, мы всегда можем их удалить и страница примет первоначальный вид.

Кастомную персонализацию мы можем выгружать в отдельный файл (или загружать из файла). Данный файл содержит не всю структуру метаданных страницы, а только отличия от базовых метаданных. Так же нашу персонализацию мы может отключать/включать при необходимости.

Читать дальше про “Personalization in Oracle Apps Framework” »

Список установленных патчей Oracle (OEBS)

14 Январь 2011 Нет комментариев

Для просмотра патчей Oracle E-Business Suite applications (OEBS) используем следующие 2 таблицы:

  • AD_APPLIED_PATCHES — список патчей, которые были применены напрямую
  • AD_BUGS — список всех патчей которые были применены напрямую или из набора



Пример запроса:

SELECT *
  FROM ad_bugs
 WHERE bug_number = 'patch_number';

SELECT *
  FROM ad_applied_patches
 WHERE patch_name = 'patch_number';

Разбор строки на числа с разделителем дробной части в виде точки

11 Январь 2011 Нет комментариев

Используя regexp_substr, получим дробные числа из строки.

SELECT regexp_substr(str, '([[:digit:]]+[.]{1}[[:digit:]]+)+', 1, level) str
FROM (
      SELECT ' 5646.45, 45 sd eds,.sd 9 2 566.11 12.3' str FROM dual) t
CONNECT BY 
 regexp_substr(str,'([[:digit:]][.]{1}[[:digit:]])+',1, level)  is not null;

STR
---------------------------------------
5646.45
566.11
12.3

Генерация DDL для объектов БД

11 Январь 2011 Нет комментариев

Начиная с Oracle 9i появился пакет DBMS_METADATA, который позволяет пользователям получать метаданные о любых объектах (таблицах, индексах, процедурах и т.д.) всего лишь за одно обращение.

1) GET_DDL — возвращает метаданные объъекта как DDL

SELECT object_type,
       object_name,
       dbms_metadata.get_ddl(object_type, object_name, owner) as ddl_code
  FROM dba_objects t
 WHERE t.object_type = 'TABLE'
   and rownum <= 10;

Читать дальше про “Генерация DDL для объектов БД” »

Просмотр количества открытых курсоров для сессий

23 Декабрь 2010 Нет комментариев

Узнать кто активно грузит базу большим количеством курсоров, можно следующим запросом

select a.value,
       s.program,
       s.username,
       s.sid,
       s.serial#,
       s.client_identifier
from v$sesstat  a, 
     v$statname b, 
     v$session  s
where a.statistic# = b.statistic#
      and s.sid = a.sid
      and b.name = 'opened cursors current'
order by 1 desc;

OAF: Правила разработки

No Правило/Причина
1 Всегда пытайтесь создать новый элемент декларативно (через персонализацию страницы). Определяйте программно, Только если невозможно создать декларативно.
Программно созданный элемент невозможно персонализировать, сложнее расширять и использовать.
2 Если вы создаёте новый элемент программно, Никогда не использовать конструктор

new OA*Bean(). Всегда использовать createWebBean.

Не все свойства элемента инициализируются корректно, когда используется конструктор new
3 Никогда не искать элемент по индексу, для изменения его свойств.
Индекс элемента может изменяться в процессе работы.
4 Никогда не изменять свойства элемента в processFormRequest(). Всегда изменять свойства в processRequest(). Любая информация, которая влияет на отображение элемента, должна быть добавлена в URL в виде параметра.
Гарантирует постоянное состояние при формировании страницы.
5 Никогда не изменяйте свойства родительского элемента из дочернего.
Эта плохая практика препятствует повторному использованию кода.
6 Для доступа к методу, имеющему разные версии [ например setText(String text) или setText(OAPageContext pageContext, String text)],  всегда используйте метод в котором присутствует параметр OAPageContext.
Обеспечивает наиболее безопасный способ изменения объекта.
7 Никогда программно не использовать неявную структуру созданную OA Framework.

Выполнять findChildRecursive() для поиска элементов.

Определённые элементы — defaultRenderers, PageLayoutBean, TableBean – создают добавочные объекты. Эти объекты могут меняться в разных версиях, вы не можете достоверно распарсить данную структуру.
8 Когда необходим доступ к Application module, использовать getApplicationModule(webBean) вместо getRootApplicationModule() там где это возможно.
Улучшает модульность и повторное использование.
9 При переходе на первую страницу определенного функционала, всегда использовать функцию меню, вместо прямой сслыки на страницу.
Позволяет изменять адресс назначения меняя только описание функции. Не требуется изменение и перекомпиляция кода.
10 Никогда не создавать программно OAFormBean.
Страница должна иметь только один OAFormBean и он определяется декларативно для региона pageLayout
11 Всегда устанавливать точность (размер) для всех колонок view objecs (VO).

Всегда указывать точность вызывая registerOutParameters.

Например: eсли не установить точность, то для колонки типа String размер по умолчанию 4KB.
12 Всегда использовать Oracle-style binding (:1, :2)  и не использовать JDBC style binding (?).
Это отменяет разбор SQL во время выполнения для замены строковых значений.
13 Всегда используйте спроектированные VO вместо динамических (программно созданных).
Динамические VO осуществляют дополнительный вызов для разбора запроса и возможный результат может иметь различные комбинации.
14 Никогда не рассчитывать, что Application module будет использовать одно соединение с БД для запросов.
Для быстродействия, Framework организует пул соединений и переиспользует их. Не держит одно соединение в течении жизни Application module.


Преобразование типов переменных в Java

8 Ноябрь 2010 4 comments


Каждое выражение в Java имеет тип, который определяется структурой выражения и типами составляющих его операндов (констант, переменных и методов). Иногда нам может потребоваться явное преобразование выражения в другой тип. Рассмотрим ряд способов преобразования:

Тип Конвертирование
STRING to NUMBER
byte Byte.parseByte(«123»)
byte Byte.valueOf(«123»).byteValue()
short Short.parseShort(«123»)
short Short.valueOf(«123»).shortValue()
int Integer.parseInt(«123»)
int Integer.valueOf(“123”).intValue()
long Long.parseLong(«123»)
long Long.valueOf(«123»).longValue()
float Float.parseFloat(«123.4»)
float Float.valueOf(«123.4»).floatValue()
double Double.parseDouble(«123.4e10»)
double Double.valueOf(«123.4e10»).doubleValue()
Number new Number(Integer.parseInt(«123»))
NUMBER to STRING
String “” + 123
String Number pageContext.getOANLSServcies().NumberToString(num,»###,###,##0.00000;-###,###,##0.00000″);
String int Integer.toString(123)
String double Double.toString(123.4e10)
String long Long.toString(123)
String float Float.toString(123.4)
STRING to DATE
Date String DATE_FORMAT = «dd-mm-yyyy»;

java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(DATE_FORMAT);

Date myDate =  sdf.parse(“01-10-2010”)

oracle.jbo.domain.Date java.sql.Date myDate = pageContext.getOANLSServcies().stringToDate(“01-10-2010”);

oracle.jbo.domain.Date date1 = new Date(myDate);

oracle.sql.DATE
                String lOriginalDate = "2014-05-15";
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                long lTime =  format.parse(lOriginalDate).getTime();
                java.sql.Timestamp t = new java.sql.Timestamp(lTime);
                oracle.sql.DATE    d = new oracle.sql.DATE(t);
oracle.sql.DATE
    public java.sql.Date getSQLDate(String s)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        java.util.Date d = null;
        java.sql.Date sd = null;
        try 
        {
            d = sdf.parse(s);
            sd = new java.sql.Date(d.getTime());
        }
        catch(Exception e) 
        {
            sd = null;
        }
        return sd; 
    }   
oracle.jbo.domain.Date to oracle.sql.DATE
oracle.sql.DATE
new oracle.sql.DATE( pJboDomainDate.timestampValue() ) 
STRING to DATE to STRING (NLS)
String
import oracle.apps.fnd.framework.OANLSServices;
...
String sEffectiveDate = "20-10-2014";
OANLSServices nls = am.getOADBTransaction().getOANLSServices();
String pEffectiveDate 
   = nls.dateToString((nls.stringToDate(sEffectiveDate))
                      , "dd/MM/yyyy"
                      , nls.getUserCalendar()
                     );