2012-08-28 10 views
37

Estaba intentando hacer algo así como autoincremento en Oracle 11g Express y SQL Developer. Sé muy poco sobre Oracle y también soy nuevo en los factores desencadenantes.Creación de un desencadenador en Oracle Express

Intenté ejecutar esto, pero no sé cómo hacerlo correctamente.

CREATE TABLE theschema.thetable 
(id NUMBER PRIMARY KEY, 
name VARCHAR2(30)); 

CREATE SEQUENCE theschema.test1_sequence 
START WITH 1 
INCREMENT BY 1; 

create or replace trigger insert_nums 
before insert on theschema.thetable 
for each row 
begin 
select test1_sequence.nextval into :new.id from dual; 
end; 
/

Cuando intento crear el activador, aparece una pantalla que me pide algunos "enlaces". El cuadro de diálogo tiene una sola casilla de verificación "nulo". ¿Qué significa esto y cómo hago una secuencia de comandos que funciona correctamente?

¿Alguna precaución que tomar al hacer este tipo de "autoincremento"?

Enter binds

+0

Agregué la etiqueta SQL-Developer, ya que este código se ve bien; Te estoy pidiendo que completes una variable de vinculación, así que supongo que hay alguna configuración que debes desactivar ... No tengo idea de qué. – Ben

+1

BTW, desde Oracle 11 en adelante puede hacer referencia a una secuencia directamente. Esto significa que puede escribir ': new.id: = test1_sequence.nextval' sin usar SELECT. – Ben

+1

¡La misma pregunta aquí! ¡Gracias por tu publicación! –

Respuesta

48

Parece que SQL Developer piensa que está ejecutando un script sencillo LMD (manipulación de datos), no un (definición de datos) DDL. También cree que :new.id es una variable enlazable.

Por qué sucede esto, no sé; No puedo reproducirlo en Oracle SQL Developer 2.1.

intenta abrir una nueva ventana de la hoja de SQL en el esquema theschema y ejecutar una secuencia de comandos "todo" (no una declaración) presionando F5 (no F9).

+0

¡Muchas gracias! eso funciona.No sé por qué se debe ejecutar todo el script para que esto funcione correctamente. ¿Por qué no se puede hacer parte por parte? –

+0

¡De nada! No sé por qué sucede esto también, porque mi SQL Developer funciona bien. –

+1

Tuve este problema exacto y esta fue la solución. Puedo confirmar que está relacionado con la versión de SQL Developer. – Jhokva

15

Así es como he resuelto este problema, ponga "set define off"; antes del comando:

set define off; 
create or replace trigger [...] 
[...] 
end; 
/

A continuación, resalte ambos comandos y presione F9 para ejecutar. O podría ejecutar todos los comandos con F5.

Parece que si los comandos se ejecutan por separado con F9, entonces el conjunto de definición desactivada no tiene efecto.

+0

Suena como una buena solución, pero sería mejor si mencionara lo que hace realmente "definir definir". Según lo que leí, ¿parece que se apaga para indicarle al usuario el tipo de variable/valores vinculados? Bueno saber. https://stackoverflow.com/questions/34332639/when-or-why-to-use-a-set-define-off-in-oracle-database – Balmipour

+0

Esto no soluciona el problema en la pregunta. Detiene SQL Developer interpretando las variables de marcador de posición (marcadas con el símbolo &,) pero no afecta el tratamiento de las variables de vinculación (marcadas con dos puntos, :) que fue el problema sobre el que se preguntó OP. –

0

Para mi caso, la solución estaba entrando "NewRow" para el 'nuevo' y "oldrow" para el 'viejo' como valores para los une ...

+0

¡Y funciona! – m0rjjj

0

Soy un novato en esto, así que tenedlo en cuenta cuando Doy mi respuesta Creo que el problema es que el código

create or replace trigger insert_nums 
before insert on theschema.thetable 
for each row 
begin 
select test1_sequence.nextval into :new.id from dual; 
end; 

es en realidad un guión y no sencillo instrucción SQL. Por lo tanto, debe ejecutar el "Ejecutar script". Descubrí que cuando tenía una hoja de trabajo abierta en SQL Developer, si tenía en alguna parte de la hoja de trabajo cualquier código para activar como arriba, incluso yo solo intentaba ejecutar una declaración que SQL Developer revisara en la hoja de trabajo e intentara ejecutar el guión. Para evitar que eso ocurriera, tuve que comentar el código. Y si deseaba ejecutar el código para el desencadenante antes que abrir una nueva hoja de trabajo, coloque el código allí y ejecute un EJECUTAR GRABACIÓN.

Cuestiones relacionadas