четверг, 7 февраля 2013 г.

INSERT ... SELECT ... [sequence] ... GROUP BY

Встретился с такой задачей:
нужно в Таблицу_1 вставить сгруппированные значения из Таблицы_2 и одновременно присвоить каждой новой записи в Таблице_1 порядковый номер (sequence)

Пример:
insert into UserOrg(id,access_mode,org_id,sysuser_id)
select
userorg_seq.nextval,
min(rorg.access_mode),
rorg.org_id
from [бла-бла-бла]
group by
rorg.org_id

Этот запрос завершается с ошибкой:
ORA-02287: порядковый номер здесь недопустим
02287. 00000 - "sequence number not allowed here"
*Cause: The specified sequence number (CURRVAL or NEXTVAL) is inappropriate
here in the statement.
*Action: Remove the sequence number.

Нашел решение здесь: нужно вынести порядковый номер (sequence) за скобки, включив остальную часть запроса SELECT (которую необходимо сгруппировать) в отдельный подзапрос с поименованными полями:

insert into userorg(id,access_mode,org_id,sysuser_id,version)
select userorg_seq, daAccessMode, daOrgId ... from (
select
min(rorg.access_mode) as daAccessMode,
rorg.org_id as daOrgId,
...
from [бла-бла-бла]
group by rorg.org_id, vur.sysuser_id);

Подглядел здесь: http://stackoverflow.com/questions/7125936/oracle-sql-use-sequence-in-insert-with-select-statement

P.S. оформить запись перед закрытием

пятница, 25 января 2013 г.

Как установить Windows 7 с флешки

Вызвать утилиту:
diskpart

выполнить в ней команды:
list disk
select disk X (где X номер диска из списка команды "list disk", который обозначает флеш-накопитель)
clean
create partition primary
select partition 1
active
format fs=NTFS QUICK
assign
exit

Из папки "boot", которая находится на диске с дистрибутивом MS Windows 7, выполните команду:
bootsect /nt60 (ТУТ БУКВА ФЛЕШ-НАКОПИТЕЛЯ)

После этого нужно скопировать содержимое диске с дистрибутивом MS Windows 7 на флеш-накопитель.

Пример:
C:\WINDOWS\system32>diskpart

Microsoft DiskPart, версия 10.0.14393.0

(С) Корпорация Майкрософт (Microsoft Corporation), 1999-2013.
На компьютере: IRK-NK-14-4

DISKPART> list disk

Диск ### Состояние Размер Свободно Дин GPT
-------- ------------- ------- ------- --- ---
Диск 0 В сети 465 Gбайт 444 Mбайт
Диск 1 В сети 7509 Mбайт 9 Mбайт

DISKPART> select disk 1

Выбран диск 1.

DISKPART> clean

DiskPart: очистка диска выполнена успешно.

DISKPART> create partition primary

DiskPart: указанный раздел успешно создан.

DISKPART> select partition 1

Выбран раздел 1.

DISKPART> active

DiskPart: раздел помечен как активный.

DISKPART> format fs=NTFS QUICK

Завершено (в процентах): 100

Программа DiskPart успешно отформатировала том.

DISKPART> assign

DiskPart: назначение имени диска или точки подключения выполнено успешно.

DISKPART> exit

Завершение работы DiskPart...

C:\WINDOWS\system32>e:

E:\>cd boot

E:\boot>bootsect.exe /nt60 d:
Target volumes will be updated with BOOTMGR compatible bootcode.

D: (\\?\Volume{93381bdc-9f34-11e4-a516-d850e63b9fd6})

Successfully updated NTFS filesystem bootcode.

Bootcode was successfully updated on all targeted volumes.

E:\boot>

---
По мотивам: http://windows.microsoft.com/ru-RU/windows7/installing-windows-7-on-a-netbook

вторник, 22 января 2013 г.

Терминал: Есть приостановленные задачи.

Периодически при завершении работы в терминале, выполняя команду 'exit' вижу сообщение:
"There are suspended jobs" (русск. "Есть приостановленные задачи").
Раньше не придавал этому значения, и просто повторял выполнение команды 'exit', что приводило к тому, что терминал закрывался, а вот процесс, о котором мне и сообщала система, оставался в памяти.

