Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

cara meneruskan variabel dari skrip shell ke sqlplus

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan input dari pengguna saat runtime

  2. Pilih sampel hasil acak dari hasil kueri

  3. Karakter escape Oracle SQL (untuk '&')

  4. Membuat pemicu untuk hanya berjalan ketika tabel baru sedang dibuat

  5. Daftar Parameter NLS di Oracle Database