Получить имя базы в SQLPLUS : Oracle
внутри myc.sql в одном из селектов необходимо использовать имя базы (%_basename%).
т.е. запрос типа SELECT trunc((Z.CheckDate)) .
как в нем сделать вывод имени базы данных ?
%_basename% — не работает.
█ 03.12.2014 09:10
select name from v$database;
только хорошо бы озвучить конечную цель и скрипт привести. тебе нужен дескриптор соединения или именно имя базы?
если переменную передать, то вариант вызывать так
call sqlplus %_username%/%_password%@%_basename% @myc.sql %_basename%
select &1 from dual
█ 03.12.2014 09:46
Так пробовали.
Первый вариант не подходит — ORA-01031: insufficient privileges (коннектимся под пользователем supermag, без as sysdba).
Второй — также не подходит. В текстовый файл помимо результатов записывается результат подстановок типа:
old 1: select &1 from dual
new 1: select ZEL from dual
А нужны только результаты запросов.
Можно ли объявить переменную в скрипте, ей присвоить значение переданной переменной, потом уже SPOOL и сам запрос, в котором эту переменную использовать ?
█ 03.12.2014 10:18
SELECT ora_database_name FROM dual;
█ 03.12.2014 10:19
Starter ➤ Можно ли объявить переменную в скрипте, ей присвоить значение переданной переменной, потом уже SPOOL и сам запрос, в котором эту переменную использовать ?
В линуксе — можно, в убогой винде — не знаю, как.
В первом варианте права можно и дать (я, кстати, логинился юзером и без проблем достал).
Во втором задать set verify off, чтобы old/new не выводило.
Можно еще
select sys_context(‘userenv’,’db_name’) from dual;
█ 03.12.2014 10:34
Всем спасибо!
В убогой винде SELECT ora_database_name FROM dual; также работает.
только запрос почему то выводится на две строки. Первая — имя базы, вторая — данные запроса.
Второй вариант — сделать verify off сработал.
Сам запрос по первому варианту:
SELECT ora_database_name,chr(9), trunc((Z.CheckDate)) as Field1,chr(9).
█ 03.12.2014 10:42
в убогой винде нельзя нормально сделать Поток из нескольких строк в Windows-cmd, я это имел ввиду
что скрипт-то делает?
and Z.CheckDate in( to_date(sysdate-1))
█ 03.12.2014 10:53
Скрипт — собирает выручку, число чеков, средний чек, число позиций в чеках, среднее число позиций в чеке, потом это по почте рассылается заинтересованным лицам.
по поводу зря как-то — на самом деле это урезанный вариант, в оригинале было and Z.CheckDate in( to_date(sysdate-1),to_date(sysdate-365))
и сам текст запроса — из бизнес анализа, т.е. делаем там задачу, берем что получается, корректируем (добавляем разделители, форматирование) и подсовываем в sqlplus.
█ 03.12.2014 11:12
select DB_UNIQUE_NAME from v$database; select DB_NAME from v$database; select INSTANCE_NAME from v$instance; select global_name FROM global_name; select SYS_CONTEXT ('USERENV', 'INSTANCE_NAME') from dual; select SYS_CONTEXT ('USERENV', 'DB_NAME') from dual;
На виндах (set timing on у меня правда, но его тоже отключить недолга):
PROD>>set head off PROD>>set trim off PROD>>SELECT ora_database_name FROM dual; PROD.QQQQQ.COM Elapsed: 00:00:00.02
З.Ы. Я бы со скриптом не морочился, а наваял бы процедуру. Хотя я не знаю как там у вас в Супермаге с лицензированием в таком случае.
Oracle как узнать имя базы данных
Что должен возвращать следующий запрос?
SQL> SELECT ora_database_name FROM dual
Первое что приходит на ум, результатом выполнения этого запроса должно быть имя текущей базы данных. Но действительно ли всё это так просто, как кажется на самом деле? Попробуем разобраться, что же представляет на самом деле эта функция, каков её источник и как можно изменить результат, выводимый этой функцией.
Прежде чем приступить к непосредственному практическому изучению ora_database_name, вспомним, как трактуется она в документации Oracle. Единственное упоминание о ней мы найдем только в книге Oracle Database Application Developer’s Guide — Fundamentals в разделе Coding Triggers, где описывается, что она принадлежит к группе функций для идентификации атрибутов происшедшего события. Таких разнообразных функций на самом деле около тридцати, они все начинаются с префикса ora_ и используются в основном в системных триггерах. Судя по документации, наша функция ora_database_name должна выводить имя базы данных. Проверим, действительно ли это так:
SQL> SELECT ora_database_name FROM dual ORA_DATABASE_NAME ------------------------------------ ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM
Как видим, запрос возвращает склейку локального имени базы данных и доменного имени сетевой структуры, то есть глобальное имя базы данных. Посмотреть локальную составляющую можно с помощью следующего запроса:
SQL> SELECT name FROM v$database NAME ---- ORCL
А вот просмотр доменной вызовет трудности. По идее эти части должны определяться на уровне создания инициализационными параметрами базы данных db_name и db_domain. Посмотрим их значения:
SQL> SHOW PARAMETERS db_name Параметр Тип Значение -------- ------ -------- db_name string orcl SQL> SHOW PARAMETERS db_domain Параметр Тип Значение --------- ------ -------- db_domain string
Если с параметром db_name всё понятно, то параметр db_domain ничего не содержит. Откуда же тогда взялась эта вторая часть глобального имени? Скорее всего, это значение по умолчанию, так как db_domain до создания базы имел значение NULL. Теперь изменение вышеприведенных параметров ни как не повлияет на состав глобального имени. Если изменить первый параметр, база просто не откроется, а изменение значения второго параметра будет просто проигнорировано.
Ясно, что хоть эти параметры и участвуют в организации глобального имени на этапе создания базы данных, но они не являются источником для функции, которую мы рассматриваем. На самом деле ora_database_name это всего лишь публичный синоним, указывающий на функцию database_name, которая в свою очередь состоит из единственного вызова одноимённой функции database_name пакета dbms_standard. В свою очередь функция пакета, использует внешнюю С функцию.
Казалось, след потерян, доступа к функции нет. Но не всё так плохо. Есть одно системное представление global_name, содержимое которого идентично результату выполненного ранее нами запроса. Может оно приведёт нас к источнику нашей функции:
SQL> SELECT * FROM global_name GLOBAL_NAME ------------------------------------ ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM
Данное представление ссылается на строку с именем GLOBAL_DB_NAME в таблице props$ схемы sys. Эта таблица относится к словарю и содержит некоторые значения фиксированных параметров базы данных. Попробуем изменить это параметр прямо в таблице и посмотреть, изменится ли значение возвращаемое функцией ora_database_name:
SQL> UPDATE global_name SET global_name = 'ORCL2'; Изменено: 1 строка SQL> COMMIT; Commit complete SQL> SELECT ora_database_name FROM dual ORA_DATABASE_NAME ------------------------------------ ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM
Выводимый результат функции не изменился. Он изменится только после перезагрузки экземпляра. Но уже сейчас ясно, что строка GLOBAL_DB_NAME таблицы props$ не связана напрямую с результатом, который выводит функция ora_database_name.
И так, похоже, мы нашли способ, который изменит выводимое значение глобального имени. Но правка системной таблицы Oracle не самый лучший вариант. К счастью в Oracle есть команда ALTER DATABASE RENAME GLOBAL_NAME, которая предназначена для изменения глобального имени базы данных. Попробуем с её помощью изменить наше глобальное имя:
SQL> ALTER DATABASE RENAME GLOBAL_NAME TO ORCL3; База данных изменена SQL> SELECT ora_database_name FROM dual; ORA_DATABASE_NAME ----------------- ORCL3
Как видим, функция ora_database_name стала сразу выдавать необходимый нам результат, при этом нам не понадобилось даже перезагружать экземпляр. Правда в этом способе изменения глобального имени есть небольшая оговорка. Например, если у предыдущего имени есть доменная составляющая, то отбросить её с помощью ALTER DATABASE в новом имени уже не получиться:
SQL> ALTER DATABASE RENAME GLOBAL_NAME TO ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM; База данных изменена SQL> SELECT ora_database_name FROM dual; ORA_DATABASE_NAME ------------------------------------ ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM Выбрано: 1 строка SQL> ALTER DATABASE RENAME GLOBAL_NAME TO ORCL1; База данных изменена SQL> SELECT ora_database_name FROM dual; ORA_DATABASE_NAME ------------------------------------- ORCL1.REGRESS.RDBMS.DEV.US.ORACLE.COM Выбрано: 1 строка
Придётся комбинировать эти два способа:
SQL> UPDATE global_name SET global_name = 'ORCL2'; Изменено: 1 строка SQL> COMMIT; Commit complete SQL> ALTER DATABASE RENAME GLOBAL_NAME TO ORCL2; База данных изменена SQL> SELECT ora_database_name FROM dual; ORA_DATABASE_NAME ----------------- ORCL2 Выбрано: 1 строка
В заключение стоить отметить, что изменение вышеописанными способами глобального имени никаким образом не скажется на локальном имени базы данных. Выполним, к примеру, после всех изменений следующий запрос:
SQL> SELECT name FROM v$database NAME ---- ORCL
Локальное имя базы данных осталось прежним. Отсюда следует помнить, что локальная составляющая глобального имени должна всегда соответствовать локальному имени базы данных. Это следует учитывать при изменении глобального имени.
И так, результат достигнут. Мы узнали, что собой представляет функция ora_database_name и как можно изменить возвращаемое ею содержимое. Теперь можно сделать и выводы:
- Функция ora_database_name возвращает глобальное имя базы данных, состоящее из локальной составляющей и доменного имени сетевой инфраструктуры.
- Значение, возвращаемое функцией связанно с параметрами db_name и db_domain только на этапе создания базы данных. Их изменение в дальнейшем никак не повлияет на выводимый результат.
- Локальная составляющая выводимого значения (глобального имени) может отличаться от локального имени базы данных, но лучше этого не делать.
- Выводимое значение идентично фиксированному параметру GLOBAL_DB_NAME базы данных, значение которого храниться в таблице props$ схемы sys. Изменение этого значения оказывает влияние на выводимый результат, но только после перезагрузки экземпляра.
- Выводимое значение (глобальное имя) можно изменить с помощью команды ALTER DATABASE RENAME GLOBAL_NAME, при этом перезагрузка экземпляра не требуется. Команда никогда не откидывает доменную составляющую глобального имени. Для этого надо вручную изменять строку параметра GLOBAL_DB_NAME в таблице props$.
Самое популярное
- Практическое администрирование Oracle — Аудит. Часть1.
- RMAN в примерах — Быстрый старт. Глава 1.
- RMAN В ПРИМЕРАХ — Использование RMAN. Глава 3. Часть 2
- RMAN В ПРИМЕРАХ — Конфигурирование окружения RMAN. Глава 4. Часть 1.
- Дублирование базы данных с помощью RMAN. Часть 1.
Определение имени узла зоны и получение сетевого адреса
Следует определить имя узла зоны. При необходимости создания сетевых подключений для зоны ей следует назначить адрес IPv4 или настроить вручную и присвоить адрес IPv6.
Имя узла зоны
Выбранное имя узла зоны должно быть определено либо в базе данных hosts , либо в базе данных /etc/inet/hosts , в соответствии с файлом /etc/nsswitch.conf в глобальной зоне. Сетевые базы данных – это файлы, которые предоставляют информацию о конфигурации сети. Файл nsswitch.conf указывает, какая служба имен должна использоваться.
При использовании локальных файлов для службы имен база данных hosts ведется в файле /etc/inet/hosts . Имена узлов сетевых интерфейсов зоны из локальной базы данных hosts сопоставляются с записями в /etc/inet/hosts . В качестве альтернативы можно задать IP-адрес непосредственно при настройке зоны, что устраняет необходимость в процедуре сопоставления имени узла.
Сетевой адрес зоны с общим IP
Каждая зона с общим IP, требующая сетевых подключений, имеет один или несколько уникальных IP-адресов. Поддерживаются адреса IPv4 и IPv6.
Сетевой адрес IPv4 зоны
При использовании IPv4 необходимо получить адрес и присвоить его зоне.
Вместе с IP-адресом также можно указать длину префикса. Формат этого префикса – адрес / длина_префикса , например, 192.168.1.1/24. Таким образом, используемый адрес – 192.168.1.1, а маска – 255.255.255.0, т. е. первые 24 бита в маске установлены в единицы.
Сетевой адрес IPv6 зоны
При использовании IPv6 адрес задается вручную. Обычно необходимо задать как минимум два типа адресов:
Адрес, который является локальным для канала
Такой адрес имеет вид fe80:: 64-битный_идентификатор_интерфейсаID /10. Запись /10 указывает, что маска имеет длину 10 бит.
Адрес, сформированный на основе глобальной маски в подсети
Глобальный адрес при одноадресной передаче состоит из 64-битового префикса, который задается администратором для каждой подсети, и 64-битового идентификатора интерфейса. В любой системе в подсети, настроенной для использования IPv6, префикс может также быть получен при помощи команды ifconfig с параметром -a6 .
64-битовый идентификатор интерфейса обычно получают из MAC-адреса системы. Альтернативный уникальный адрес для использования в зонах может быть получен из адреса IPv4 глобальной зоны следующим образом:
16 битов в "0":старшие 16 битов адреса IPv4:младшие 16 битов адреса IPv4:уникальный номер зоны
Например, если IPv4-адрес глобальной зоны – 192.168.200.10, то подходящим локальным адресом для неглобальной зоны с уникальным номером 1 является fe80::c0a8:c80a:1/10. Если в этой подсети используется глобальная маска 2001:0db8:aabb:ccdd/64, то уникальный глобальный адрес при одноадресной передаче для той же самой неглобальной зоны – 2001:0db8:aabb:ccdd::c0a8:c80a:1/64 . При настройке IPv6-адреса необходимо указать длину префикса.
Для получения дополнительной информации о локальных и глобальных адресах при одноадресной передаче см. справочную страницу inet6(7P).
Сетевой адрес зоны с эксклюзивным IP
В зоне с эксклюзивным IP адреса настраиваются аналогично адресам в глобальной зоне. Следует отметить, что настройка DHCP и неизменяемого адреса IPv6 может быть произведена автоматически.
Для получения дополнительной информации см. sysidcfg(4).
- Previous: Анализ текущей настройки системы
- Next: Настройка файловой системы
Oracle как узнать имя базы данных
Рейтинг (т): 26
Цитата Duncan MacLeod @ 02.10.08, 04:57
В винде узнать какие есть базы вы можете с помощью Служб, ищите все службы, которые начинаются с «OracleService*». В Linux это можно узнать вызвав rcoracle status (как-то так, читайте доку).
и то не факт, т.к. там находятся только службы, которые запущены на локальной машине. все доступные оракловые сервера достоверно не получить.
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Базы данных: SQL
- Следующая тема
- Форум на Исходниках.RU
- Базы данных
- Базы данных: SQL