Estoy tratando de ejecutar varias sentencias ddl dentro de una sentencia Execute Inmediate. pensé que esto sería bastante directo pero parece que estoy equivocado.ORACLE Enumeración de sentencias DDL dentro de Execute Inmediato
La idea es la siguiente:
declare v_cnt number;
begin
select count(*) into v_cnt from all_tables where table_name='TABLE1' and owner = 'AMS';
if v_cnt = 0 then
execute immediate 'CREATE TABLE TABLE1(VALUE VARCHAR2(50) NOT NULL) ALTER TABLE TABLE1 ADD (MYVAL2 NVARCHAR2(10))';
end if;
end;
sin embargo, esto resulta en un error
ORA-00911: carácter no válido ORA-06512: en la línea 10
Cada una de las instrucciones dentro del lote funcionan bien si las ejecuto por sí mismas. y si tomo esta declaración y la ejecuto, correrá bien (con el; entre las 2 declaraciones). Si elimino el; entre las declaraciones me sale un error diferente sobre la opción no válida
el plan es que seré capaz de construir una tabla, exportar el esquema de la tabla para esta tabla incluyendo todas las declaraciones alter, y luego ejecutar el lote contra otro sistema como parte de un proceso de instalación/actualización.
Entonces, ¿cómo puedo agrupar estas sentencias DDL en una sola ejecución inmediata? ¿O hay una mejor manera de hacer lo que estoy necesitando?
Soy un poco nuevo de Oracle, debo admitirlo. Gracias a todos por su paciencia.
la creación y las modificaciones de la tabla se exportan como un solo archivo y en este momento, hay suficientes como para que valga la pena tratar de hacerlo en 1 EJECUTAR INMEDIATO frente a muchos objetos por db. – Beta033
En cuyo caso, sugeriría simplemente generar el DDL correcto en primer lugar. Mira DBMS_METADATA. :-) – cagcowboy
parece que esto puede solucionar mi problema. lamentablemente, la respuesta obvia estaba debajo de mis narices. Lección aprendida: No use TOAD en la estructura de salida aunque haya un elegante menú de gui para ello. – Beta033