2013-07-29

ORA-27086: skgfglk: unable to lock file - already in use

  1. remove */dbs/lkORACLE_SID file
  2. You will get an error like this
  3. ORA-00202: controlfile: '/oebs200/u01/oracle/PROD/testdata/cntrl01.dbf' ORA-27086: skgfglk: unable to lock file - already in use IBM AIX RISC System/6000 Error: 13: Permission denied on controlfiles and datafiles
  4. Copy (not move) controlfile and datafiles to new path
  5. Remove old files
  6. Restore old files from copied on step 3.

2013-07-18

Разное о Cognos

Чем Slicer от Detail Filter

Detail Filter может убирать строки из отчета, Slicer не убирает, а лишь изменяет данные в существующих ячейках

Параметры и фильтры

Тут показано, как делать параметры с автозапросом с multy и single выбором. На примере с выражением для slicer
[Great Outdoor Sales].[Sales Region].[Sales Region].[Country] -> ?c? -- параметр с Single выбором
set([Great Outdoor Sales].[Sales Region].[Sales Region].[Country] -> ?c?) -- параметр с Multy-выбором

Постраничный отчет в Cognos

Задача

Данные выводятся в Crosstab. Для каждого подразделения печатается своя таблица на отдельной странице. Список подразделений выбирает пользователь во время запуска отчета.

Как не получилось

Не получилось сделать Page Layers. На него получилось поместить только статичный объект, а как спрятать не выбранные пользователем страницы я так и не допер.

Как получилось сделать

Возможно, часть сделанных шагов избыточна

1. Создадим запрос и поместим на него DataItem, который будет содержать выбранные подразделения. Выражение для DataItem set([Пользовательский].[ЦПО].[ЦПО].[ЦПО] -> ?p_cpo?). Обзываем его, например, selected cpo

2. Добавляем List. Для него указываем свойства
  • Query - selected cpo
  • Rows per page - 1
  • Column Titles - Hide
3.  Создаем связь MasterDetail между Crosstab и запросом selected cpo. Выбираем объект Crosstab и кликаем по свойству Master Detail Relationships

4. Для того, что бы в заголовке отчета можно было добавить название подразделения указываем в свойстве Page запрос selected cpo и добавляем название подразделения.

5. Помещаем Crosstab внутрь List. Проверяем

