Bagaimana cara mengabaikan ampersand dalam skrip SQL yang dijalankan dari SQL Plus?

104

Saya memiliki skrip SQL yang membuat paket dengan komentar yang berisi ampersand (&). Ketika saya menjalankan skrip dari SQL Plus, saya diminta untuk memasukkan nilai pengganti untuk string yang dimulai dengan &. Bagaimana cara menonaktifkan fitur ini sehingga SQL Plus mengabaikan ampersand?

JoshL
sumber

Jawaban:

181

Ini mungkin berhasil untuk Anda:

set define off

Jika tidak, ampersand harus berada di akhir string,

'StackOverflow &' || ' you'

EDIT: Saya senang mengklik saat menyimpan ... Ini direferensikan dari sebuah blog .

Austin Salonen
sumber
2
Anda juga dapat menentukan ini di file penyiapan profil situs glogin.sql atau file penyiapan profil pengguna login.sql
David Aldridge
Ini adalah solusi paling sederhana jika Anda tidak tertarik dengan variabel substitusi.
Drumbeg
Selalu solusi yang menyelamatkan hidup :) Terima kasih.
Anjana Silva
25

Jika Anda terkadang menggunakan variabel substitusi, Anda mungkin tidak ingin menonaktifkan define. Dalam kasus ini, Anda dapat mengonversi ampersand dari padanan numeriknya seperti dalam || Chr(38) ||atau menambahkannya sebagai karakter tunggal seperti pada || '&' ||.

Leigh Riffel
sumber
Skenario spesifiknya adalah paket yang sumbernya menyertakan ampersand dalam komentar. Saya tidak melihat bagaimana saya akan menggunakan rangkaian atau substitusi untuk ini.
JoshL
JoshL, Anda benar Saya baru saja mencantumkan ini untuk kelengkapan. Ini terkait dengan pertanyaan Anda meskipun tidak secara langsung menjawab pertanyaan spesifik Anda.
Leigh Riffel
Ini benar-benar membantu saya.
Archimedes Trajano
13

Saya menyelesaikan dengan kode di bawah ini:

set escape on

dan beri tanda \ di samping & di kiri 'value_\&_intert'

Att

Cauca
sumber
Ini berhasil untuk saya. Saya menggunakan perintah comment on column tablename.columnname is 'war ' || chr(38) || ' peace'tetapi itu memberi saya kesalahan ORA-01780: string literal required.
mrswadge
6

Anda dapat menyetel karakter khusus, yang dicari saat menjalankan skrip, ke nilai lain dengan menggunakan SET DEFINE <1_CHARACTER>

Secara default, fungsi DEFINE sendiri aktif, dan disetel ke &

Ini dapat dimatikan - seperti yang telah disebutkan - tetapi dapat juga dihindari dengan cara menyetelnya ke nilai yang berbeda. Berhati-hatilah dengan tanda yang Anda atur. Dalam contoh di bawah ini, saya telah memilih karakter #, tetapi pilihan itu hanyalah sebuah contoh.

SQL> select '&var_ampersand #var_hash' from dual;
Enter value for var_ampersand: a value

'AVALUE#VAR_HASH'
-----------------
a value #var_hash

SQL> set define #
SQL> r
  1* select '&var_ampersand #var_hash' from dual
Enter value for var_hash: another value

'&VAR_AMPERSANDANOTHERVALUE'
----------------------------
&var_ampersand another value

SQL>
tvCa
sumber
1
Saya sendiri telah menggunakan pendekatan ini baru-baru ini. Saya menyukainya karena tidak mengharuskan saya mengubah konten paket PL / SQL saya.
Drumbeg
3

set define off <- Ini adalah solusi terbaik yang saya temukan

Saya juga mencoba ...

set define}

Saya dapat memasukkan beberapa record yang berisi karakter ampersand '&' tetapi saya tidak dapat menggunakan karakter '}' ke dalam teks. Jadi saya memutuskan untuk menggunakan "set define off" dan semuanya bekerja sebagaimana mestinya.

ora
sumber
2

Menurut FAQ yang bagus ini ada beberapa solusi.

Anda mungkin juga dapat melepaskan tanda ampersand dengan karakter garis miring terbalik \jika Anda dapat mengubah komentar.

pengguna19387
sumber
2
Escape backslash tidak berfungsi di SQL * Plus atau SQLDeveloper
Jim Tough
2
@JimTough Itu dilakukan setelah mengaktifkannya denganset escape on
David Balažic
0

Saya mendapat pernyataan KASUS dengan kolom WHEN = 'teks sesuatu & lebih' LALU ....

Saya menggantinya dengan WHEN column = 'sometext' || CHR (38) || 'lebih banyak teks' LALU ...

Anda juga bisa menggunakan WHEN kolom LIKE 'someext _ more text' THEN ...

(_ adalah karakter pengganti untuk satu karakter)

AWOLKiwi
sumber