sql >> Base de Datos >  >> RDS >> Oracle

Cómo hacer la operación por lotes usando pl/sql

Sólo voy a decir que esto es asqueroso antes de empezar. Si está creando secuencias de comandos que automatizan la creación de la base de datos, me desharía de la siguiente consulta y simplemente copiaría y pegaría porque es tan horrible que NO pertenece a las secuencias de comandos de implementación de su base de datos.

La Consulta

DECLARE
    CURSOR TABLES IS SELECT * FROM USER_TABLES
                     WHERE 0 = (SELECT COUNT(*)
                                FROM USER_CONSTRAINTS
                                WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME 
                                AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P'
                               );
BEGIN
    FOR T IN TABLES LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD ID NUMBER(12)';
        EXECUTE IMMEDIATE 'CREATE SEQUENCE '||T.TABLE_NAME||'Seq START WITH 1';
        EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||T.TABLE_NAME||'Seq.NEXTVAL';
        EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD PRIMARY KEY (ID)';
        EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||T.TABLE_NAME||'PKSet '||CHR(10)
                          ||'BEFORE INSERT ON '||T.TABLE_NAME||' '||CHR(10)
                          ||'FOR EACH ROW '||CHR(10)
                          ||'BEGIN '||CHR(10)
                          ||':NEW.ID := '||T.TABLE_NAME||'Seq.NEXTVAL; '||CHR(10)
                          ||'END; ';
    END LOOP;
END;
/

¿Qué hace esto?

Básicamente, obtiene una lista de tablas y crea dinámicamente el SQL para realizar las diversas tareas involucradas. EXECUTE IMMEDIATE toma la cadena donde construimos el SQL y la ejecuta. El CHR(10) nastiness es una nueva línea. Quería el espacio en blanco allí porque no sé cómo dejarlo fuera afectaría el análisis de Oracle. Tenga en cuenta que en varios lugares concatenamos el nombre de la tabla directamente con algún otro texto para generar una secuencia o un nombre de restricción PK.

Esto puede o no fallar si citó los nombres de sus tablas durante la creación y está usando algunos caracteres en minúsculas. Si SÍ produce un error, tenga en cuenta que cada instrucción implica una confirmación. Un error significará que el proceso está a la mitad. También falla si el esquema no es el usuario actual. (Deberá cambiar USER_TABLES a ALL_TABLES y agregue un filtro apropiado en la cláusula where y agregue el esquema delante del nombre de la tabla al compilar el SQL para que funcione en otro esquema).

Un SQLFiddle en funcionamiento real:http://sqlfiddle.com/#!4/b67fc/1 (No puedo creer que esto realmente funcionó en SQLFiddle). En este caso, la consulta que nos interesa está en la definición del esquema, ya que SQL Fiddle solo permite SELECT en la consulta.

Buena suerte. Lo necesitarás. No te dispares en el pie.