02.12.2014 21:30
Starter
 
Помогите в скрипте (выполняемом батником) получить имя базы.
т.е. вызываем sqlplus
call sqlplus %_username%/%_password%@%_basename% @myc.sql

внутри myc.sql в одном из селектов необходимо использовать имя базы (%_basename%).
т.е. запрос типа SELECT trunc((Z.CheckDate)) .....
как в нем сделать вывод имени базы данных ?
%_basename% - не работает.
03.12.2014 09:10
OlegON
 
как-то так...
Цитата:
select name from v$database;
только хорошо бы озвучить конечную цель и скрипт привести... тебе нужен дескриптор соединения или именно имя базы?
если переменную передать, то вариант вызывать так
Цитата:
call sqlplus %_username%/%_password%@%_basename% @myc.sql %_basename%
и потом
Цитата:
select &1 from dual
03.12.2014 09:46
Starter
 
Так пробовали.
Первый вариант не подходит - 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
vdm
 
А так
Код:
SELECT ora_database_name FROM dual;
03.12.2014 10:19
OlegON
 
Цитата:
Starter Можно ли объявить переменную в скрипте, ей присвоить значение переданной переменной, потом уже SPOOL и сам запрос, в котором эту переменную использовать ?
В линуксе - можно, в убогой винде - не знаю, как...
В первом варианте права можно и дать (я, кстати, логинился юзером и без проблем достал).
Во втором задать set verify off, чтобы old/new не выводило.
Можно еще
Цитата:
select sys_context('userenv','db_name') from dual;
03.12.2014 10:34
Starter
 
Всем спасибо!
В убогой винде SELECT ora_database_name FROM dual; также работает.
только запрос почему то выводится на две строки. Первая - имя базы, вторая - данные запроса.

Второй вариант - сделать verify off сработал.

Сам запрос по первому варианту:
SELECT ora_database_name,chr(9), trunc((Z.CheckDate)) as Field1,chr(9),......

второй вариант (рабочий)
SELECT '&1',chr(9), trunc((Z.CheckDate)) as Field1,chr(9),rtrim(TO_CHAR(round((SUM((decode(Z.IsSale,'1',S.TotalSum,0))-(decode(Z.IsSale,'1',0,S.TotalSum)))),2),'999999999D99MI','nls_numeric_characters='', ''')) as Field2,CHR(9),round((SUM(decode(S.Item,1,decode(Z.OpCode,1,1,-1),0))),0) as Field7,CHR(9),rtrim(TO_CHAR(round((round((SUM((decode(Z.IsSale,'1',S.TotalSum,0))-(decode(Z.IsSale,'1',0,S.TotalSum)))),2)/round((SUM(decode(S.Item,1,decode(Z.OpCode,1,1,-1),0))),0)),2),'999999999D99MI','nls_numeric_characters='', ''')) as Field8,CHR(9),round((COUNT(DISTINCT Z.CheckPK||S.Article)),0) as Field9,CHR(9),rtrim(TO_CHAR(round((round((COUNT(DISTINCT Z.CheckPK||S.Article)),0)/round((SUM(decode(S.Item,1,decode(Z.OpCode,1,1,-1),0))),0)),2),'999999999D99MI','nls_numeric_characters='', ''')) as Field10
FROM SVAnalyticsCheckItems S,SVAnalyticsCheck Z
WHERE Z.LocID=S.LocID and Z.DeskNum=S.DeskNum and Z.ZNum=S.ZNum and Z.CheckNum=S.CheckNum
and Z.CheckDate in( to_date(sysdate-1))
GROUP BY trunc((Z.CheckDate))
ORDER BY 1 ASC;
03.12.2014 10:42
OlegON
 
в убогой винде нельзя нормально сделать Поток из нескольких строк в Windows-cmd, я это имел ввиду
что скрипт-то делает?

Цитата:
and Z.CheckDate in( to_date(sysdate-1))
зря как-то...
03.12.2014 10:53
Starter
 
Скрипт - собирает выручку, число чеков, средний чек, число позиций в чеках, среднее число позиций в чеке, потом это по почте рассылается заинтересованным лицам.

по поводу зря как-то - на самом деле это урезанный вариант, в оригинале было and Z.CheckDate in( to_date(sysdate-1),to_date(sysdate-365))
и сам текст запроса - из бизнес анализа, т.е. делаем там задачу, берем что получается, корректируем (добавляем разделители, форматирование) и подсовываем в sqlplus.
03.12.2014 11:12
bayan
 
Код:
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

З.Ы. Я бы со скриптом не морочился, а наваял бы процедуру. Хотя я не знаю как там у вас в Супермаге с лицензированием в таком случае...
03.12.2014 11:14
OlegON
 
прав у него нет на первые две...
Часовой пояс GMT +3, время: 14:32.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.