Crear una tabla en un procedimiento

aur
27 de Febrero del 2006
Buenas tardes
Rrimero deciros que soy totamente novel en este lenguaje y que es posible este preguntando incoherencias, pero por algo se empieza y que necesito ayuda.
Vereis estoy tratando de crear una tabla, de actulizar sus filas y recoger los posibles errores si ya existen los datos, pero me da error, os paso lo que estoy haciendo y el error.
Un millon de gracias
CREATE OR REPLACE PROCEDURE ACTUALIZAR IS

--variable donde recogo el error
cod_err number(6);
BEGIN
CREATE TABLE DUPLICA (
FECHA_INICIO DATE,
REG VARCHAR2 (50) NOT NULL,
SECC VARCHAR2 (10) NOT NULL,
TOM VARCHAR2 (10),
PAG VARCHAR2 (10),
NOMBRE VARCHAR2 (150),
APELLIDO1 VARCHAR2 (150),
APELLIDO2 VARCHAR2 (150),
FECHA_FIN VARCHAR2 (15),
CONSTRAINT PK_DUPLICA PRIMARY KEY ( REG, SECC, TOM, PAG, FECHA_INICIO)
);
ALTER TABLE DUPLICA ADD CONSTRAINT FK_DUPLICA_REGISTRO FOREIGN KEY (REG) REFERENCES REGI_LOCAL (CODIGOREGISTRO);
ALTER TABLE DUPLICA ADD CONSTRAINT FK_DUPLICADOS_SECCION FOREIGN KEY (SECC) REFERENCES SECC (CODIGOSECCION);
EXCEPTION
WHEN OTHERS THEN
cod_err := SQLCODE; --LA FUNCION SQLCODE NO ES ACCESIBLE DESDE ORDENES SQLPLUS
dbms_output.put_line('**EXCEPCION: ' || cod_err );
END ACTUALIZAR;
/
COMMIT;
CALL ACTUALIZAR();
DROP PROCEDURE ACTUALIZAR;
COMMIT;
exit

ERROR:
PLS-00103: Se ha encontrado el símbolo "CREATE" cuando se
esperaba uno de los siguientes:
begin declare exit for goto if loop mod null pragma raise
return select update while <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall
<a single-quoted SQL string>


Jor-El
27 de Febrero del 2006
Bien, pues te oriento.

Las sentencias DDL ( create, drop, etc etc ) son sentencias SQL, no PL-SQL .

En consecuencia no se pueden ejecutar desde PL-SQL como intentas tu.

Como lo planteas tu, deberías utilizar sql dinamico, pero no le veo mucho sentido primero para lo que quieres hacer y segundo porqué estás empezando a trastear en oracle. El sql dinamico dejatelo para mas adelante cuando sepas de que va la misa.

Para hacer eso tienes dos opciones :

1) Hazlo directamente desde el sql plus
2) Quita esto :

CREATE OR REPLACE PROCEDURE ACTUALIZAR IS

--variable donde recogo el error
cod_err number(6);
BEGIN

Y esto :


EXCEPTION
WHEN OTHERS THEN
cod_err := SQLCODE; --LA FUNCION SQLCODE NO ES ACCESIBLE DESDE ORDENES SQLPLUS
dbms_output.put_line('**EXCEPCION: ' || cod_err );
END ACTUALIZAR;
/
COMMIT;
CALL ACTUALIZAR();
DROP PROCEDURE ACTUALIZAR;
COMMIT;
exit


Y guardas el resto en un archivo .sql ( O txt, dá lo mismo ) y desde el simbolo del sql plus tecleas :

start c:mi_create_table.sql

Y se te ejecutarán todas las sentencias que tienes.

Si tienes mas dudas, pregunta sin miedo que nadie nace sabiendo.

Si quieres ayuda "on-line", de lunes a viernes me conecto al msn un ratito a partir de las 8 de la tarde y luego de 23:00 a 00:00, solo tienes que llamarme:

[email protected]