sql >> Databáze >  >> RDS >> Oracle

jak předat proměnnou ze skriptu shellu do sqlplus

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




  1. Odhad mohutnosti predikátu na výrazu COUNT

  2. Naučte se návrh databáze pomocí SQL Server Management Studio (SSMS) – část 2

  3. MySQL:Jak resetovat nebo změnit kořenové heslo MySQL?

  4. Node.js se nemůže ověřit pro MySQL 8.0