ฉันจะละเว้นเครื่องหมายแอมเพอร์แซนด์ในสคริปต์ SQL ที่เรียกใช้จาก SQL Plus ได้อย่างไร


105

ฉันมีสคริปต์ SQL ที่สร้างแพ็คเกจพร้อมความคิดเห็นที่มีเครื่องหมายแอมเพอร์แซนด์ (&) เมื่อฉันเรียกใช้สคริปต์จาก SQL Plus ฉันได้รับแจ้งให้ป้อนค่าทดแทนสำหรับสตริงที่ขึ้นต้นด้วย & ฉันจะปิดใช้งานคุณลักษณะนี้เพื่อให้ SQL Plus ละเว้นเครื่องหมายและได้อย่างไร

คำตอบ:


182

สิ่งนี้อาจเหมาะกับคุณ:

set define off

มิฉะนั้นเครื่องหมายและจะต้องอยู่ท้ายสตริง

'StackOverflow &' || ' you'

แก้ไข: ผมก็คลิกมีความสุขเมื่อมีการบันทึก ... นี้อ้างอิงจากบล็อก


2
คุณยังสามารถระบุสิ่งนี้ในไฟล์การตั้งค่าโปรไฟล์ไซต์ glogin.sql หรือไฟล์ตั้งค่าโปรไฟล์ผู้ใช้ login.sql
David Aldridge

นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุดหากคุณไม่สนใจตัวแปรทดแทน
Drumbeg

เป็นทางออกที่ช่วยชีวิตเสมอ :) ขอบคุณ
Anjana Silva

25

หากบางครั้งคุณใช้ตัวแปรทดแทนคุณอาจไม่ต้องการปิดการกำหนด ในกรณีนี้คุณสามารถแปลงเครื่องหมายจากเทียบเท่าเป็นตัวเลขที่เป็นในหรือผนวกว่ามันเป็นตัวเดียวกับใน|| Chr(38) |||| '&' ||


สถานการณ์เฉพาะคือแพ็กเกจที่แหล่งที่มามีเครื่องหมายแอมเพอร์แซนด์ในข้อคิดเห็น ฉันไม่เห็นว่าฉันจะใช้การเรียงต่อกันหรือการแทนที่สำหรับสิ่งนี้อย่างไร
JoshL

JoshL คุณถูกต้องฉันแค่ระบุไว้เพื่อความสมบูรณ์ คำถามนี้เกี่ยวข้องกับคำถามของคุณแม้ว่าจะไม่ได้ตอบคำถามเฉพาะของคุณโดยตรงก็ตาม
Leigh Riffel

มันช่วยฉันได้จริง
Archimedes Trajano

13

ฉันแก้ไขด้วยรหัสด้านล่าง:

set escape on

และใส่ \ ข้าง & ทางซ้าย 'value_\&_intert'


สิ่งนี้ได้ผลสำหรับฉัน ผมใช้คำสั่งแต่มันก็ให้ฉันข้อผิดพลาดcomment on column tablename.columnname is 'war ' || chr(38) || ' peace' ORA-01780: string literal required
mrswadge

6

คุณสามารถตั้งค่าอักขระพิเศษซึ่งมองหาเมื่อเรียกใช้สคริปต์เป็นค่าอื่นโดยใช้ SET DEFINE <1_CHARACTER>

โดยค่าเริ่มต้นฟังก์ชัน DEFINE จะเปิดอยู่และถูกตั้งค่าเป็น&

สามารถปิดได้ - ดังที่กล่าวไปแล้ว - แต่สามารถหลีกเลี่ยงได้เช่นกันโดยการตั้งค่าเป็นค่าอื่น ระวังสัญลักษณ์ที่คุณตั้งไว้ ในตัวอย่างด้านล่างฉันได้เลือกอักขระ # แต่ตัวเลือกนั้นเป็นเพียงตัวอย่างเท่านั้น

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
ฉันใช้วิธีนี้กับตัวเองเมื่อไม่นานมานี้ ฉันชอบมันเพราะไม่ต้องการให้ฉันแก้ไขเนื้อหาของแพ็คเกจ PL / SQL ของฉัน
Drumbeg

3

set define off <- นี่คือทางออกที่ดีที่สุดที่ฉันพบ

ฉันยังลอง ...

set define}

ฉันสามารถแทรกระเบียนหลายรายการที่มีอักขระเครื่องหมาย & 'แต่ฉันไม่สามารถใช้อักขระ'} 'ในข้อความได้ดังนั้นฉันจึงตัดสินใจใช้ "set define off" และทุกอย่างทำงานได้ตามที่ควรจะเป็น


2

ตามคำถามที่พบบ่อยที่ดีนี้มีสองวิธีแก้ปัญหา

คุณอาจหลีกเลี่ยงเครื่องหมายแอมเพอร์แซนด์ด้วยอักขระแบ็กสแลช\หากคุณสามารถแก้ไขความคิดเห็นได้


2
การหลีกเลี่ยงแบ็กสแลชไม่ทำงานใน SQL * Plus หรือ SQLDeveloper
Jim Tough

2
@JimTough หลังจากเปิดใช้งานด้วยset escape on
David Balažic

0

ฉันมีคำสั่งกรณีที่มีคอลัมน์ WHEN = 'บางครั้งและข้อความเพิ่มเติม' แล้ว ....

ฉันแทนที่ด้วย WHEN column = 'sometext' || CHR (38) || 'ข้อความเพิ่มเติม' แล้ว ...

คุณยังสามารถใช้เมื่อคอลัมน์เช่น 'บางครั้ง _ ข้อความเพิ่มเติม' แล้ว ...

(_ เป็นสัญลักษณ์แทนสำหรับอักขระเดี่ยว)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.