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?

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 .


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


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


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>

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.


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.


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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.