Oracle
 sql >> база данни >  >> RDS >> Oracle

как да предадете променлива от shell скрипт към sqlplus

Изглежда, че имате heredoc съдържаща една команда SQL*Plus, въпреки че не изглежда правилно, както е отбелязано в коментарите. Можете или да предадете стойност в heredoc :

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

или ако BUILDING е $2 във вашия скрипт:

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

Ако вашият file.sql имаше exit накрая ще бъде още по-просто, тъй като няма да имате нужда от heredoc :

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

След това във вашия SQL можете да се обърнете към параметрите на позицията, като използвате заместващи променливи:

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

&1 ще бъде заменен с първата стойност, предадена на SQL скрипта, BUILDING; тъй като това е низ, той все още трябва да бъде затворен в кавички. Може да искате да set verify off за да спре, ако ви покаже заместванията в изхода.

Можете да предавате множество стойности и да ги препращате последователно, точно както бихте направили позиционни параметри в скрипт на обвивката - първият предаден параметър е &1 , вторият е &2 , и т.н. Можете да използвате заместващи променливи навсякъде в SQL скрипта, така че да могат да се използват като псевдоними на колони без проблем - просто трябва да внимавате да добавяте допълнителен параметър, който или да го добавите в края на списъка (което прави номерацията е неправилна в скрипта, потенциално) или коригирайте всичко, за да съвпада:

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

или:

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

Ако total_count се предава на вашия шел скрипт, тогава просто използвайте неговия позиционен параметър, $4 или каквото и да е. И тогава вашият SQL ще бъде:

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

Ако предадете много стойности, може да ви е по-ясно да използвате позиционните параметри за дефиниране на наименувани параметри, така че всички проблеми с подреждането се решават в началото на скрипта, където е по-лесно да се поддържат:

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

От вашия отделен въпрос може би просто сте искали:

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

... така че псевдонимът ще бъде същата стойност, към която отправяте заявка (стойността в $2 , или BUILDING в оригиналната част на отговора). Можете да се обърнете към променлива за заместване толкова пъти, колкото искате.

Това може да не е лесно за използване, ако го стартирате няколко пъти, тъй като ще се появи като заглавка над стойността на броене във всеки бит изход. Може би това ще бъде по-разбираемо по-късно:

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

Ако set pages 0 и set heading off , многократните ви повиквания може да се появят в изряден списък. Може също да се наложи да set tab off и евентуално използвайте rpad('&1', 20) или подобно, за да направи тази колона винаги една и съща ширина. Или вземете резултатите като CSV с:

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

Зависи за какво използвате резултатите...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да форматирам своите заявки за Oracle, така че колоните да не се обвиват?

  2. Как да получите века от дата в Oracle

  3. Защо изборът на определени колони и всичко това е грешно в Oracle SQL?

  4. Можем ли да използваме нишки в PL/SQL?

  5. Набор за тестове за настройка на AOL/J