2013-07-10 4 views
3

У меня есть скрипт, который вызывает file.sqlкак передать переменную из сценария оболочки для Sqlplus

Я ищу способ, чтобы передать некоторые параметры моей file.sql.

Если я не передаю переменную с некоторым значением в sql-скрипт, мне придется создавать несколько файлов .sql с помощью инструкции SELECT, и все, что изменилось бы, будет несколько слов.

Мой сценарий оболочки вызывает file.sql:

sqlplus -S user/[email protected] 
echo " Processing triples" 
./load_triples.sh BUILDING/Mapping_File BUILDING Y >> load_semantic.log 

@/opt/D2RQ/file.sql 
exit; 
EOF 

И это, как мой file.sql выглядит следующим образом:

SET ECHO ON; 
SPOOL count.log 

SELECT COUNT(*) as total_count 
FROM TABLE(SEM_MATCH(
'{ 
     ?s rdf:type :ProcessSpec . 
     ?s ?p ?o 
}',SEM_Models('BUILDING'),NULL, 
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL)); 

SPOOL OFF; 

Могу ли я изменить мой сценарий оболочки так, что она проходит имена переменных?

I.e .: model = "BUILDING" и передать это на file.sql?

Есть ли что-нибудь подобное?

+0

Ваш сценарий оболочки выглядит как это было искажено немного; это 'load_triples.sh' скрипт, а вызов' sqlplus' находится прямо перед строкой '@/opt/...'? –

+1

См. Этот ответ: http://stackoverflow.com/questions/2236201/how-can-i-pass-parameter-to-sql-script. Вы можете добавить аргументы в SQL-строку и ссылку с использованием & 1 вида обозначений. – user1676075

ответ

9

У вас, кажется, есть heredoc, содержащий одну команду SQL * Plus, хотя она не выглядит так, как указано в комментариях. Вы можете либо передать значение в heredoc:

sqlplus -S user/[email protected] << EOF 
@/opt/D2RQ/file.sql BUILDING 
exit; 
EOF 

или если BUILDING в вашем сценарии $2:

sqlplus -S user/[email protected] << EOF 
@/opt/D2RQ/file.sql $2 
exit; 
EOF 

Если ваш file.sql был exit в конце, то это было бы еще проще, как вы не будет нуждаться в heredoc:

sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2 

в вашем SQL вы можете обратиться к пара-положении метров using substitution variables:

... 
}',SEM_Models('&1'),NULL, 
... 

&1 будет заменен с первым значением, переданным в сценарий SQL, BUILDING; потому что это строка, которую все еще нужно заключить в кавычки. Возможно, вы захотите, чтобы set verify off остановился, если вы покажете вам замены на выходе.


Вы можете передать несколько значений, и обращаться к ним последовательно так же, как вы бы позиционные параметры в сценарии оболочки - первый передаваемый параметр является &1, второй &2 и т.д. Вы можете использовать переменные подстановки в любом месте SQL-сценарий, поэтому они могут использоваться как псевдонимы столбцов без проблем - вам просто нужно быть осторожным, добавляя дополнительный параметр, который вы либо добавляете в конец списка (что делает нумерацию не в порядке в скрипте, потенциально) или отрегулировать все, чтобы они соответствовали:

sqlplus -S user/[email protected] << EOF 
@/opt/D2RQ/file.sql total_count BUILDING 
exit; 
EOF 

или:

sqlplus -S user/[email protected] << EOF 
@/opt/D2RQ/file.sql total_count $2 
exit; 
EOF 

Если total_count это передается в сценарий оболочки затем просто использовать его позиционный параметр $4 или любой другой.И ваш SQL бы тогда:

SELECT COUNT(*) as &1 
FROM TABLE(SEM_MATCH(
'{ 
     ?s rdf:type :ProcessSpec . 
     ?s ?p ?o 
}',SEM_Models('&2'),NULL, 
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL)); 

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

define MY_ALIAS = &1 
define MY_MODEL = &2 

SELECT COUNT(*) as &MY_ALIAS 
FROM TABLE(SEM_MATCH(
'{ 
     ?s rdf:type :ProcessSpec . 
     ?s ?p ?o 
}',SEM_Models('&MY_MODEL'),NULL, 
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL)); 

ваш отдельный вопрос, может быть, вы просто хотели:

SELECT COUNT(*) as &1 
FROM TABLE(SEM_MATCH(
'{ 
     ?s rdf:type :ProcessSpec . 
     ?s ?p ?o 
}',SEM_Models('&1'),NULL, 
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL)); 

... так что псевдоним будет тем же значением, на которое вы запрашиваете (значение в $2, или BUILDING в исходной части ответа). Вы можете ссылаться на переменную замещения столько раз, сколько хотите.

Это может быть непросто использовать, если вы используете его несколько раз, так как оно будет отображаться в виде заголовка над значением счета в каждом бите вывода. Может быть, это было бы более интерпретируемым позже:

select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT 

Если вас set pages 0 и set heading off, ваши повторные вызовы могут появиться в аккуратном списке. Вам также может понадобиться set tab off и, возможно, использовать rpad('&1', 20) или аналогично, чтобы этот столбец всегда был одинаковой ширины. Или получить результаты в формате CSV с:

select '&1' ||','|| COUNT(*) 

Зависит, что вы используете результаты для ...

+0

спасибо @Alex Poole – Angelina

+0

Есть ли способ для псевдонима, в моем случае «total_count» иметь имя, связанное с переданным именем строки? то есть «SELECT COUNT (*) как $ 1 ... ' – Angelina

+0

@ Ангелина. Я обновил ответ с помощью примера с использованием псевдонима с переменной позиционного замещения. Надеюсь, это то, что вы имели в виду. –

Смежные вопросы