Zdá se, že máte heredoc
obsahující jeden příkaz SQL*Plus, i když to nevypadá správně, jak je uvedeno v komentářích. Hodnotu můžete předat buď v heredoc
:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
nebo pokud BUILDING
je $2
ve vašem skriptu:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Pokud váš file.sql
měl exit
na konci by to bylo ještě jednodušší, protože byste nepotřebovali heredoc
:
sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
Ve vašem SQL pak můžete odkazovat na parametry pozice pomocí substitučních proměnných:
...
}',SEM_Models('&1'),NULL,
...
&1
bude nahrazena první hodnotou předanou skriptu SQL, BUILDING
; protože se jedná o řetězec, musí být stále uzavřen v uvozovkách. Možná budete chtít set verify off
zastavit, pokud vám ve výstupu zobrazuje substituce.
Můžete předat více hodnot a odkazovat na ně postupně stejně jako na poziční parametry ve skriptu shellu – první předaný parametr je &1
, druhý je &2
, atd. Substituční proměnné můžete použít kdekoli ve skriptu SQL, takže je lze bez problémů použít jako aliasy sloupců - musíte být opatrní při přidávání dalšího parametru, který buď přidáte na konec seznamu (což dělá číslování ve skriptu může být mimo pořadí) nebo vše upravte tak, aby odpovídalo:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF
nebo:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF
Pokud total_count
je předán vašemu shellovému skriptu, pak stačí použít jeho poziční parametr $4
nebo cokoli jiného. A vaše SQL by pak bylo:
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));
Pokud předáte hodně hodnot, může vám být jasnější používat poziční parametry k definování pojmenovaných parametrů, takže všechny problémy s řazením jsou řešeny na začátku skriptu, kde se snáze udržují:
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 vaší samostatné otázky jste možná jen chtěli:
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));
... takže alias bude mít stejnou hodnotu, na kterou se dotazujete (hodnota v $2
nebo BUILDING
v původní části odpovědi). Na substituční proměnnou se můžete odkazovat, kolikrát chcete.
To nemusí být snadné, pokud jej spouštíte vícekrát, protože se zobrazí jako záhlaví nad hodnotou počtu v každém bitu výstupu. Možná by to bylo později lépe analyzovatelné:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Pokud set pages 0
a set heading off
, vaše opakované hovory se mohou objevit v přehledném seznamu. Možná budete také muset set tab off
a případně použijte rpad('&1', 20)
nebo podobně, aby měl sloupec vždy stejnou šířku. Nebo získejte výsledky jako CSV s:
select '&1' ||','|| COUNT(*)
Záleží, k čemu výsledky používáte...