Oracle
 sql >> Baza danych >  >> RDS >> Oracle

jak przekazać zmienną ze skryptu powłoki do sqlplus

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wykrywanie cykli z rekurencyjnym faktoringiem podzapytań

  2. Funkcja POWER() w Oracle

  3. Alternatywne sterowniki Oracle dla .net

  4. ADDM na SearchOracle.com

  5. Eksportuj dane do Excela z tabeli Oracle za pomocą PL SQL