Anda tampaknya memiliki heredoc
berisi satu perintah SQL*Plus, meskipun tidak terlihat benar seperti yang disebutkan dalam komentar. Anda dapat memberikan nilai dalam heredoc
:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
atau jika BUILDING
adalah $2
dalam skrip Anda:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Jika file.sql
Anda memiliki exit
pada akhirnya akan lebih sederhana karena Anda tidak memerlukan heredoc
:
sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
Dalam SQL Anda, Anda kemudian dapat merujuk ke parameter posisi menggunakan variabel substitusi:
...
}',SEM_Models('&1'),NULL,
...
&1
akan diganti dengan nilai pertama yang diteruskan ke skrip SQL, BUILDING
; karena itu adalah string, itu masih harus diapit oleh tanda kutip. Anda mungkin ingin set verify off
untuk berhenti jika menunjukkan substitusi pada output.
Anda dapat meneruskan beberapa nilai, dan merujuknya secara berurutan seperti halnya parameter posisi dalam skrip shell - parameter yang diteruskan pertama adalah &1
, yang kedua adalah &2
, dll. Anda dapat menggunakan variabel substitusi di mana saja dalam skrip SQL, sehingga variabel tersebut dapat digunakan sebagai alias kolom tanpa masalah - Anda hanya perlu berhati-hati menambahkan parameter tambahan yang Anda tambahkan ke akhir daftar (yang membuat penomoran yang salah dalam skrip, berpotensi) atau sesuaikan semuanya agar sesuai:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF
atau:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF
Jika total_count
sedang diteruskan ke skrip Shell Anda lalu gunakan saja parameter posisinya, $4
atau terserah. Dan SQL Anda akan menjadi:
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));
Jika Anda melewatkan banyak nilai, Anda mungkin merasa lebih jelas untuk menggunakan parameter posisi untuk menentukan parameter bernama, jadi semua masalah pengurutan ditangani di awal skrip, di mana mereka lebih mudah dirawat:
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));
Dari pertanyaan terpisah Anda, mungkin Anda hanya ingin:
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));
... jadi alias akan menjadi nilai yang sama dengan yang Anda tanyakan (nilai dalam $2
, atau BUILDING
di bagian asli dari jawaban). Anda dapat merujuk ke variabel substitusi sebanyak yang Anda inginkan.
Itu mungkin tidak mudah digunakan jika Anda menjalankannya beberapa kali, karena akan muncul sebagai header di atas nilai hitungan di setiap bit keluaran. Mungkin ini akan lebih mudah diuraikan nanti:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Jika Anda set pages 0
dan set heading off
, panggilan berulang Anda mungkin muncul dalam daftar yang rapi. Anda mungkin juga perlu set tab off
dan mungkin menggunakan rpad('&1', 20)
atau serupa untuk membuat kolom itu selalu sama lebarnya. Atau dapatkan hasilnya sebagai CSV dengan:
select '&1' ||','|| COUNT(*)
Tergantung untuk apa Anda menggunakan hasilnya...