Изглежда, че имате heredoc съдържаща една команда SQL*Plus, въпреки че не изглежда правилно, както е отбелязано в коментарите. Можете или да предадете стойност в heredoc :
sqlplus -S user/example@sqldat.com << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
или ако BUILDING е $2 във вашия скрипт:
sqlplus -S user/example@sqldat.com << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Ако вашият file.sql имаше exit накрая ще бъде още по-просто, тъй като няма да имате нужда от heredoc :
sqlplus -S user/example@sqldat.com @/opt/D2RQ/file.sql $2
След това във вашия SQL можете да се обърнете към параметрите на позицията, като използвате заместващи променливи:
...
}',SEM_Models('&1'),NULL,
...
&1 ще бъде заменен с първата стойност, предадена на SQL скрипта, BUILDING; тъй като това е низ, той все още трябва да бъде затворен в кавички. Може да искате да set verify off за да спре, ако ви покаже заместванията в изхода.
Можете да предавате множество стойности и да ги препращате последователно, точно както бихте направили позиционни параметри в скрипт на обвивката - първият предаден параметър е &1 , вторият е &2 , и т.н. Можете да използвате заместващи променливи навсякъде в SQL скрипта, така че да могат да се използват като псевдоними на колони без проблем - просто трябва да внимавате да добавяте допълнителен параметър, който или да го добавите в края на списъка (което прави номерацията е неправилна в скрипта, потенциално) или коригирайте всичко, за да съвпада:
sqlplus -S user/example@sqldat.com << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF
или:
sqlplus -S user/example@sqldat.com << 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('','https://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('','https://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('','https://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(*)
Зависи за какво използвате резултатите...