¿Cómo ignoro los símbolos de unión en un script SQL que se ejecuta desde SQL Plus?

104

Tengo un script SQL que crea un paquete con un comentario que contiene un ampersand (&). Cuando ejecuto el script desde SQL Plus, se me solicita que ingrese un valor sustituto para la cadena que comienza con &. ¿Cómo desactivo esta función para que SQL Plus ignore el signo comercial?

JoshL
fuente

Respuestas:

181

Esto puede funcionar para usted:

set define off

De lo contrario, el ampersand debe estar al final de una cadena,

'StackOverflow &' || ' you'

EDITAR: Estaba feliz de hacer clic al guardar ... Esto fue referenciado desde un blog .

Austin Salonen
fuente
2
También puede especificar esto en el archivo de configuración del perfil del sitio glogin.sql o en el archivo de configuración del perfil de usuario login.sql
David Aldridge
Esta es la solución más simple si no está interesado en las variables de sustitución.
Drumbeg
Siempre una solución que salva vidas :) Gracias.
Anjana Silva
25

Si a veces utiliza variables de sustitución, es posible que no desee desactivar la definición. En estos casos, podría convertir el ampersand de su equivalente numérico como en || Chr(38) ||o agregarlo como un solo carácter como en || '&' ||.

Leigh Riffel
fuente
El escenario específico es un paquete cuya fuente incluye un ampersand en un comentario. No veo cómo usaría la concatenación o la sustitución para esto.
JoshL
JoshL, tienes razón. Acabo de enumerar esto para que esté completo. Está relacionado con su pregunta aunque no responde directamente a su pregunta específica.
Leigh Riffel
Realmente me ayudó.
Archimedes Trajano
13

Lo resolví con el siguiente código:

set escape on

y poner \ al lado de & a la izquierda 'value_\&_intert'

Att

Cauca
fuente
Esto funcionó para mí. Estaba usando el comando comment on column tablename.columnname is 'war ' || chr(38) || ' peace'pero me estaba dando el error ORA-01780: string literal required.
mrswadge
6

Puede establecer el carácter especial, que se busca al ejecutar un script, en otro valor mediante el uso de SET DEFINE <1_CHARACTER>

De forma predeterminada, la función DEFINE está activada y está configurada en &

Se puede apagar, como ya se mencionó, pero también se puede evitar estableciendo un valor diferente. Sea muy consciente de la señal que le asignó. En el siguiente ejemplo, elegí el carácter #, pero esa elección es solo un ejemplo.

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
fuente
1
Yo mismo he utilizado este enfoque recientemente. Me gusta porque no me obliga a modificar el contenido de mis paquetes PL / SQL.
Drumbeg
3

set define off <- Esta es la mejor solución que encontré

También probé ...

establecer definir}

Pude insertar varios registros que contenían los caracteres '&' pero no puedo usar el carácter '}' en el texto. Así que decidí usar "set define off" y todo funciona como debería.

ora
fuente
2

De acuerdo con estas interesantes preguntas frecuentes, hay un par de soluciones.

También es posible que pueda escapar del signo comercial con el carácter de barra invertida \si puede modificar el comentario.

user19387
fuente
2
El escape de barra invertida no funciona en SQL * Plus o SQLDeveloper
Jim Tough
2
@JimTough Lo hace después de activarlo conset escape on
David Balažic
0

Tenía una declaración CASE con WHEN column = 'sometext & more text' THEN ....

Lo reemplacé con CUANDO column = 'sometext' || CHR (38) || 'más texto' ENTONCES ...

también puede usar CUANDO la columna COMO 'algún texto _ más texto' ENTONCES ...

(_ es el comodín para un solo carácter)

AWOLKiwi
fuente