una tutorial salida procedimiento parametros multiple funcion español ejemplos ejecutar dinamico developer con columns almacenado sql oracle ora-06553

sql - tutorial - Oracle ¿por qué falla la creación del disparador cuando hay un campo llamado marca de tiempo?



pl sql ejemplos (6)

Bueno, no estoy totalmente seguro, pero creo que esto sucede porque el código SQL utilizado para manipular y acceder a los objetos de la base de datos es interpretado por algún intérprete diferente al utilizado para interpretar el código PL / SQL.

Tenga en cuenta que SQL y PL / SQL son cosas diferentes, por lo que se procesan de manera diferente. Entonces, creo que hay un error en un intérprete, pero no estoy seguro de cuál es.

Acabo de desperdiciar las últimas dos horas de mi vida tratando de crear una tabla con un aumento automático de las claves principales en este tutorial . El tutorial es excelente, el problema que he encontrado es que el objetivo de creación falla si tengo una columna que es una marca de tiempo y una tabla que se llama marca de tiempo en la misma tabla ...

¿Por qué Oracle no señala esto como un problema cuando creo la tabla?

Aquí está la secuencia de comandos que ingresé:

  1. Creando la Tabla:

    CREATE TABLE myTable (id NUMBER PRIMARY KEY, field1 TIMESTAMP (6), timeStamp NUMBER,

);

  1. Creando la secuencia:

    CREATE SEQUENCE secuencia de prueba INICIE CON 1 INCREMENTO POR 1;

  2. Creando el disparador

    CREAR O SUSTITUIR TRIGGER test_trigger ANTES DE INSERTAR ON myTable REFERENCING NUEVO COMO NUEVO PARA CADA FILO INICIAR SELECCIONAR test_sequence.nextval INTO: NEW.ID FROM dual; FIN; /

Aquí está el mensaje de error que recibo:

ORA-06552: PL/SQL: Compilation unit analysis terminated ORA-06553: PLS-320: the declaration of the type of this expression is incomplete or malformed

Cualquier combinación que no tenga las dos líneas con la palabra "timestamp" en ellos funciona bien. Pensé que la sintaxis sería suficiente para diferenciar entre la palabra clave y el nombre de una columna.

Como ya he dicho, no entiendo por qué la tabla está bien creada, pero el oráculo se cae cuando trato de crear el desencadenante ...

ACLARACIÓN

Sé que el problema es que hay una columna llamada marca de tiempo que puede ser o no una palabra clave. MI problema es por qué se descompuso cuando intenté crear un activador y no cuando creé la tabla, al menos esperaba una advertencia.

Dicho esto, al haber usado Oracle por unas horas, parece mucho menos detallado en su informe de errores. Tal vez solo porque estoy usando la versión expresa.

Si esto es un error en Oracle, ¿cómo alguien que no tiene un contrato de soporte puede informarlo? Solo estoy jugando con la versión express porque tengo que migrar algún código de MySQL a Oracle.


Has insinuado la respuesta tú mismo. Está utilizando la timestamp como nombre de columna, pero también es una palabra clave. Cambia el nombre de la columna a algo más (por ejemplo, xtimestamp ) y compila el disparador.


TIMESTAMP no aparece en los documentos de Oracle como palabra reservada (lo cual es sorprendente).

Se enumera en la vista del diccionario de datos V $ RESERVED_WORDS, pero su bandera RESERVED está establecida en ''N''.

Puede ser un error en el procesamiento del disparador. Yo diría que este es uno bueno para el soporte de Oracle.


Hay una nota sobre metalink sobre este extracto (227615.1) a continuación:

# symptom: Creating Trigger fails # symptom: Compiling a procedure fails # symptom: ORA-06552: PL/SQL: %s # symptom: ORA-06553: PLS-%s: %s # symptom: PLS-320: the declaration of the type of this expression is incomplete or malformed # cause: One of the tables being references was created with a column name that is one of the datatypes (reserved key word). Even though the field is not referenced in the PL/SQL SQL statements, this error will still be produced. fix: Workaround: 1. Rename the column to a non-reserved word. 2. Create a view and alias the column to a different name.


En lugar de que Oracle mantenga una vista, use EXECUTE INMEDIATE (es decir, si ''Cambiar el nombre de la columna a una palabra no reservada'' no es una opción.


Puede ejecutar a través de EJECUTAR INMEDIATO. No es mejor, pero funciona y evita el cambio de nombre de la columna.

En mi caso, renombrar columna será una manera caótica