2012-07-26 30 views
5

Estoy tratando de determinar qué está haciendo este código (Oracle SQL) - especialmente el signo de exclamación al en la cláusula from.¿Qué significa @! significa en un De declaración

INSERT INTO "LOCATIONS" "A1" 
      ("LOCATION_ID", 
      "SEQUENCE", 
      "POINT_TYPE") 
SELECT "A2"."LOCATION_ID", 
     "A2"."SEQUENCE", 
     "A2"."LOCATION_TYPE", 
     "A2"."POINT_TYPE" 
FROM "LOCATIONS"@! "A2" 
WHERE NOT EXISTS (SELECT 1 
        FROM "LOCATIONS" "A3" 
        WHERE "A3"."LOCATION_ID" = "A2"."LOCATION_ID") 
+1

FYI, el símbolo @ en realidad se llama "at" o "hat". Ampersand es esto: &. – Matt

+1

No puede insertar 4 columnas en 3 columnas. La "@" generalmente significa un enlace a la base de datos. ¡Pero nunca lo he visto junto con un "!" – winkbrace

+3

'!' Debe ser un nombre de enlace de base de datos, pero no es un carácter legal para tener en uno. Tal vez se supone que se debe ejecutar desde un script de shell que hace una sustitución en tiempo real de '!' Por un nombre de enlace real, aunque sería una elección extraña; y como @BazzPsychoNut señala que fallará en la columna no coincide de todos modos. El único uso de '!' Que conozco en Oracle es como el [operador 'soundex'] (http://docs.oracle.com/cd/E11882_01/text.112/e24436/cqoper.htm#sthref1108) , que claramente no es el caso aquí. –

Respuesta

-1

No creo que este sea un SQL válido. Verifique su código para asegurarse de que no se haya modificado nada antes de que se ejecute el SQL; en particular, verifique si el nombre de un enlace de base de datos se sustituye por el !.

Si no puede determinar lo que está siendo ejecutado, podría poner un rastro en la base de datos

+0

Este código se extrae de Ejecuciones SQL supervisadas en Control de cuadrícula (con varias líneas eliminadas, es por eso que muestra 4 selecciones con solo 3 columnas de inserción). – user739866

5

Este es un enlace de base de datos inversa a la base de datos original, donde se ejecuta la consulta. La consulta original debe verse así:

INSERT INTO [email protected]_db 
      ("LOCATION_ID", 
      "SEQUENCE", 
      "POINT_TYPE") 
SELECT "A2"."LOCATION_ID", 
     "A2"."SEQUENCE", 
     "A2"."POINT_TYPE" 
FROM "LOCATIONS" A2 
WHERE NOT EXISTS (SELECT 1 
        FROM [email protected]_db A3 
        WHERE "A3"."LOCATION_ID" = "A2"."LOCATION_ID"); 

De esta forma todas las tablas remotas se vuelven locales, y las tablas locales se vuelven remotas con "@!".

Cuestiones relacionadas