sql >> Base de Datos >  >> RDS >> Oracle

cómo pasar la variable del script de shell a sqlplus

Parece que tienes un heredoc que contiene un solo comando SQL*Plus, aunque no se ve bien como se indica en los comentarios. Puede pasar un valor en el heredoc :

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

o si BUILDING es $2 en su guión:

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

Si su file.sql tenía una exit al final, sería aún más simple ya que no necesitarías el heredoc :

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

En su SQL, puede consultar los parámetros de posición utilizando variables de sustitución:

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

El &1 será reemplazado con el primer valor pasado al script SQL, BUILDING; debido a que es una cadena, aún debe estar entre comillas. Es posible que desee set verify off para detenerse si le muestra las sustituciones en la salida.

Puede pasar varios valores y hacer referencia a ellos secuencialmente como lo haría con los parámetros posicionales en un script de shell:el primer parámetro pasado es &1 , el segundo es &2 , etc. Puede usar variables de sustitución en cualquier parte del script SQL, por lo que se pueden usar como alias de columna sin problemas; solo debe tener cuidado al agregar un parámetro adicional que lo agrega al final de la lista (lo que hace que la numeración fuera de orden en el script, potencialmente) o ajuste todo para que coincida:

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

o:

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

Si total_count se está pasando a su script de shell, luego use su parámetro posicional, $4 o lo que sea. Y su SQL sería entonces:

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));

Si pasa muchos valores, puede que le resulte más claro usar los parámetros posicionales para definir parámetros con nombre, por lo que cualquier problema de ordenación se trata al comienzo de la secuencia de comandos, donde es más fácil de mantener:

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));

De su pregunta separada, tal vez solo quería:

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));

... por lo que el alias tendrá el mismo valor que está consultando (el valor en $2 , o BUILDING en la parte original de la respuesta). Puede hacer referencia a una variable de sustitución tantas veces como desee.

Puede que no sea fácil de usar si lo está ejecutando varias veces, ya que aparecerá como un encabezado sobre el valor de conteo en cada bit de salida. Tal vez esto sería más analizable más adelante:

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

Si set pages 0 y set heading off , sus llamadas repetidas pueden aparecer en una lista ordenada. Es posible que también deba set tab off y posiblemente use rpad('&1', 20) o similar para que esa columna siempre tenga el mismo ancho. O obtenga los resultados como CSV con:

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

Depende para qué estés usando los resultados...