У вас, кажется, есть 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(*)
Зависит, что вы используете результаты для ...
Ваш сценарий оболочки выглядит как это было искажено немного; это 'load_triples.sh' скрипт, а вызов' sqlplus' находится прямо перед строкой '@/opt/...'? –
См. Этот ответ: http://stackoverflow.com/questions/2236201/how-can-i-pass-parameter-to-sql-script. Вы можете добавить аргументы в SQL-строку и ссылку с использованием & 1 вида обозначений. – user1676075