Вопрос: Как восстановить БД имея холодный бэкап и архивлоги "по-сейчас"?
"Dan Yusuph" сообщил/сообщила в новостях следующее:
KZ> Господа, подскажите как восстановить БД имея только холодный бэкап
KZ> на начало месяца и архивлоги "по-сейчас". Точнее не восстановиться
KZ> а накатится. Опция using backup cfiles, требует видимо заранее
VL> а что говорит то? Посмотри в alert.log
VL> должна работать например такая команда
VL> SQL> recover database using backup controlfile until cancel;
VL> AUTO
VL> ...
у него проблема может быть в том, что холодный бэкап не требует
восстановления и команда recover дает ответ "no recovery needed",
не уверен что именно так, но если у тебя, Константин, такой случай,
то нужно всего лишь заставить этот корректный бэкап захотеть
восстановления, например, путем рассогласования SCN в заголовках
файлов:
startup open
--один файл не будет менять SCN при checkpoint'е
alter tablespace offline immediate;
--все файлы увеличат SCN на один кроме файлов из offline табл.пр-ва
alter system checkpoint;
shutdown abort --abort обязателен
startup mount
recover database
...AUTO (тут подсунь ему все имеющиеся архивлоги)
alter database open;
-- если open не пройдет из-за того что якобы system требует
-- восстановления, сделай дополнительно
-- recover datafile 1
alter database datafile online;
recover datafile
alter tablespace online;
Вопрос: Как вернуть первую строку из отсортированного диапазона?
SELECT field FROM
(SELECT field FROM my_table WHERE ORDER BY field)
WHERE rownum=1
Вопрос: Как запустить инсталлятор Oracle8i Release 3 (8.1.7) на P4 Win XP/Win 2000?
"Valery Yourinsky" <vsu@bill.mts.ru> сообщил/сообщила в новостях следующее:
news:<3E411A21.A98429B6@bill.mts.ru>...
Yury Glukhovskoy wrote:
>
> имеется Oracle8i Release 3 (8.1.7) пытаюсь его запустить на машинах с P4 и
> Win XP/Win 2000 и он просто не стартует без объяснения всяких причин.....
>
> подскажите в чем здесь проблема
Проблема в баге Явы при работе на Pentium IV.
Самое простое:
1) Переписать дистрибутив на диск
2) зайти в директорию
stage\Components\oracle.swd.jre\1.1.7.xx\1\DataFiles\Expanded\jre\win32\bin\
3) Переименовать symcjit.dll во что-то другое, например
RENAME symcjit.dll symcjit.dll.nafig
4) Запустить инсталлятор.
Официальный способ см. ниже.
Валерий Юринский
--
Oracle8 Certified DBA
Moscow, Russia
-----
Versions Affected :
Oracle Universal Installer 1.6.0.9.0
Oracle Universal Installer 1.7.0.19.0
Oracle Universal Installer 1.7.1.9.0
Platforms Affected :
Any platform that uses the Intel Pentium 4 processor, with the Sun JRE
and Symmantec JIT will encounter this problem. Windows NT, Windows 2000
and NetWare platforms are confirmed to be affected.
Solution :
1 - It is also recomended to configure Windows to use only 256 colors.
2 - Not only will OUI be affected by this bug, most of the post-install
configuration tools will also be affected. Running these tools with
"-nojit"
specified will avoid the hang, but it is not simple to specify "-nojit"
for
some of the products.
The following workaround works for the Windows operating system:
a. Copy only the install directory from the CD to the hard disk ,say,
e:\temp.
b. Open oraparam.ini and make the following modifications (Assuming CD
drive is f:)
* Change the "SOURCE=" line to use the full path to the CD instead of a
relative path. (i.e., SOURCE=f:\stage\products.jar)
* Change the "JRE_LOCATION" line to use the full path to the CD instead
of a
relative path. (i.e.,
JRE_LOCATION=f:\stage\Components\oracle\swd\jre\1.1.7\1\DataFiles\Expand
ed)
* Change the "OUI_LOCATION" line to use the full path to the CD instead
of a
relative path. (i.e.,
OUI_LOCATION=f:\stage\Components\oracle\swd\oui\1.6.0.9.0\1\DataFiles\Ex
pand
ed
* Change the "JRE_MEMORY_OPTIONS" line to add "-nojit" as the first
argument.
(i.e., JRE_MEMORY_OPTIONS=-nojit -ms16m -mx32m)
^^^^^^
* Other entries should remain the same
c. Launch setup.exe from the temporary location on your hard drive (i.e.
e:\temp\install\win32\setup.exe). This will use the modified
oraparam.ini and pick up the information from the CD since the absolute
locations are specified.
Choose a Custom install and choose not to create a database during the
install. This way, the Database Configuration Assistant will not be
launched
during installation.
The Net8 Configuration Assistant will still be launched, and there is no
way
to suppress it. You will need to kill the Net8 Configuration Assistant
if it
hangs due to the bug. The installation still will have been successful,
and
you can run the DBCA and NetCA after installation.
To kill NetCA if it hangs during installation:
In the "Configuration Tools" window, highlight the "Net8 Configuration
Assistant" and click "Stop". If that does not work, look for the most
recent
JRE process using the Task Manager, and kill it manually. NOTE: the OUI
itself will also have a jre process. Be sure to kill the one with the
most
recent date, which should be the jre process being used for Net8CA, not
the
one for OUI itself.
After killing the configuration tools and continuing through the
installation
to the "End of Installation" screen, you should modify the configuration
tools
to use "-nojit", then call the appropriate tools from the Start Menu.
Once installation is complete, each of the following files in the
ORACLE_HOME
needs to be modified:
assistants\dbca\dbassist.cl
assistants\dbma\dbmig.cl
assistants\ifa\ifa.cl
bin\elogin.cl
bin\owm.cl
ldap\oidamdin\oidadmin.cl
network\tools\netasst.cl
network\tools\netca.cl
owm\install\instelogin.cl
owm\install\instowm.cl
Edit the contents of the above files to add "-nojit" as shown below:
Command=("C:\Program Files\Oracle\jre\1.1.7\BIN\JREW" -nojit -classpath
....
this is the only thing you need to add --> ^^^^^^
Then, launch the necessary tools, like Net8CA and DBCA from the Start
Menu.
---
S>> Народ, не могу поставить ORACLE 8.1.7 на pentium 4 win200 prof rus
GS>> Не запускается инсталлятор, при этом не чего не говорит просто
отваливается.
GS>> Может кто сталкивался?
VL> Аналогично: ORACLE 8.1.6 на pentium4 win2000 prof eng 256M
VL> Елы-палы...
Вот оно:
http://java.sun.com/products/jdk/1.1/jre/download-jre-windows.html :
JAVA TM RUNTIME ENVIRONMENT
Version 1.1.8_008
for Windows 95 / 98 / 2000 / NT 4.0 (Intel Platform)
Maintenance Release
...
Update: Intel Pentium 4 Processor support for JDK/JRE 1.1.x for Windows
is now available for download. Current JDK/JRE 1.1.x users who
want to run their JDK 1.1.x based Java applets or applications on new
*_Pentium 4_* systems must upgrade to JDK/JRE 1.1.8_008 for Windows.
...
Previous releases of the JDK/JRE 1.1.x for Windows that include the
Symantec JIT *_will not run on Pentium 4 systems_* (Solaris JDK/JRE
1.1.x
for Intel are not affected). JDK 1.1.8_008 for Windows includes
support for Pentium 4 systems only, no other changes are included in
this release."
Соответственно в "\JRE\1.1\CHANGES":
-----------------------------------------------------------------------
BUGS FIXED IN PATCH JDK1.1.8_006
-----------------------------------------------------------------------
4390702 - jdk1.1.x jit crashes on Pentium 4 chips
-----------------------------------------------------------------------
Я скачал Internationalized version of Java Runtime Environment Version
1.1.8_008
и установил его,
слил сидюк на винт, заменил JRE
и все заработало.
P.S. Говорят, можно поставить Installer от 9i
и уже из него устанавливать 8i
==============================
В дополнение
Вот что об этом пишет в comp.databases.oracle.misc
Ali Khalil wrote:
> The following is a step by step procedure to successfully installing
> Oracle Services against an Intel Windows server:
>
> 1- Download JRE 1.2.2_008 from the following link(s):
>
> http://java.sun.com/products/plugin/old.html
> or
> http://java.sun.com/products/jdk/1.2/jre/download-windows.html
>
> 2- Install JRE 1.2 and extract the "symcjit.dll" file.
>
> 3- copy your entire Oracle 8.1.x CD to your local
> file system (example: d:\OraServ816)
>
> 4- Replace d:\OraServ816\stage\Components\oracle.swd.jre
> \1.1.7.xx\1\DataFiles\Expanded\jre\win32\bin\symcjit.dll
>
> with the new one from (2) step above
>
> [caution]
>
> 5- Add this to the path environment variable:
> C:\Program Files\JavaSoft\JRE\1.2\bin\classic;
>
> such that jvm.dll can be located and run in accordance.
>
> 6- Run the setup utility from the main local media folder
> (example: d:\OraServ816) or d:\OraServ816\install\win32\setup.exe
>
> This should allow you to install the Universal Installer and the
> Server Product.
> In order to successfully install other Oracle Products such as the
> documentation, etc, it would be best to invoke the OUI from you local
> media versus relying on the installer from product CD.
> Hope this helps anyone with the P4, Win 2K Oracle RDBMS Services
> installation issues.
>
> Ali Khalil - Beyond Senior
Вопрос: Как вернуть PL/SQL таблицу из пакета в SELECT?
> Есть такая маленькая загвоздка.
> Хочется вернуть созданную в пакете табличку в запрос, те
> в пакете
>
> CREATE OR REPLACE PACKAGE test is
> TYPE tsp IS TABLE OF NUMBER (10)
> INDEX BY BINARY_INTEGER;
> function Get_Sp return tsp;
> END test;
> /
> CREATE OR REPLACE PACKAGE BODY test IS
> sp tsp;
> function Get_Sp return tsp is
> begin
> return sp;
> end;
>
> BEGIN
> for i in 1..100 loop
> sp(i) := i;
> end loop;
> END test;
> /
>
> Хотелось бы написать запрос ввиде
> select * from .............test.Get_Sp..............;
>
> Подскажите...
>
> With best regards, Alexandr Simonenko. E-mail: proteus@alsoft.ru
"Serge Navrotsky" <sergey@ostin.ru>:
create type Num_Coll is table of number(10)
/
create or replace package test is
function getColl return Num_Coll;
end test;
/
create or replace package body test is
myColl Num_Coll;
function getColl return Num_Coll is
begin
return myColl;
end;
begin
myColl := num_coll();
myColl.extend(100);
for i in 1..100 loop
myColl(i) := i;
end loop;
end test;
/
SQL> ed
Wrote file afiedt.buf
1* select * from ( select test.getColl from dual )
SQL> /
GETCOLL
------------------------------------------------------------------------------------------------
NUM_COLL(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100)
SQL> ed
Wrote file afiedt.buf
1 select a.COLUMN_VALUE
2 from
3* table(cast(test.getColl() as Num_Coll)) a
SQL> /
COLUMN_VALUE
------------
1
2
3
4
5
6
7
.....
SQL> ed
Wrote file afiedt.buf
1* select test.getColl() from dual
SQL> /
TEST.GETCOLL()
------------------------------------------------------------------------------------------------
NUM_COLL(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100)
Вопрос: Как заставить Oracle забыть про удаленный файл данных?
Перевёл пространство и файл в офлайн, и файл грохнул на диске из FAR'a.
Стал пространство переводить в онлайн, а оно не хочет!!!
ALTER DATABASE CREATE DATAFILE 'новый_или_тот_же путь_к_файлу'
AS 'старый путь к файлу';
RECOVER TABLESPACE название_табличного_пространства;
ALTER TABLESPACE название_табличного_пространства OPEN;
База должна быть в ARCHIVELOG
"Денис Дорохин" <denis@cs.ifmo.ru>
Вопрос: Где взять патчи для Oracle?
http://www.dynacomp.gr/download/Service%20Packs/Oracle/
ftp://oracle-ftp.oracle.com/server/patchsets/wgt_tech/server/windowsNT/8172
Вопрос: Как изменить приглашение sqlplus с 'SQL> ' на более информативное?
Ответ из AskTom:
Поместить в текущий каталог для sqlplus-а (у меня это %ORACLE_HOME%\Bin) файлы
login.sql:
column global_name new_value gname
set termout off
select lower(user || '@' ||
decode(global_name, 'ORACLE8.WORLD', '8.0', 'ORA8I.WORLD',
'8i', 'ORA8IDEV.WORLD', 'dev8i', global_name )) global_name
from global_name;
set termout on
set sqlprompt '&gname> '
и
connect.sql:
connect &1
@login.sql
После этого, переконнекчиваться так:
@connect username@tnsname
Еще один вариант:
Dan Hotka в апpельском Oracle Professional как pаз об этом писал:
column INSTANCE_ID new_value INST_ID noprint
select INSTANCE_NAME || '>' INSTANCE_ID from v$instance
/
set SQLPROMPT &&INST_ID
и далее:
"Put this into the file "LOGIN.SQL" in the home directory of users
wanting this prompt information, and it will load automatically each
time they initiate SQL*Plus session."
Вопрос: Как определить rowid cтроки сразу после вставки (pl/sql)?
declare
rowid_var varchar2(20);
...
insert into table_name values(...) returning rowid into rowid_var;
Вопрос: База на Win NT/2000 не стартует автоматически?
Oracle Database Service on Windows 2000 in AutoStart Mode with Logon as
SYSTEM
(Bug 1397927) If you have installed an Oracle database service on Windows
2000, when logging in as SYSTEM user (Local System), with startup mode
set to Automatic, it is possible that the Oracle database service starts but
the
database does not start automatically. The following error message is
written to the ORADIM.LOG file in the ORACLE_BASE\ORACLE_
HOME\DATABASE directory.
ORA-12640: Authentication adapter initialization failed
It has also been observed that the services like Oracle Enterprise
Management Agent, Oracle Enterprise Manager Management Server and
Oracle Internet Directory may also fail for the same reason because they
cannot connect to the database.
The workarounds for this problem are:
1. Remove the line sqlnet.authentication_services=(NTS) from
SQLNET.ORA or set sqlnet.authentication_services=(NONE) in
SQLNET.ORA.
2. Start the database manually after the Oracle database service has
started using SQL*Plus connecting as user name INTERNAL. Note that
the INTERNAL user name will not be available after release 8.1.7.
3. Start the service as a specific user:
1. Choose Start > Settings > Control Panel > Services. The Services
dialog box appears.
2. Select the service you want to start.
3. Click the Startup button. The Service dialog box appears.
4. Click This account and specify the user name and corresponding
password.
User Privileges for Running Oracle Services
(Bug 1321952) Depending on the products that you have installed, a
number of Oracle services are started automatically when you restart your
Windows NT computer. A user with a non-system account must have local
administrative rights to run services on a Windows NT computer.
Вопрос: Как изменить кодировку сервера?
ALTER DATABASE db1 CHARACTER SET CL8ISO8859P5;
ALTER DATABASE db1 NATIONAL CHARACTER SET CL8ISO8859P5;
Вопрос: program too large.
Try to use SYS.DBMS_SHARED_POOL.ABORTED_REQUEST_THRESHOLD procedure.
For example:
connect by sys or system
begin
sys.dbms_shared_pool.aborted_request_threshold(2000000);
end;
/
and after it try to recompile your package.
Вопрос: Как узнать количество обработанных строк в pl/sql?
SQL%ROWCOUNT
SQL%ROWCOUNT yields the number of rows affected by an INSERT, UPDATE, or
DELETE statement, or returned by a SELECT INTO statement. SQL%ROWCOUNT
yields 0 if an INSERT, UPDATE, or DELETE statement affected no rows, or a
SELECT INTO statement returned no rows. In the following example, you use
SQL%ROWCOUNT to take action if more than ten rows have been deleted:
DELETE FROM emp WHERE ...
IF SQL%ROWCOUNT > 10 THEN -- more than 10 rows were deleted
...
END IF;
Вопрос: Как убить зависшую сессию под NT?
orakill /?
Вопрос: Где найти список недокументированных параметров Oracle?
1.Полный список недок параметров с кратким описанием можно
найти в файле документации :-) oracleXX.exe
2.Список недокументированных и документированных
параметров можно достать из Fixed Table SYS.X$KSPPI
3.
SELECT rownum, a.ksppinm "Parameter", a.ksppdesc "Description",
b.ksppstvl "Session Value",
c.ksppstvl "Instance Value"
FROM x$ksppi a, x$ksppcv b, x$ksppsv c
WHERE a.indx = b.indx AND a.indx = c.indx AND a.ksppinm LIKE '/_%'
escape '/'
4.Revealnet Oracle Adminstration Knowledge base said:
=========================================
REM Script for getting undocumented init.ora
REM parameters from a 7.2 instance
REM
COLUMN parameter FORMAT a40
COLUMN value FORMAT a30
COLUMN ksppidf HEADING 'Is|Default'
SET FEEDBACK OFF VERIFY OFF PAGES 55
START title80 'Undocumented Init.ora Parameters'
SPOOL rep_out/&db/undoc
SELECT ksppinm "Parameter",
ksppivl "Value",
ksppidf
FROM x$ksppi
WHERE ksppinm LIKE '/_%' escape '/'
/
SPOOL OFF
TTITLE OFF
REM Script for getting undocumented init.ora
REM parameters from a 7.3 or 8.0.2 instance
REM
COLUMN parameter FORMAT a37
COLUMN description FORMAT a30 WORD_WRAPPED
COLUMN "Session Value" FORMAT a10
COLUMN "Instance Value" FORMAT a10
SET LINES 100
SET PAGES 0
SPOOL undoc.lis
SELECT
a.ksppinm "Parameter",
a.ksppdesc "Description",
b.ksppstvl "Session Value",
c.ksppstvl "Instance Value"
FROM
x$ksppi a,
x$ksppcv b,
x$ksppsv c
WHERE
a.indx = b.indx
AND a.indx = c.indx
AND a.ksppinm LIKE '/_%' escape '/'
/
SPOOL OFF
SET LINES 80 PAGES 20
CLEAR COLUMNS
=======================================
Вопрос: Что можно узнать о машине клиента из PL/SQL?
Ну если у тебя 8i, то все просто:
select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
А если 7, то можно, например, имя машины получить (клиента)
select userenv('terminal') from dual;
Вопрос: Как в SQLLoader пропустить поле переменной длины?
FIELDS TERMINATED BY ','
(FIELD1, FIELD2, FIELD3 FILLER, FIELD4)
Вопрос: Как использовать Oracle за FireWall?
Добавь в регистр HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE ключик
USE_SHARED_SOCKET=TRUE ( размер - REG_EXPAND_SZ ) и перезапусти instance.
Если несколько Oracle_Home, то нужно добавить в
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME<id>.
естественно порты 1521 и 1526 должны быть открыты для данного IP-адреса.
Подробности на
http://technet.oracle.com/doc/windows/server.804/a55913/apb.htm#444407
Вопрос: Как заствавить Oracle не выгpужать SGA в своп?
pre_page_sga = true - "потрогать" все страницы памяти перед началом работы
для перенесения их в RAM.
lock_sga = true - "залочить" SGA в RAM
Вопрос: Как отложить проверку констрейна до окончания транзакции?
CREATE TABLE orders
(ord_num NUMBER CONSTRAINT unq_num UNIQUE (ord_num)
INITIALLY DEFERRED DEFERRABLE);
SET CONSTRAINTS ALL|constraint1,constraint2 DEFERRED;
Вопрос: Что значит сообщение:"Input truncated to 1 characters"?
Посмотри, у тебя файл кончается непустой строкой - вот плюс и орёт, - добавь
CR/LF в конце и всё будет Ок ;)
Вопрос: Как создать функцию в пакете?
>создаю пакет и процедуру в нем
>-----------------
>CREATE PACKAGE MY_PR AS
>FUNCTION INC_( VALUE IN INTEGER) RETURN INTEGER;
PRAGMA RESTRICT_REFERENCES(INC_, WNDS, WNPS);
>END MY_PR;
>
>CREATE OR REPLACE PACKAGE BODY MY_PR AS
>
>FUNCTION INC_( VALUE IN INTEGER) RETURN INTEGER IS
> TMP INTEGER ;
>BEGIN
> TMP := VALUE+1;
> RETURN TMP;
>END INC_;
>
>END MY_PR ;
>---------------------
>при вызове select my_pr.inc_(1) from dual приводит к ошибке
>"function inc_ does not guarantee not to update database"
>та же функция без пакета работает нормально
>объясните в чем проблема?
Mark Malakanov
Oraсle DBA
Sapience, Toronto
Вопрос: О настройке shared pool.
select name,sum(value) from v_$sesstat s, v_$statname n
where s.statistic# = n.statistic# and name like '%ses%mem%'
group by name
session uga memory - память выделенная сессией сейчас.
session uga memory max - максимальная память выделенная сессией когда либо
Если у тебя МТС то эта память выделяется в shared pool. Если dedicated то
память выделяется в системе.
> Подскажите как быть. И вообще, кто как, исходя из чего shared_pool_size
> устанавливал ?
Ну просто
RATE должен быть <1% а релоадов должно быть около 0.
SELECT SUM(pins) , SUM(reloads), SUM(reloads)/SUM(pins)*100 RATE
FROM v$librarycache;
RATE должен быть <10-15% а миссов должно быть мало.
SELECT SUM(gets),SUM(getmisses),SUM(getmisses)/SUM(gets)*100 ratio
FROM v$rowcache;
Из доки
To take advantage of additional memory available for shared SQL areas, you
may also need to increase the number of cursors permitted for a session. You
can increase this limit by increasing the value of the initialization
parameter OPEN_CURSORS.
select * from V$SHARED_POOL_RESERVED;
Памяти достаточно если REQUEST_FAILURES = 0 или не повышается.
Ну и еще одно условие. Размер памяти SGA и юзерских процессов (dedicated
servers) не должен доводить систему до свопа.
Обычно SGA делают 50% от RAM.
---------------
PGA - Program Global Area
UGA - User Global Area
если dedicated - PGA = UGA + Stack Area
Если MTS то UGA лежит в SGA, PGA= Stack Area
В UGA лежат приватные СКЛ области, курсоры, переменные, области
сортировки...
В стэке лежит стэк вызовов
----------------
dbms_session.free_unused_user_memory;
Mark Malakanov
OraDBA
Sapience, Toronto
Вопрос: Как изменить значение sequence?
Допустим, надо получить значение sequence Y:
select my_sequence.nextval into X from dual;
alter sequence my_sequence increment by (Y-X);
select my_sequence.nextval into X from dual; -- имеем тот самый Y :-)
alter sequence my_sequence increment by 1;
Вопрос: Как вывести сумму в рублях и коп. прописью?
PRAGMA RESTRICT_REFERENCES (number2word,WNDS, WNPS, RNDS, RNPS);
/**********************************************/
/* функция сумма прописью в рублях и копейках */
/**********************************************/
FUNCTION number2word (source IN NUMBER) RETURN varchar2 is
result VARCHAR2(300);
BEGIN
-- k - копейки
result := ltrim(to_char( source,
'9,9,,9,,,,,,9,9,,9,,,,,9,9,,9,,,,9,9,,9,,,.99')) || 'k';
-- t - тысячи; m - милионы; M - миллиарды;
result := replace( result, ',,,,,,', 'eM');
result := replace( result, ',,,,,', 'em');
result := replace( result, ',,,,', 'et');
-- e - единицы; d - десятки; c - сотни;
result := replace( result, ',,,', 'e');
result := replace( result, ',,', 'd');
result := replace( result, ',', 'c');
--
result := replace( result, '0c0d0et', '');
result := replace( result, '0c0d0em', '');
result := replace( result, '0c0d0eM', '');
--
result := replace( result, '0c', '');
result := replace( result, '1c', 'сто ');
result := replace( result, '2c', 'двести ');
result := replace( result, '3c', 'триста ');
result := replace( result, '4c', 'четыреста ');
result := replace( result, '5c', 'пятьсот ');
result := replace( result, '6c', 'шестьсот ');
result := replace( result, '7c', 'семьсот ');
result := replace( result, '8c', 'восемьсот ');
result := replace( result, '9c', 'девятьсот ');
--
result := replace( result, '1d0e', 'десять ');
result := replace( result, '1d1e', 'одиннадцать ');
result := replace( result, '1d2e', 'двенадцать ');
result := replace( result, '1d3e', 'тринадцать ');
result := replace( result, '1d4e', 'четырнадцать ');
result := replace( result, '1d5e', 'пятнадцать ');
result := replace( result, '1d6e', 'шестнадцать ');
result := replace( result, '1d7e', 'семьнадцать ');
result := replace( result, '1d8e', 'восемнадцать ');
result := replace( result, '1d9e', 'девятнадцать ');
--
result := replace( result, '0d', '');
result := replace( result, '2d', 'двадцать ');
result := replace( result, '3d', 'тридцать ');
result := replace( result, '4d', 'сорок ');
result := replace( result, '5d', 'пятьдесят ');
result := replace( result, '6d', 'шестьдесят ');
result := replace( result, '7d', 'семьдесят ');
result := replace( result, '8d', 'восемьдесят ');
result := replace( result, '9d', 'девяносто ');
--
result := replace( result, '0e', '');
result := replace( result, '5e', 'пять ');
result := replace( result, '6e', 'шесть ');
result := replace( result, '7e', 'семь ');
result := replace( result, '8e', 'восемь ');
result := replace( result, '9e', 'девять ');
--
result := replace( result, '1e.', 'один рубль ');
result := replace( result, '2e.', 'два рубля ');
result := replace( result, '3e.', 'три рубля ');
result := replace( result, '4e.', 'четыре рубля ');
result := replace( result, '1et', 'одна тысяча ');
result := replace( result, '2et', 'две тысячи ');
result := replace( result, '3et', 'три тысячи ');
result := replace( result, '4et', 'четыре тысячи ');
result := replace( result, '1em', 'один миллион ');
result := replace( result, '2em', 'два миллиона ');
result := replace( result, '3em', 'три миллиона ');
result := replace( result, '4em', 'четыре миллиона ');
result := replace( result, '1eM', 'один милиард ');
result := replace( result, '2eM', 'два милиарда ');
result := replace( result, '3eM', 'три милиарда ');
result := replace( result, '4eM', 'четыре милиарда ');
--
result := replace( result, '11k', '11 копеек');
result := replace( result, '12k', '12 копеек');
result := replace( result, '13k', '13 копеек');
result := replace( result, '14k', '14 копеек');
result := replace( result, '1k', '1 копейка');
result := replace( result, '2k', '2 копейки');
result := replace( result, '3k', '3 копейки');
result := replace( result, '4k', '4 копейки');
--
result := replace( result, '.', 'рублей ');
result := replace( result, 't', 'тысяч ');
result := replace( result, 'm', 'миллионов ');
result := replace( result, 'M', 'милиардов ');
result := replace( result, 'k', ' копеек');
--
RETURN(result);
END number2word;
Вопрос: Формат файла дампа (.dmp)?
From: pavel@percombank.kiev.ua (Pavel L.L.)
Вот понадобилось ковыpнуть дамп
Hемного напpягшись, "догадался" почти обо всем,
исключение составляет INSERT INTO в pайоне BLOB'ов
обычно дамп выглядит так
..
db 0a,'INSERT INTO <table_name> (<field_list>) VALUES(:1, :2, ... :N)',0a
db N ; кол-во полей
dw 2*N dup (?) ; хаpактеpистики полей
; массив значений
dw L1 ; длина 1
db L1 dup (?) ; значение 1
dw L2 ; длина 2
db L2 dup (?) ; значение 2
..
dw LM ; длина M
db LM dup (?) ; значение M
dw 0FFFF ; пpизнак конца массива значений
db 0a
<следующий опеpатоp>
пpоблема с блобами состоит в том, что для них массив значений имеет вид
dw P1 ; паpаметp 1 = 0FFFD
dw P2 ; паpаметp 2 = 0FFDA
db GB dup (?) ; тело блоба
а _длину_ блоба _где_ найти?
Вопрос: Как переименовать колонку в таблице?
DL> Захотелось мне пеpеименовать колонку в таблице и сделал я это так:
DL> update sys.col$
DL> set name = 'AAA'
DL> where name = 'BBB';
DL> commit;
DL> И оно сpаботало.
DL> Вопpос к общественности.
DL> Hасколько чpеваты глюками апдейты системных таблиц?
DL> Hе поплохеет ли от этого Оpаклу?
Да вpоде не должно, только нужно еще сpазу сделать ALTER SYSTEM FLUSH SHARED
POOL. Hа
http://www.oracle.com/oramag/code/tip05289.html лежит следующая пpоцедуpка:
=== Cut ===
Create or replace procedure chg_colnm(
user in varchar2, -- name of the schema.
table_name in varchar2, -- name of the table.
old_name in varchar2, -- name of the column to be renamed.
new_name in varchar2 -- new name of the column.
) as
id number;
col_id number;
cursor_name1 INTEGER;
cursor_name2 INTEGER;
ret1 INTEGER;
ret2 INTEGER;
begin
select object_id into id from dba_objects where
object_name=UPPER(table_name)
and owner=UPPER(user) and object_type='TABLE';
select col# into col_id from col$ where obj#=id and
name=UPPER(old_name);
dbms_output.put_line(col_id);
update col$ set name=UPPER(new_name)
where obj#=id and col#=col_id;
commit;
cursor_name1 := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_name1, 'ALTER SYSTEM FLUSH
SHARED_POOL',DBMS_SQL.native);
ret1 := DBMS_SQL.EXECUTE(cursor_name1);
DBMS_SQL.CLOSE_CURSOR(cursor_name1);
cursor_name2:= DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_name2, 'ALTER SYSTEM
CHECKPOINT',DBMS_SQL.native);
ret2:= DBMS_SQL.EXECUTE(cursor_name2);
DBMS_SQL.CLOSE_CURSOR(cursor_name2);
end;
/
=== Cut ===
До встpечи, Ilia.
Вопрос: to_char в pl/sql.
> Нужно-то всего ничего: чтобы числа с дробной частью выводились в виде 0,25
> 12,34 (а не в виде .25 и 12.34), числа же без дробной части нужно без нее и
> выводить ( целое 12 как 12 а не как 12,00). Можно ли все это получить, задав
> всего одну строку формата?
select RTRIM(to_char( .34,'FM990.99' ),'.' ) from dual
'0.34'
select RTRIM(to_char( 12.34,'FM990.99' ),'.' ) from dual
'12.34'
select RTRIM(to_char( 12,'FM990.99' ),'.' ) from dual
'12'
Можно еще задать NLS_FORMAT если хочешь вместо точки выводить запятые.
еще ответ:
select rtrim(TO_CHAR(12345.00,'FM999G990D99','NLS_NUMERIC_CHARACTERS='',.'''),',') from dual;
Вопрос: Как мигрировать с 7 на 8 без экспорта-импорта?
Привет.
Можно и без экспорта-импорта мигрировать. Недавно тренировался на пробной
базе.
Коротко это делается так. Восьмерошным инсталятором ставишь в существующую
семерку утилиту миграции. Останавливаешь семерку NORMAL. Пускаешь утилиту
миграции. Она сама стартует семерку и по существующей базе делает файлик
convSID.dbf и останавливает семерку. Далее надо сменить ORACLE_HOME - куда
ставить восьмерку. И ставить восьмерку - только программное обеспечение.
далее копируешь в новую /dbs старый initSID.ora и convSID.dbf . А далее
работает восьмерка -
startup nomount
alter database convert
alter database open resetlogs
@...rdbms/admin/cat8000.sql
Значительно быстрее чем экспорт-импорт. Все файлы данных остаются на своих
местах. Ничего не надо копировать. Но можно все быстро и грохнуть. Так что
я еще пару раз потренируюсь прежде чем взяться за живую базу.
Будте здороВЫ.
Вопрос: Перекодировка при экспорте-импорте.
Хуже кагда уже есть файл в неправильной кодировке, и
нет даступа к работающей базе.
(Обычно это WE8ISO8859P1, хотя фактически содержащий например Cl8MSWIN1251)
Для начало проверьте: а есть ли там вообще русские данные...
Это можно сделать любым двоичным редактором или смотрелкой
Если вы гнали export с NLS_LANG=XXXX_XXXX.US7ASCII
То скорее всего получите вместо русских букв ??????
Hо предположим что вам повезло и данные есть, тогда делайте так:
1) Определяете какая кодировка сидит в дампе ( Реальная)
пусть это будет CL8KOI8R
2) Определяется какой код NLS_CHARACTERSET соответствует
этой кодировке:
COMMAND> set NLS_LANG=american_america.CL8COI8R
COMMAND> exp file=koi8 tables=(EMP) userid=scott/tiger
смотрите заголовок:
00 segnature
01 02 - Код NLS_CHARACTERSET в dmp file
эти два байта запоминаете
3) меняете в вашем "неправильном exp file" заголовок
любым двоичным редактором на правильные значения
4) Далее без проблем пользуетесь стандартной процедурой imp
Ваш правильный сервер, поймет ваш поправленный dmp
Best regards, Vadim Lejnin
Oracle and Unix Administrator company FORS
E-mail: lejnin@fors.ru
Вопрос: Пример скрипта для бэкапа.
Sample Code Repository
Name: Another NT hot backup Command script
--------------------------------------------------------------------------------
Description:
Here is another NT command script for doing backups on NT. It's dynamic like the last one but uses SQL*PLUS rather than the PL/SQL UTIL_FILE package to write its subscripts and all three types of backups are contained in one script file. It also writes all output to a backup.log file that can be scanned for errors.
Source Code:
@echo off
rem Edit the command file, modify ORACLE_SID and the O_CONNECT string parameters.
rem Launch the script:
rem DB_BACKUP HOT Target_Backup_Path
rem DB_BACKUP COLD Target_Backup_Path
rem DB_BACKUP EXPORT Target_Backup_Path Complete,Incremental or Differential
if %1.==DOIT. goto %2
rem This script will complete Hot, Cold or an Export backup of an Oracle database on NT.
rem
rem This script was designed to run in batch. Use the AT scheduler to schedule the backup job.
rem
rem OS Authentication is prefered to which eliminates userid/passwords from this script file.
rem If useing OS authentication, make sure you have a loop back alias defined for the database.
rem Also ensure the AT scheduler runs under an account that has DBA authority (is in the ORA_OPER and ORA_DBA groups).
rem The account must also be granted DBA or restricted session and exp_full_database for exports to work properly.
rem
rem Edit the SID and CONNECT and INIT strings used in this command file.
rem
rem Craig MacPherson - Oracle Corporation Canada Inc. June/97
rem
setlocal
REM These values cannot be derived, please set them to reflect your environment
set ORACLE_SID=CDM1
set O_CONNECT=/@cdm1
set O_INIT=c:\orabase\admin\%ORACLE_SID%\pfile\init.ora
rem Oracle Binaries
set O_SVRMGR=c:\orant\bin\svrmgr23.exe
set O_EXPORT=c:\orant\bin\exp73.exe
set O_PLUS=c:\orant\bin\plus33.exe
set O_COPY=c:\orant\bin\ocopy73.exe
REM COMPLETE, CUMULATIVE, or INCREMENTAL - default the inctype for exports
set O_INCTYPE=COMPLETE
set O_BACKPATH=%2
if %O_BACKPATH%.==. goto help
echo. >>%O_BACKPATH%\test.tst||goto help2
del %O_BACKPATH%\test.tst
if %1.==EXPORT. goto start
if %1.==HOT. goto start
if %1.==COLD. goto start
goto HELP
rem ***************************************************************************
rem START OF THE BACKUP PROCESS
rem ***************************************************************************
:START
REM Adjust the target path for the backups
rem set O_BACKPATH=%O_BACKPATH%\%1
REM Create DB_START.CMD script to start the database back up
echo connect %O_CONNECT% as sysoper; >db_start.sql
echo startup pfile=%O_INIT% >>db_start.sql
echo exit >>db_start.sql
REM Create DB_DOWN.CMD script to shutdown the database
echo connect %O_CONNECT% as sysoper; >db_down.sql
echo shutdown immediate >>db_down.sql
echo exit >>db_down.sql
REM Create DB_RESTRICT.CMD script to shutdown the database and startup in restricted mode
echo connect %O_CONNECT% as sysoper; >db_restrict.sql
echo shutdown immediate; >>db_restrict.sql
echo startup pfile=%O_INIT% restrict; >>db_restrict.sql
echo exit >>db_restrict.sql
REM ********************************************
REM Call this command file again and run the job
call %0.cmd DOIT %1 %3 >%O_BACKPATH%\backup.log||call %0 DOIT %1 %3 >%O_BACKPATH%\backup.log
goto CLEANUP
rem ***************************************************************************
rem HOT BACKUP OF THE DATABASE
rem ***************************************************************************
:HOT
ECHO -- Shutdown the database and startup in restricted mode
%O_SVRMGR% @db_restrict.sql
ECHO -- Backup the init file
copy %O_INIT% %O_BACKPATH%
ECHO -- Create a SQL*PLUS script for the datafile backups and get min log sequence number
echo set heading off; >%O_BACKPATH%\plus1.sql
echo set feedback off; >>%O_BACKPATH%\plus1.sql
echo spool %O_BACKPATH%\backup1.cmd; >>%O_BACKPATH%\plus1.sql
echo select 'set vminlog='^|^|min(sequence#) from v$log where UPPER(status) = UPPER('INACTIVE'); >>%O_BACKPATH%\plus1.sql
echo spool off; >>%O_BACKPATH%\plus1.sql
echo spool %O_BACKPATH%\svrmgr1.sql; >>%O_BACKPATH%\plus1.sql
echo select 'connect %O_CONNECT% as sysdba;' from dual; >>%O_BACKPATH%\plus1.sql
echo select 'alter tablespace '^|^|tablespace_name^|^|' begin backup;'^|^|' >>%O_BACKPATH%\plus1.sql
echo '^|^|'host start /wait %O_COPY% '^|^|file_name^|^|' %O_BACKPATH%;'^|^|' >>%O_BACKPATH%\plus1.sql
echo '^|^|'alter tablespace '^|^|tablespace_name^|^|' end backup;' from dba_data_files; >>%O_BACKPATH%\plus1.sql
echo select 'alter system switch logfile;' from dual; >>%O_BACKPATH%\plus1.sql
echo select 'exit;' from dual; >>%O_BACKPATH%\plus1.sql
echo exit; >>%O_BACKPATH%\plus1.sql
ECHO -- Run the sql*plus script to create the backup1.cdm and svrmgr1.sql scripts
%O_PLUS% %O_CONNECT% @%O_BACKPATH%\plus1.sql
ECHO -- Run the backup command script to set vminlog
call %O_BACKPATH%\backup1.cmd
ECHO -- Run the svrmgr script to backup the datafiles
%O_SVRMGR% @%O_BACKPATH%\svrmgr1.sql
ECHO -- Create a SQL*PLUS script for the vmaxlog and control files
echo set heading off; >%O_BACKPATH%\plus2.sql
echo set feedback off; >>%O_BACKPATH%\plus2.sql
echo spool %O_BACKPATH%\backup2.cmd; >>%O_BACKPATH%\plus2.sql
echo select 'set vmaxlog='^|^|max(sequence#) from v$log where UPPER(status) = UPPER('CURRENT'); >>%O_BACKPATH%\plus2.sql
echo spool off; >>%O_BACKPATH%\plus2.sql
echo spool %O_BACKPATH%\svrmgr2.sql; >>%O_BACKPATH%\plus2.sql
echo select 'connect %O_CONNECT% as sysdba;' from dual; >>%O_BACKPATH%\plus2.sql
echo select 'alter database backup controlfile to '''^|^|'%O_BACKPATH%\'^|^|substr(name,instr(name,'\',-1)+1)^|^|''' REUSE;' from v$controlfile; >>%O_BACKPATH%\plus2.sql
echo spool off; >>%O_BACKPATH%\plus2.sql
echo exit; >>%O_BACKPATH%\plus2.sql
ECHO -- Run the sql*plus script to create backup2.cmd and svrmgr2.sql scripts
%O_PLUS% %O_CONNECT% @%O_BACKPATH%\plus2.sql
ECHO -- Run the backup2.cmd command script to set vmaxlog
call %O_BACKPATH%\backup2.cmd
ECHO -- Run the svrmgr2.sql script to backup the controlfiles
%O_SVRMGR% @%O_BACKPATH%\svrmgr2.sql
ECHO -- Create a SQL*PLUS script for the archive logs
echo set heading off; >%O_BACKPATH%\plus3.sql
echo set feedback off; >>%O_BACKPATH%\plus3.sql
echo spool %O_BACKPATH%\backup3.cmd; >>%O_BACKPATH%\plus3.sql
echo select 'copy '^|^|archive_name^|^|' %O_BACKPATH%' from v$log_history where sequence# between %vminlog% and %vmaxlog%+1; >>%O_BACKPATH%\plus3.sql
echo spool off; >>%O_BACKPATH%\plus3.sql
echo exit; >>%O_BACKPATH%\plus3.sql
ECHO -- Run the sql*plus script to create the backup3.cmd script
%O_PLUS% %O_CONNECT% @%O_BACKPATH%\plus3.sql
ECHO -- Run the backup command script to copy the archive logs
call %O_BACKPATH%\backup3.cmd
ECHO -- Hot Backup Complete
goto END_OF_FILE;
rem ***************************************************************************
rem COLD BACKUP OF THE DATABASE
rem ***************************************************************************
:COLD
ECHO -- Shutdown the database and startup in restricted mode
%O_SVRMGR% @db_restrict.sql
ECHO -- Create a SQL*PLUS script for the cold backup
echo set heading off; >%O_BACKPATH%\backup.sql
echo set feedback off; >>%O_BACKPATH%\backup.sql
echo spool %O_BACKPATH%\backup.cmd; >>%O_BACKPATH%\backup.sql
echo select 'copy '^|^|member^|^|' %O_BACKPATH%' from v$logfile; >>%O_BACKPATH%\backup.sql
echo select 'copy '^|^|name^|^|' %O_BACKPATH%' from v$controlfile; >>%O_BACKPATH%\backup.sql
echo select 'copy '^|^|file_name^|^|' %O_BACKPATH%' from dba_data_files; >>%O_BACKPATH%\backup.sql
echo spool off; >>%O_BACKPATH%\backup.sql
echo exit; >>%O_BACKPATH%\backup.sql
ECHO -- Run SQL*PLUS to create the backup command script
%O_PLUS% %O_CONNECT% @%O_BACKPATH%\backup.sql
ECHO -- Shutdown the database
%O_SVRMGR% @db_down.sql
ECHO -- Run the backup script
call %O_BACKPATH%\backup.cmd
ECHO -- Optionaly bounce the Oracle Process here
net stop OracleService%ORACLE_SID%
net start OracleService%ORACLE_SID%
ECHO -- Start the database
%O_SVRMGR% @db_start.sql
ECHO -- Cold Backup Complete
goto END_OF_FILE
rem ***************************************************************************
rem EXPORT THE DATABASE
rem ***************************************************************************
:EXPORT
if %3.==CUMULATIVE. set O_INCTYPE=CUMULATIVE
if %3.==INCREMENTAL. set O_INCTYPE=INCREMENTAL
ECHO -- Shutdown database and startup in restricted mode
%O_SVRMGR% @db_restrict.sql
ECHO -- Run Create the export parameter file
echo COMPRESS=Y >%O_BACKPATH%\export.inp
echo CONSISTENT=N >>%O_BACKPATH%\export.inp
echo CONSTRAINTS=Y >>%O_BACKPATH%\export.inp
echo DIRECT=Y >>%O_BACKPATH%\export.inp
echo FULL=Y >>%O_BACKPATH%\export.inp
echo GRANTS=Y >>%O_BACKPATH%\export.inp
echo INDEXES=Y >>%O_BACKPATH%\export.inp
echo RECORD=Y >>%O_BACKPATH%\export.inp
echo ROWS=Y >>%O_BACKPATH%\export.inp
echo FEEDBACK=0 >>%O_BACKPATH%\export.inp
echo INCTYPE=%O_INCTYPE% >>%O_BACKPATH%\export.inp
echo STATISTICS=ESTIMATE >>%O_BACKPATH%\export.inp
echo LOG=%O_BACKPATH%\EXPORT.LOG >>%O_BACKPATH%\export.inp
echo FILE=%O_BACKPATH%\EXPDAT.DMP >>%O_BACKPATH%\export.inp
ECHO -- Start the export with the parameter file that was created
%O_EXPORT% %O_CONNECT% parfile=%O_BACKPATH%\export.inp
ECHO -- Shutdown the database
%O_SVRMGR% @db_down.sql
ECHO -- Optionaly bounce the Oracle process here
net stop OracleService%ORACLE_SID%
net start OracleService%ORACLE_SID%
ECHO -- Startup the database
%O_SVRMGR% @db_start.sql
ECHO -- Export Backup Complete
goto END_OF_FILE
rem ***************************************************************************
rem USER HELP
rem ***************************************************************************
:HELP
echo.
echo B.CMD Usage:
echo Enter BACKUP TYPE TARGET [MODE]
echo Where TYPE is either HOT, COLD or EXPORT
echo and TARGET is the location for the backup files e.g. c:\oraback\sid\HOT
echo and if type is EXPORT, MODE is either COMPLETE, CUMULATIVE or INCREMENTAL
echo.
goto END_OF_FILE
:HELP2
echo.
echo Error - Cannot write to %O_BACKPATH%
echo.
goto END_OF_FILE
rem ***************************************************************************
rem CLEANUP FILES
rem ***************************************************************************
:CLEANUP
if exist db_start.sql del db_start.sql
if exist db_down.sql del db_down.sql
if exist db_restrict.sql del db_restrict.sql
rem ***************************************************************************
rem HANDLE ERRORS HERE
rem ***************************************************************************
findstr /in "error" %O_BACKPATH%\backup.log && findstr /in "error" %O_BACKPATH%\backup.log >%O_BACKPATH%\error.log
findstr /in "ora-" %O_BACKPATH%\backup.log && findstr /in "ora-" %O_BACKPATH%\backup.log >%O_BACKPATH%\error.log
findstr /in "cannot" %O_BACKPATH%\backup.log && findstr /in "cannot" %O_BACKPATH%\backup.log >%O_BACKPATH%\error.log
findstr /in "not logged" %O_BACKPATH%\backup.log && findstr /in "not logged" %O_BACKPATH%\backup.log >%O_BACKPATH%\error.log
findstr /in "failure" %O_BACKPATH%\backup.log && findstr /in "failure" %O_BACKPATH%\backup.log >%O_BACKPATH%\error.log
if exist %O_BACKPATH%\error.log c:\ntreskit\logevent -s E "BACKUP FAILURE!"
pause
endlocal
:END_OF_FILE
Вопрос: Пример скрипта для экспорта данных в файл с разделителями.
Sample Code Repository
Name: tabexp.sql
--------------------------------------------------------------------------------
Description:
export a table to a character delimted file via SQL script!
Source Code:
REM ===========================================================
REM
REM Custom-delimited Export Creator
REM for Oracle7 / SQL*Plus
REM
REM Created 11/15/96
REM by Ken Shirey
REM Oracle Database Administrator
REM Commerical Data Systems
REM email: commdata@phoenix.net
REM
REM This program may be freely copied, modified,
REM and distributed, provided that it retains this
REM header. Use at your own risk.
REM
REM Usage: @tabexp <owner> <table name> <ASCII Character Code>
REM EX: @tabexp SCOTT EMP 44
REM
REM caveats:
REM No NLS translation is specified. System defaults apply.
REM Date is formatted as system default.
REM Hull Crush Depth is 1000 characters.
REM LONG columns will cause errors, so they are not exported.
REM Delimiter characters in the text will be converted to a ~.
REM ===========================================================
set echo off
set feedback off
set pages 0
set lines 100
set verify off
prompt Creating command file for table: &1 . &2 ...
set termout off
spool cmd.sql
REM
REM start the statement...
REM
select 'Select rtrim(' from dual;
REM
REM We're converting everything to CHAR
REM Watch for extra spaces at the end of CHAR columns
REM Convert any embedded delimiter characters to tildes (~)
REM
select decode(data_type ,'NUMBER', 'to_char('
,'DATE', 'to_char('
,'CHAR', 'rtrim(translate('
,'VARCHAR2', 'rtrim(translate('
,NULL
) ||
column_name ||
decode(data_type ,'NUMBER', ') || chr(&3) || '
,'DATE', ') || chr(&3) || '
,'CHAR' , ',chr(&3),chr(126) )) || chr(&3) ||'
,'VARCHAR2', ',chr(&3),chr(126) )) || chr(&3) ||'
,' || chr(&3) || '
)
from all_tab_columns
where table_name = upper('&2')
and owner = upper('&1')
and data_type not in ('LONG','LONG RAW');
REM
REM Remember that we concatenated an extra "||" on the end
REM of the last column. Can't leave it hanging, so put
REM another delimiter on the end to fix the statement's syntax.
REM
select 'chr(&3))' from dual;
REM
REM Now, tack on the predicate...
REM
select 'from &1' || '.' || '&2;' from dual;
spool off
REM Done with extract statement. Wanna see it?
set termout on
get cmd.sql
prompt
prompt Hit any key to start export, or <ctrl>-c to cancel
accept keypress
prompt
prompt Now exporting table: owner = &1
prompt table name = &2 ,
prompt delimited by ASCII(&3)
set termout off
set lines 1000
REM
REM Let's export some Data!!
REM
spool &2
@cmd.sql
spool off
host rm cmd.sql
set termout on
prompt "Export Completed."
REM
REM End of file.
---------------
Вариант для выгрузки в вид "insert into...":
set echo off
set feedback off head off
set pagesize 9999
ttitle off
set heading off
SET verify off
spool c:\work\asio\sql\$c.sql
declare
c number;
d number;
col_cnt integer;
f boolean;
rec_tab dbms_sql.desc_tab;
col_num number;
stmt varchar2(2000);
tab_name varchar2(32);
begin
dbms_output.new_line;
tab_name:='&1';
stmt:='select ''insert into '||tab_name||' (';
c := dbms_sql.open_cursor;
dbms_sql.parse(c, 'select * from '||tab_name, dbms_sql.native);
d := dbms_sql.execute(c);
dbms_sql.describe_columns(c, col_cnt, rec_tab);
col_num := rec_tab.first;
if (col_num is not null) then
dbms_output.new_line;
dbms_output.put_line(stmt);
loop
stmt:= ' '||rec_tab(col_num).col_name;
col_num := rec_tab.next(col_num);
if (col_num is not null) then
stmt:= stmt||', ';
end if;
dbms_output.put_line(stmt);
exit when (col_num is null);
end loop;
dbms_output.put_line(') values ');
dbms_output.put_line('(''');
col_num := rec_tab.first;
loop
stmt:= ' || '||rec_tab(col_num).col_name;
col_num := rec_tab.next(col_num);
if (col_num is not null) then
dbms_output.put_line(stmt||'||'', ');
dbms_output.put_line('''');
else
dbms_output.put_line(stmt);
end if;
exit when (col_num is null);
end loop;
dbms_output.put_line('||'');'' from '||tab_name||';');
end if;
dbms_sql.close_cursor(c);
end;
/
spool off
@c:\work\asio\sql\$c.sql
set heading on
set feedback on head on
set pagesize 20
set wrap on
ttitle on
set echo on
Вопрос: Как изменить параметры индекса первичного ключа?
alter table <TAB> disable primary key;
alter table <TAB> enable primary key using index storage (initial 256k next 256k);
Для Oracle 7.3 это работает.
Олег Цибульняк
Вопрос: Как ограничить соединения на Oracle 7.3 с определенных IP адресов?
В файле PROTOCOL.ORA (На сервере)
Только машины из списка:
TCP.INVETED_NODES=(host1.domain,192.168.1.1)
Все кроме:
TCP.EXCLUDED_NODES=(host1.domain,192.168.1.111,192.168.1.112)
и добавить:
TCP.VALIDNODE_CHECKING=YES
Best regards, Vadim Lejnin
Oracle and Unix Administrator company FORS
E-mail: lejnin@fors.ru
icq#20256486
Вопрос: Что значат цифры в версии Oracle?
Идентификация выпусков программного обеспечения ORACLE
Так как продукты Oracle находятся в процессе постоянного
развития и изменения, в любое время могут использоваться
несколько версий одного и того же продукта. Для полной
идентификации программного продукта может потребоваться до пяти
цифр. Например, дистрибутивная лента сервера ORACLE может быть
помечена как "Release 7.0.4.1". Следующие секции объясняют, как
трактовать такой номер.
Номер версии
------------
Номер версии, такой как 7, является наиболее общим
идентификатором. ВЕРСИЯ - это существенно новая редакция
программного обеспечения, которая обычно содержит значительные
новые возможности.
Номер сопровождения выпуска
---------------------------
Номер сопровождения выпуска обозначает различные выпуски
основной версии, начиная с нуля, как 7.0. Номер сопровождения
выпуска увеличивается по мере исправления ошибок или появления
новых возможностей в существующих программах.
Номер заплаты выпуска
---------------------
Номер заплаты выпуска идентифицирует специфический уровень
объектного кода, такой как 7.0.4. Заплата выпуска содержит
исправления серьезных ошибок, которые не позволяют ждать
очередного номера сопровождения выпуска. Первая дистрибуция
сопровождения выпуска всегда имеет номер заплаты 0.
Специфика платформы
-------------------
Четвертый (а иногда и пятый) номер может использоваться для
идентификации срочной заплаты для выпуска программного продукта
на платформе конкретной операционной системы, например, 7.0.4.1
или 7.0.4.1.3. Срочная заплата обычно не предназначена для
широкого распространения; она обычно исправляет или обходит
конкретную критическую проблему.
Примеры номеров выпусков
------------------------
Следующие примеры показывают возможные номера выпусков для
ORACLE:
7.0.0 первая дистрибуция ORACLE7 (технически - номер
сопровождения выпуска)
7.2.0 второе сопровождение выпуска ORACLE7 (хотя по
общему счету третье)
7.2.2 вторая заплата после второго сопровождения
выпуска
Проверка вашего текущего номера выпуска
---------------------------------------
Чтобы проверить, какой выпуск ORACLE и его компонент вы
используете, опросите словарный обзор V$VERSION, как показано
ниже:
SQLDBA> SELECT * FROM v$version
Вопрос: Опасность аутентификации через ОС?
> Хотел я было перевести народ на идентификацию через ОС, но вычитал, что
>тогда при соединении через многоканальный сервер "удаленный пользователь
>может внедрить пользователя из другой операционной системы используя
>сетевое соединение". Дело происходит на HP-UX 10.10, Oracle 7.3. Есть
сеточка c разными *NUX'ами и Win'95 c эмуляторами терминала, выходы "на улицу".
В некоторых случаях это реально.
Как я проверял в свое время это -
Есть Unix (hp-ux, но это не важно), на нем Oracle7.
В UNIX есть пользователь а, а в Oracle - OPS$a соответственно.
Если все клиенты(в смысле - задачи) на том же UNIX, то все OK -
сначала telnet (с любого эмулятора терминала не важно где) на UNIX, потом
connect / (для проверки - sqlplus /) и мы в базе.
(Кстати, в Informix'e только так и работают - у него нет своих
пользователей.....)
Если клиент на писюке или на другом UNIX, а пользователь тот же (OPS$a) -
все, безопасности конец. Нужно в
файле init.ora разрешить идентификацию удаленной ОС (OC_REMOTE_AU....(точно
не помню) =true.
НО - 95 винды - тоже ОПЕРАЦИОННАЯ СИСТЕМА (!). Поэтому в этом случае я
подхожу к писюку с 95,
говорю, что я пользователь а, вхожу в нее - тут проблем, увы, нет, даже если
есть домен NT - "a" в этом случае будет
докальным пользователем, но IP-стек ( а чаще всего в гетерогенной среде
работают с Oracle по нему) будет работать и дальше точно так же connect
/@tnsname (для проверки - sqlplus /@tnsname)
и мы вновь в базе. Вот этого и надо бояться.
Магданов Михаил
Нац. Банк. Республики Татарстан
mmg@nbrt.kazan.su
Вопрос: Как перенести индексы в другое табл.пространство?
SQL*Plus:
set heading off
set pages 0
spool mv_idx.sql
select 'alter index '||owner||'.'||index_name||' rebuild tablespace idx;'
from all_indexes;
spool off
@mv_idx.sql
Вопрос: Как импортировать dbf?
SQLLDR.
Создать таблицу (куда), создать управляющий файл типа:
LOAD DATA CHARACTERSET RU8PC866
INFILE "EMP.DBF" "DB3 52"
APPEND
INTO TABLE EMP WHEN (1) != '*'
(
EMPNO POSITION(2:5) INTEGER EXTERNAL,
ENAME POSITION(6:15) CHAR,
JOB POSITION(16:24) CHAR,
MGR POSITION(25:28) INTEGER EXTERNAL,
HIREDATE POSITION(29:36) DATE 'YYYYMMDD' NULLIF (HIREDATE) = ' . .',
SAL POSITION(37:43) DECIMAL EXTERNAL,
COMM POSITION(44:50) DECIMAL EXTERNAL,
DEPTNO POSITION(51:52) INTEGER EXTERNAL
)
Запустить SQLLDR USERID=orauser/password CONTROL=FILENAME.CTL
А вообще есть утилитка в дос - db3prep.exe, с ней проще.
--
Best regards.
Yury Evdokimov
Oracle and Unix Administrator company FORS
E-mail: jevdokimov@fors.ru
Еще ответ:
Извините за нескромность, но еще раз упомяну
http://www.geocities.com/SiliconValley/Ridge/8421/util.html
Там есть не только dbf->Oracle, но и наоборот: Oracle->dbf на Perl.
Пожелания по совершенствованию принимаются.
Вопрос: recover с потерей redo-файлов?
_ALLOW_RESETLOGS_CORRUPTED=TRUE
(http://www.orafaq.org/faqdbabr.htm)
http://ourworld.compuserve.com/homepages/db_wizard/undocumentedparameters.html
Вопрос: Логон с проверкой?
>Хотелось бы логониться к базе не сразу после запуска приложения, а после
>выяснения некоторых подробностей у пользоватея.
Делаешь триггер ON-LOGON:
-------------
logon(get_application_property(USERNAME),
get_application_property(PASSWORD), FALSE);
if not form_success then
raise form_trigger_failure;
end if;
-------------
Когда нужно войти, то :
-------------
logon(:THE_LOGON.USERNAME, :THE_LOGON.PASSWORD, FALSE);
if(form_success) then
go_block('EMP');
else
generic_alert('Invalid Logon!');
go_field('THE_LOGON.USERNAME');
end if;
-------------
Best regards,
Alexey Lapin
(mailto:lalx@usa.net)
Вопрос: Как написать триггер на несколько столбцов?
CREATE OR REPLACE TRIGGER my_trigger
BEFORE ( или AFTER ) UPDATE ON my_table
FOR EACH ROW
BEGIN
........
IF UPDATING ('MY_COLUMN_NAME') THEN
..........
END IF;
.......
END;
Хакерские методы восстановления инстанса
> Вопрос к профессионалам ( из ФОРСа и подобных организаций ) :
> Я слышал, что один товарисч ручками с помощью редактора бинарных файлов
> починил битый SYSTEM. Возможно ли, зная формат заголовка блока,
> "сделать нам красиво" ? Не верю, что невозможно!
>
> --
> Александр Кирпичев < brick@aha.ru >.
Совсем уж с помощью редактора наверное все-таки крутовато будет, но
я как-то разбирался во всем этом (Нужно было вытащить данные).
есть даже идея как это сделать.
Но до конечной стадии не дошло, данные потеряли актуальность и работы
свернули.
Все конечно не разобрал, но:
1) 1 блок - заголовок ( Ежу понятно :)))
2) 2 -- NN - block -- system rollback segment
Но нас интересует табличка bootstrap$. Судя по всему oracle в момент
старта
просто грузит ее из system в память, а затем используя стандартные средста
устанавливает все
свои базовые структуры.
Ищете стороку create rollback segment system - это первый блок bootstrap.
Там все что нужно!
Сысылку в заголовке на bootstrap я не нашел, положение его не фиксировано,
он зараза
гуляет по файлу даже если создать два инстанса подряд. Но правда легко
находится в теле.
Далее я планировал использовать следующее:
1) создаю новый инстанс из одного систем
2) подключаю к нему файлы битого инстанса путем пересоздания контрол файла.
3) используя bootstrap старого инстанца создаю обьекты старого в новом
учитывая новые номера файлов и переименовывая их.
теперь используя стандартные средства oracle можно получить доступ к данным
старого инстнса из нового.
Если кто займется этим, прошу написать мне, будет интересно!
Best regards, Vadim Lejnin
Oracle and Unix Administrator company FORS
E-mail: lejnin@fors.ru
icq#20256486
Вопрос: Как заставить консольные приложения Win писать по-русски?
Поставь (для Вин):
HKEY_LOCAL_MACHINE\Software\ORACLE\
NLS_LANG = "AMERICAN_AMERICA.CL8MSWIN1251" или
NLS_LANG="RUSSIAN_CIS.CL8MSWIN1251"
А в Дос запускай через батничек, допустим o.bat:
set nls_lang=russian_cis.ru8pc866
%1 %2 %3 %4 %5 %6 %7 %8 %9
c:\>o sqlplus scott/tiger@orcl
Вопрос: Как получить номер своей сессии?
SQL> select serial#, sid from v$session where audsid =
userenv( 'SESSIONID' );
SERIAL# SID
---------- ----------
87 29