Пока не удается избавиться от серой рамки вокруг crosstab (попробовал рисовать ее белым цветом, убирать, ставить Box Type в None.

2013-07-12

Cognos, конкатенация строк

В Cognos при конкатенации NULL операторами || и + получается пустая строка. Нормально конкатенирует только функция concat или ее аналогами

2013-07-10

Нововведения в 12с

1. Можно индексировать набор колонок, который уже проиндексирован. Судя по всему сделали для 24х7 при перестройки индексов, например с уникальных на неуникальные.

2. Появились колонки с автоинкрементом (Identity Columns). Можно указывать, когда вставлять значения:
GENERATED ALWAYS AS IDENTITY -- колонку вообще нельзя указывать в списке полей для INSERT
GENERATED BY DEFAULT AS IDENTITY -- колонку можно использовать в списке INSERT, вставится указанное значение, если оно не NULL (в этом случае будет сообщение об ошибке) GENERATED BY DEFAULT ON NULL AS IDENTITY -- колонку можно использовать в списке INSERT. Если указан NULL, то будет выбран следующий номер Identity Columns имеют ограничение NOT NULL. Работает быстрее триггеров. Подробнее

3. Возможность задавать в таблице значения по-умолчанию из sequence.nextval и sequence.currval (для вставки master-detail). Значения по умолчанию могут вставляться в случае, если в insert просто не указана колонка (DEFAULT) и в случае NULL значения (DEFAULT ON NULL). Подробнее

Вообще появилась возможность делать значения по-умолчанию в случае, если мы явно вставляем NULL в колонку.
Старое поведение, вставили NULL - получили NULL:
DROP TABLE def; CREATE TABLE def(a VARCHAR2(50), b VARCHAR2(10) DEFAULT 'x'); insert into def(a) values('a only'); insert into def(a, b) values('a, null', NULL); SELECT * FROM def; A B -------------------------------------------------- ---------- a only x a, null
Новая возможность -- NULL вставляется и при явном указании в INSERT NULL DROP TABLE def; CREATE TABLE def(a VARCHAR2(50), b VARCHAR2(10) DEFAULT ON NULL 'x'); insert into def(a) values('a only'); insert into def(a, b) values('a, null', NULL); SELECT * FROM def; A B -------------------------------------------------- ---------- a only x a, null x


4. invisible columns. Пока применения найти не удается http://tkyte.blogspot.com/2013/07/12c-silly-little-trick-with-invisibility.html

5. Возможность посмотреть полный текст SQL запроса при помощи dbms_utility.expand_sql_text с раскрытыми представлениями, правилами VPD. Можно использовать при запросах к V$ вьюхам http://tkyte.blogspot.com/2013/07/12c-sql-text-expansion.html

6. UTL_CALL_STACK -- новое формирование стека вызова. Подробнее


7. В Oracle 11 при добавлении колонки NOT NULL с указаным значением по умолчанию DEFAULT не вызывал изменения блоков таблицы, изменяя только метаданные. В Oracle 12 при добавлении любой (т.е. и NULL колонки) с указанным DEFAULT не вызывают изменения данных и поэтому стоят очень дешево. Подробнее в разделе Metadata-Only DEFAULT Values

8. Админская штучка: в один поток ОС можно засунуть несколько сессий Oracle. Полезно, если на сервере поднята куча инстансов. Подробнее

9. В With можно писать функции и процедуры на PL/SQL. Подробнее Так же функции можно создавать с PRAGMA UDF, такие функции нельзя использовать из pl/sql, но они быстро работают в sql

10. Появилась возможность постраничной выборки в SQL, например OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY. Подробнее

11. После CTAS и INSERT ... SELECT в пустую таблицу статистика собирается автоматически

12. Для табличных партиций и сабпартиций теперь можно указывать, создавать ли local индексы. Подробнее
Для глобальных индексов в партиционированных таблицах возможно удаление партиции без удаления индекса (об этом много написано у Richard Foot).

13. В SQL из PL/SQL можно использовать новые типы данных. Подробнее

14. Теперь можно грантовать пакеты, процедуры и функции другим пакетам. Такие пакеты невозможно будет вызвать из-вне. Пример
Так же можно делать GRANT TO program_unit. Сделано для того, что бы пользователю, вызывающему пакет с invoker rights не давать лишних привелегий. Подробнее
Вообще в этой версии с привелегиями достаточно много новых штук сделали.

15. Если поставить MAX_STRING_SIZE = extended, то SQL сможет использовать VARCHAR2 размером 32767.


16. Можно использовать конструкцию LATERAL, которая позволяет использовать в последующих подзапросах FROM результаты предыдущих подзапросов
SELECT a.object_name, b.object_type FROM (SELECT * FROM All_Objects WHERE ROWNUM <= 10) a, lateral(SELECT o.object_type FROM all_objects o WHERE o.object_id = a.object_id) b I_OBJ1 INDEX CLU$ TABLE I_COL3 INDEX I_UNDO1 INDEX I_CDEF4 INDEX BOOTSTRAP$ TABLE FILE$ TABLE I_CCOL2 INDEX I_FILE#_BLOCK# INDEX C_USER# CLUSTER 

То же самое можно сделать при помощи CROSS APPLY
SELECT a.object_name, b.object_type FROM (SELECT * FROM All_Objects WHERE ROWNUM <= 10) a CROSS APPLY (SELECT o.object_type FROM all_objects o WHERE o.object_id = a.object_id) b I_OBJ1 INDEX CLU$ TABLE I_COL3 INDEX I_UNDO1 INDEX I_CDEF4 INDEX BOOTSTRAP$ TABLE FILE$ TABLE I_CCOL2 INDEX I_FILE#_BLOCK# INDEX C_USER# CLUSTER

Конструкция OUTER APPLY помогает сделать похожий OUTER JOIN
SELECT a.object_name, a.object_type, b.tablespace_name FROM (SELECT * FROM All_Objects WHERE ROWNUM <= 10) a OUTER APPLY (SELECT o.tablespace_name FROM all_tables o WHERE o.table_name = a.object_name) b CLU$ TABLE SYSTEM FILE$ TABLE SYSTEM BOOTSTRAP$ TABLE SYSTEM I_OBJ1 INDEX C_USER# CLUSTER I_UNDO1 INDEX I_FILE#_BLOCK# INDEX I_COL3 INDEX I_CDEF4 INDEX I_CCOL2 INDEX
17. Можно перемещать файлы данных не выводя их в offline

18. Не смотрел подробнее: новый вид обновления материализованных представлений synchronous refresh

19. Новый способ проверить, есть ли у пользователя роль -- sys_context SYS_SESSION_ROLES:
SELECT sys_context('SYS_SESSION_ROLES', 'DBA') FROM dual; TRUE SELECT sys_context('SYS_SESSION_ROLES', 'DBA2') FROM dual; FALSE

20. Теперь планы могут меняться во время выполнения запроса. Сравнивая статистику. используемую при построени плана с реальным выполнением оптимизатор может на лету поменять, например, NESTED LOOPS на HASH JOIN.

21. Новые виды гистограмм для колонок с более чем 254 значениями.
Top frequency histograms -- если большинство значений (99%) в колонке приходятся на несколько значений. Гистограмма строится только по этим популярным значениям, непопулярные отбрасываются
Hybrid histogram -- height-based histogram в которых популярные значения попадают в табличку и одно и тоже значение не попадает более чем 1 раз

22. Статистика для GTT своя в каждой сессии.

23. Статистика, собранная dynamic sampling и adaptive cursor plan сохраняется в словаре (в предыдущих версиях хранилась в cursor cache)

24. Клонировать RMAN можно с базы-копии.

25. В RMAN можно просто без указания конструкции SQL выполнять SQL команды и даже запросы.

26. RMAN умеет восстанавливать отдельную таблицу или группу таблиц.

27. Temporal Validity. Документация. Кайт. Штука, которая позволяет в таблице указывать колонки, в которых хранятся сроки начала и окончания действия записи. Для получения актуальной на дату записи пользоваться в запросом с конструкцией AS OF PERIOD FOR или пакетом DBMS_FLASHBACK_ARCHIVE.
Хотел протестировать эту штуку, да она не заработала. Потом нашел у Кайта  this feature currently is not supported/working with the pluggable database infrastructure. This is a temporary limitation


2013-06-03

Логгирование в oebs

Отладочную информацию можно писать так: fnd_file.put_names('test.log', 'test.out', '/usr/tmp'); fnd_file.PUT_LINE(fnd_file.LOG, 'test 1'); fnd_file.close; После выполнения этого блока в файлы появляются на сервере БД в папке /var/tmp/ т.к.
Text written by the stored procedures is first kept in temporary files on the database server, and after request completion is copied to the log and out files by the manager running the request

2013-04-12

Повторный импорт из gl_interface

Повторный импорт можно сделать скриптом: DECLARE req_num NUMBER; run_id NUMBER; BEGIN -- Указываем пользователя, от которого делается импорт fnd_global.APPS_INITIALIZE(user_id => 0 ,resp_id => 50301 ,resp_appl_id => 101); run_id:=gl_interface_control_pkg.get_unique_run_id; -- Важно указать английское название из gl_je_sources. Группу смотрим в gl_interface gl_interface_control_pkg.insert_row(2023, run_id, 'Transfer',--Тут английское 178697 /*group id*/); -- В gl_interface лежит русское имя source, надо переключить язык if FND_REQUEST.SET_OPTIONS(language => 'RUSSIAN') then req_num := fnd_request.submit_request( 'SQLGL' , 'GLLEZL' , 'Повторный импорт журнала' , NULL , FALSE , to_char(run_id) , 2023 , 'N' , NULL , NULL , 'N' , 'N' ); end if; END; / commit; После проверяем и постируем запрос ручками.

2013-04-11

Не виден пункт меню в web интерфейсе после добавления в OEBS

Если после добавления пункта меню его не видно в Web-интерфейсе, но видно в формсах, то надо почистить кеш: Functional administrator - Core Services - Caching framework Найти и очистить 2 компонента: MENU_ID_CACHE, MENU_INFO_CACHE

2013-01-22

Выбираем колонки в ls -l

ls -l | tr -s " "| cut -f1,3,8 -d" " total -rw-r--r-- root 09:22 -rw-r--r-- root 08:54 -rw-r--r-- root 09:24 drwxrwxr-x apptst 19:09 drwxrwxrwx oratst 14:30 -rw-r--r-- root 09:20

2012-10-17

OUI java runtime environment not found

OUI не использует переменные окружения, а использует указанные в файле oraparam.ini. При возникновении ошибки java runtime environment not found исправить переменную в этом файле.

Форматирование ошибки

В when others для логгирования ошибки использовать:
dbms_utility.format_error_stack || dbms_utility.format_error_backtrace

2012-09-13

Особенности привязки отчетов к Concurrent

concurrent.short_name = data definition.code

Форматирование чисел в BI Publisher

По мотивам sql.ru
Задача: отформатировать отчет BI Publisher, что бы тысячи разделялись пробелами. Материалы к размышлениям: Документация
Проблемы: описанным в документации методом в режиме предпросмотра отчета из Word разделитель был или никакой или запятая.
The grouping separator symbol used will be determined at runtime based on template locale.
Как задать template locale в ворде так и не нашел (хотя искал не очень долго). При печати их XML Publisher это (судя по всему) задается при регистрации шаблона. Но очень хотелось получить сформатированный отчет прямо в Ворде.

Решение: найдено в ссылке выше. Добавляем текстовое поле, куда вставляем <xsl:decimal -format="-format" decimal-separator="," grouping-separator=" " name="RUS_FORMAT" xdofo:ctx="begin"> Число, которое надо вывести форматированным, выводим так: <?format-number(LBO," ##0,00", "RUS_FORMAT")?> Еще один способ форматирования чисел <?xdoxslt:format_number(SALDO, 2, ' ', ',', $_XDOLOCALE)?>

2012-09-04

Добавление агента ODI в автозапуск Win

Начиная с 11 версии вместо человеческого добавления в качестве Win-сервиса, необходимо добавлять агента в opmn. Сам opmn устанавливался вместе с Hyperion, сервис был запущен. Предпринятые шаги:

1. Конфигурируем файл odiparams.bat.
  • Там нет ничего сложного, кроме процедуры encode для кодирования пароля от схемы master rep базы данных ODI. 
  • Случайно поменял и ODI_SUPERVISOR_ENCODED_PASS, но вроде ничего страшного не произошло. 
  • В качестве java home выбираем jdk вместо jrockit ODI_JAVA_HOME=C:\oracle\Middleware\jdk160_21 
2. Пробуем запустить агента через бат файл и из студии тестируем, что он работает.
3. Конфигурируем файл agentcreate.properties. Тут есть небольшая тонкость для win: или указываем нормальные слеши, или экранируем их. Порт JMX=PORTNO + 1000. Содержание файла такое:
ORACLE_ODI_HOME=C:\\oracle\\ODI
INSTANCE_HOME=C:\\oracle\\Middleware\\epmsystemWin\\httpConfig\\ohs
COMPONENT_TYPE=odiagent
COMPONENT_NAME=oraclediagent
ODI_MASTER_DRIVER=oracle.jdbc.OracleDriver
ODI_MASTER_URL=jdbc:oracle:thin:@192.168.0.189:1521:hyp
ODI_MASTER_USER=odi_masterrep
ODI_MASTER_ENCODED_PASS=hZyXmvEifIF.gucldqHYcy
ODI_SECU_WORK_REPO=WREP1
ODI_SUPERVISOR_ENCODED_PASS=ccfH9gtdg9lHsjtHT8mTQkGTnn
PORTNO=20910
JAVA_HOME=C:\\oracle\\Middleware\\jdk160_21
ORACLE_OPMN_HOME=C:\\oracle\\Middleware\\ohs
JMXPORTNO=21910
Хеши паролей скопированы из odiparams.bat

4. Конфигурируем odi_opmn_addagent.bat
if "%ODI_HOME%" == "" set ODI_HOME=C:\oracle\ODI
REM call "%ODI_HOME%\bin\odiparams.bat"

if "%OPMN_HOME%" == "" set OPMN_HOME=C:\oracle\Middleware\ohs
if "%INSTANCE_HOME%" == "" set INSTANCE_HOME=C:\oracle\Middleware\epmsystemWin\httpConfig\ohs

set CLASSPATH=C:\oracle\ODI\oracledi\agent\lib\odi-standalone-agent.jar;%OPMN_HOME%\opmn\lib\opmneditor.jar;C:\oracle\ODI\setup\manual\oracledi-sdk\oracle.odi-sdk-jse_11.1.1.jar
Судя по всему, переменные тут нужны только для того, что бы правильно выставить CLASSPATH, который в итоге я прописал руками

5. Добавляем инфу об агенте в opmn.xml указанного нами INSTANCE_HOME. Команда
odi_opmn_addagent.bat "agentcreate.properties".
6. Запускаем (если не запущен) нашего агента
opmnctl startproc ias-component=oraclediagent

7. Если что-то не заработало -- вычищаем агента. Для этого правим файл odi_opmn_deleteagent.bat По-моему тема таже самая -- правильно выставить CLASSPATH. что можно сделать и ручками
if "%OPMN_HOME%" == "" set OPMN_HOME=C:\oracle\Middleware\ohs
if [%3]==[] goto SYNTAXERROR
if not [%4]==[] goto SYNTAXERROR

set CLASSPATH=C:\oracle\ODI\oracledi\agent\lib\odi-standalone-agent.jar;%OPMN_HOME%\opmn\lib\opmneditor.jar;C:\oracle\ODI\setup\manual\oracledi-sdk\oracle.odi-sdk-jse_11.1.1.jar
Запускаем удаление
odi_opmn_deleteagent.bat "C:\\oracle\\Middleware\\epmsystemWin\\httpConfig\\ohs" "C:\oracle\Middleware\ohs" "oraclediagent"
Не проверял, надо ли тут экранировать косые, делал так, что бы заработало.

2012-09-03

Ошибки в oracle reports formula columns

При использовании в отчете formula column отчет все время выкидывал ошибку
REP-1401: 'cf_ounr_captionformula': Fatal PL/SQL error occurred.

1. В функциях отчета можно включить логгирование функцией SRW.MESSAGE(999, 'test')
2. При использовании текстовых formula column надо быть повнимательнее со свойством width :)

2012-08-31

dbms_stats.gather_table_stats ORA-20000: Unable to analyze TABLE, insufficient privileges or does not exist

exec dbms_stats.gather_table_stats('DWH', 'T') begin dbms_stats.gather_table_stats('DWH', 'T'); end; ORA-20000: Unable to analyze TABLE "DWH"."T", insufficient privileges or does not exist ORA-06512: at "SYS.DBMS_STATS", line 13046 ORA-06512: at "SYS.DBMS_STATS", line 13076 ORA-06512: at line 2
Проверьте, что табличное пространство TEMP
1. Существует
2. Ему есть куда расширяться

2012-08-29

Linux: /etc/hosts не используется

Если в домене кривые DNS сервера, а файл /etc/hosts правильно заполнен, но не используется, то надо поменять порядок разрешения. Для этого в файл /etc/host.conf включить строку
# Lookup names in host file and then check DNS order bind,hosts