sql >> Database >  >> RDS >> Oracle

Hoe de batchbewerking uit te voeren met pl/sql

Ik ga gewoon zeggen dat dit vies is voordat ik begin. Als je scripts maakt die het maken van de database automatiseren, zou ik de onderstaande query weggooien en gewoon gaan kopiëren en plakken, omdat dit zo vreselijk is dat het NIET thuishoort in je database-implementatiescripts.

De Zoekopdracht

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;
/

Wat doet dit?

Kortom, het krijgt een lijst met tabellen en bouwt dynamisch de SQL om de verschillende betrokken taken uit te voeren. EXECUTE IMMEDIATE neemt de string waar we de SQL hebben gebouwd en voert deze uit. De CHR(10) misselijkheid is een nieuwe regel. Ik wilde de witruimte daar hebben omdat ik niet weet hoe het weglaten ervan de parsering van Oracle zou beïnvloeden. Merk op dat we op verschillende plaatsen de tabelnaam rechtstreeks aan een andere tekst koppelen om een ​​reeks of PK-beperkingsnaam te genereren.

Dit kan al dan niet fout gaan als u uw tabelnamen aanhaalt tijdens het maken en enkele kleine letters gebruikt. Als er een fout optreedt, houd er dan rekening mee dat elke instructie een commit bevat. Een fout betekent dat het proces half is voltooid. Het mislukt ook als het schema niet de huidige gebruiker is. (Je moet USER_TABLES wijzigen naar ALL_TABLES en voeg een geschikt filter toe in de waar-clausule en voeg het schema toe vóór de tabelnaam bij het bouwen van de SQL om het op een ander schema te laten werken.)

Een echt werkende SQLFiddle:http://sqlfiddle.com/#!4/b67fc/1 (Ik kan niet geloven dat dit echt werkte op SQLFiddle.) In dit geval is de query waarin we geïnteresseerd zijn voorbij in de schemadefinitie, aangezien SQL Fiddle alleen SELECT toestaat in de zoekopdracht.

Veel geluk. Je hebt het nodig. Schiet jezelf niet in de voet.




  1. 3 methoden om alle indexen voor alle tabellen opnieuw op te bouwen met T-SQL in SQL Server-database

  2. Dubbele rijen uit tabel verwijderen

  3. Is het mogelijk om twee primaire sleutels in één tabel te maken?

  4. Hoe MySQL 5.7 volledig van Windows te verwijderen