Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

como passar variável do script de shell para o sqlplus


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 ...