Узнал, что управлять ими можно с помощью команд 'fg', 'bg'. Чуть позднее познакомлюсь с ними поближе.

Команда screen

Меня долго время смущала ситуация, что рестор баз данных Oracle очень рискованно запускать в putty, потому что процесс долгий, а соединение к Linux-серверу, на котором установлена СУБД, может оборваться, в следствие чего непонятно, как вернуться к просмотру статуса процесса. Физически подключать монитор к серверу не хотелось, потому что ... ну это же Linux-сервер, я к нему подхожу не чаще чем 1 раз в 3 месяца, да и то, чтобы пыль протереть с корпуса.

Чтобы хоть как-то решить задачу я научился настраивать VNC-сервер. Т.е. я запускал процесс рестора БД в терминале, который открыт в VNC-сессии, таким образом, даже если соединение оборвется, я все равно знал, что процесс всегда будет на виду, стоит лишь подключиться VNC-клиентом и я увижу рабочий стол в том виде, в котором я его оставил, а именно на рабочем столе будет открыто окно терминала с процессом рестора. Но все же мне это решение не нравилось, потому что, putty мне нравится больше чем VNC (из-за отсутствия графической составляющей).

Сегодня, наконец-то, смог правильно сформулировать запрос к Google и получил долгожданный ответ: о команде screen.

Чтобы принудительно завершить зависший сеанс screen пригодится команда:
screen -X -S <sessionname> quit

Горячие клавиши: http://xgu.ru/wiki/man:screen

пятница, 18 января 2013 г.

Невалидные/инвалидные/недействительные объекты Oracle (invalid_objects.sh)

В одном из отделений столкнулся с ситуацией, когда "Oracle Enterprise Manager" не работает, а компилировать недействительные объекты вручную трудоемко, поэтому решил задачу таким образом:
(в академических целях реализовано с помощью пакета "my_package")

Компилируем:
CREATE OR REPLACE PACKAGE my_package as
    PROCEDURE recompile_invalid_objects;
END my_package;

CREATE OR REPLACE PACKAGE BODY my_package as
    PROCEDURE recompile_invalid_objects IS
    BEGIN
        FOR stmt IN (
            select
             case
              when object_type = 'PACKAGE BODY' then 'ALTER PACKAGE ' || owner || '.' || object_name || ' COMPILE BODY'
              else 'ALTER ' || object_type || ' ' || owner || '.' || object_name || ' COMPILE'
             end as txt
            from dba_objects where status = 'INVALID' order by object_type, owner        
        ) LOOP
        BEGIN
        EXECUTE IMMEDIATE stmt.txt;
        COMMIT;
        EXCEPTION WHEN OTHERS THEN
            /* Сообщаем о любой ошибке и пропускаем итерацию */
            DBMS_OUTPUT.put_line (TO_CHAR(SYSTIMESTAMP, 'DD.MM.YYYY HH24:MI:SS.FF3') || ',ERROR,' || stmt.txt);
            DBMS_OUTPUT.put_line (SQLERRM);
            CONTINUE;
        END;
        /* Если ошибок не было, то сообщаем об успешном выполнении */
        DBMS_OUTPUT.put_line (TO_CHAR(SYSTIMESTAMP, 'DD.MM.YYYY HH24:MI:SS.FF3') || ',SUCCESS,' || stmt.txt);
        END LOOP;
    END;
END my_package;

Запускаем:
(предварительно "set serveroutput on")

BEGIN
    my_package.recompile_invalid_objects;
END;

понедельник, 14 января 2013 г.

Rlwrap для утилит Linux

Утилита rlwrap очень полезна в случаях, когда другие консольные утилиты, либо не имеют возможности хранить и работать с историей своих же команд, либо когда эта возможность реализована непривычно/неудобно, например, как у SQLPLUS:

Download the latest rlwrap software from the following URL.

http://utopia.knoware.nl/~hlub/uck/rlwrap/
Unzip and install the software using the following commands.

gunzip rlwrap*.gz
tar -xvf rlwrap*.tar
cd rlwrap*
./configure
make
make check
make install

Run the following commands, or better still append then to the ".bash_profile" of the oracle software owner.

alias rlsqlplus='rlwrap sqlplus'
alias rlrman='rlwrap rman'

... отсюда

Архив