Wygląda na to, że masz heredoc
zawierające pojedyncze polecenie SQL*Plus, chociaż nie wygląda dobrze, jak zaznaczono w komentarzach. Możesz przekazać wartość w heredoc
:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
lub jeśli BUILDING
to $2
w twoim skrypcie:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Jeśli Twój file.sql
miał exit
na końcu byłoby to jeszcze prostsze, ponieważ nie potrzebujesz heredoc
:
sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
W swoim SQL możesz następnie odwołać się do parametrów pozycji za pomocą zmiennych podstawiania:
...
}',SEM_Models('&1'),NULL,
...
&1
zostanie zastąpiona pierwszą wartością przekazaną do skryptu SQL, BUILDING
; ponieważ jest to ciąg, który nadal musi być ujęty w cudzysłowy. Możesz set verify off
zatrzymać, jeśli pokaże Ci podstawienia w danych wyjściowych.
Możesz przekazać wiele wartości i odwoływać się do nich sekwencyjnie, tak jak w przypadku parametrów pozycyjnych w skrypcie powłoki — pierwszy przekazany parametr to &1
, drugi to &2
itp. Zmiennych podstawiania można używać w dowolnym miejscu w skrypcie SQL, dzięki czemu bez problemu można ich używać jako aliasów kolumn - wystarczy uważać na dodanie dodatkowego parametru, który albo dodasz na końcu listy (co sprawia, że numeracja niewłaściwa w skrypcie, potencjalnie) lub dostosuj wszystko, aby pasowało:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF
lub:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF
Jeśli total_count
jest przesyłany do skryptu powłoki, użyj jego parametru pozycyjnego $4
lub cokolwiek. Twój SQL będzie wtedy wyglądał następująco:
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));
Jeśli przekażesz wiele wartości, może się okazać, że jaśniejsze może być użycie parametrów pozycyjnych do zdefiniowania nazwanych parametrów, więc wszelkie problemy z porządkowaniem są rozwiązywane na początku skryptu, gdzie są łatwiejsze w utrzymaniu:
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));
Z twojego oddzielnego pytania, może po prostu chciałeś:
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));
... więc alias będzie miał tę samą wartość, o którą pytasz (wartość w $2
lub BUILDING
w oryginalnej części odpowiedzi). Możesz odwoływać się do zmiennej podstawienia tyle razy, ile chcesz.
Może to nie być łatwe w użyciu, jeśli uruchamiasz go wiele razy, ponieważ pojawi się jako nagłówek nad wartością licznika w każdym bicie danych wyjściowych. Może później będzie to bardziej analizowalne:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Jeśli set pages 0
i set heading off
, Twoje powtarzające się połączenia mogą pojawić się na uporządkowanej liście. Może być również konieczne set tab off
i ewentualnie użyj rpad('&1', 20)
lub podobne, aby kolumna miała zawsze tę samą szerokość. Lub uzyskaj wyniki w formacie CSV za pomocą:
select '&1' ||','|| COUNT(*)
Zależy, do czego używasz wyników...