Oracle FAQ

Как восстановить БД имея холодный бэкап и архивлоги "по-сейчас"?
Как вернуть первую строку из отсортированного диапазона?
Как запустить инсталлятор Oracle8i Release 3 (8.1.7) на P4 Win XP/Win 2000?
Как вернуть PL/SQL таблицу из пакета в SELECT?
Как заставить Oracle забыть про удаленный файл данных?
Где взять патчи для Oracle?
Как изменить приглашение sqlplus с 'SQL> ' на более информативное?
Как определить rowid cтроки сразу после вставки (pl/sql)?
База на Win NT/2000 не стартует автоматически?
Как изменить кодировку сервера?
program too large.
Как узнать количество обработанных строк в pl/sql?
Как убить зависшую сессию под NT?
Где найти список недокументированных параметров Oracle?
Что можно узнать о машине клиента из PL/SQL?
Как в SQLLoader пропустить поле переменной длины?
Как использовать Oracle за FireWall?
Как заствавить Oracle не выгpужать SGA в своп?
Как отложить проверку констрейна до окончания транзакции?
Что значит сообщение:'Input truncated to 1 characters'?
Как создать функцию в пакете?
О настройке shared pool.
Как изменить значение sequence?
Как вывести сумму в рублях и коп. прописью?
Формат файла дампа (.dmp)?
Как переименовать колонку в таблице?
to_char в pl/sql.
Как мигрировать с 7 на 8 без экспорта-импорта?
Перекодировка при экспорте-импорте.
Пример скрипта для бэкапа.
Пример скрипта для экспорта данных в файл с разделителями.
Как изменить параметры индекса первичного ключа?
Как ограничить соединения на Oracle 7.3 с определенных IP адресов?
Что значат цифры в версии Oracle?
Опасность аутентификации через ОС?
Как перенести индексы в другое табл.пространство?
Как импортировать dbf?
recover с потерей redo-файлов?
Логон с проверкой?
Как написать триггер на несколько столбцов?
Хакерские методы восстановления инстанса
Как заставить консольные приложения Win писать по-русски?
Как получить номер своей сессии?
Ссылки по Oracle

Вопрос: Как восстановить БД имея холодный бэкап и архивлоги "по-сейчас"? "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
Hosted by uCoz