Você parece ter um
heredoc
contendo um único comando SQL*Plus, embora não pareça correto conforme observado nos comentários. Você pode passar um valor no heredoc
:sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
ou se
BUILDING
é $2
em seu roteiro:sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Se o seu
file.sql
teve uma exit
no final, seria ainda mais simples, pois você não precisaria do heredoc
:sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
Em seu SQL, você pode consultar os parâmetros de posição usando variáveis de substituição:
...
}',SEM_Models('&1'),NULL,
...
O
&1
será substituído pelo primeiro valor passado para o script SQL, BUILDING
; porque essa é uma string, ela ainda precisa ser colocada entre aspas. Você pode querer set verify off
para parar se estiver mostrando as substituições na saída. Você pode passar vários valores e referenciá-los sequencialmente, assim como faria com parâmetros posicionais em um script de shell - o primeiro parâmetro passado é
&1
, o segundo é &2
, etc. Você pode usar variáveis de substituição em qualquer lugar no script SQL, para que possam ser usadas como aliases de coluna sem problemas - você só precisa ter cuidado ao adicionar um parâmetro extra que você adiciona ao final da lista (o que torna a numeração fora de ordem no script, potencialmente) ou ajuste tudo para corresponder:sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF
ou:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF
Se
total_count
está sendo passado para o seu shell script, então use seu parâmetro posicional, $4
como queiras. E seu SQL seria então: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));
Se você passar muitos valores, poderá achar mais claro usar os parâmetros posicionais para definir parâmetros nomeados, portanto, todos os problemas de ordenação são tratados no início do script, onde são mais fáceis de manter:
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));
Da sua pergunta separada, talvez você só quisesse:
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));
... então o alias será o mesmo valor que você está consultando (o valor em
$2
, ou BUILDING
na parte original da resposta). Você pode fazer referência a uma variável de substituição quantas vezes quiser. Isso pode não ser fácil de usar se você estiver executando várias vezes, pois aparecerá como um cabeçalho acima do valor de contagem em cada bit de saída. Talvez isso seja mais analisável mais tarde:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Se você
set pages 0
e set heading off
, suas chamadas repetidas podem aparecer em uma lista organizada. Você também pode precisar set tab off
e possivelmente use rpad('&1', 20)
ou similar para fazer com que a coluna tenha sempre a mesma largura. Ou obtenha os resultados como CSV com:select '&1' ||','|| COUNT(*)
Depende para que você está usando os resultados para ...