Изглежда, че имате 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(*)
Зависи за какво използвате резултатите...