Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да направите груповата операция с помощта на pl/sql

Просто ще кажа, че това е отвратително, преди да започна. Ако създавате скриптове, които автоматизират създаването на база данни, бих се отказал от заявката по-долу и просто ще използвам копиране/поставяне, защото това е толкова ужасно, че НЕ принадлежи на вашите скриптове за внедряване на база данни.

Заявката

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

Какво прави това?

По принцип той получава списък от таблици и динамично изгражда SQL, за да изпълнява различните включени задачи. EXECUTE IMMEDIATE взема низа, където сме създали SQL, и го изпълнява. CHR(10) гадостта е нов ред. Исках празното място там, защото не знам как оставянето му ще повлияе на анализирането на Oracle. Имайте предвид, че на няколко места свързваме името на таблицата директно с някакъв друг текст, за да генерираме последователност или име на PK ограничение.

Това може или не може да доведе до грешка, ако сте цитирали имената на вашите таблици по време на създаването и използвате някои малки букви. Ако НАПРАВИ грешка, имайте предвид, че всеки оператор включва ангажимент. Грешка ще означава, че процесът е наполовина завършен. Също така се проваля, ако схемата не е текущият потребител. (Ще трябва да промените USER_TABLES към ALL_TABLES и добавете подходящ филтър в клаузата where и добавете схемата пред името на таблицата, когато създавате SQL, за да може да работи с друга схема.)

Действително работещ SQLFiddle:http://sqlfiddle.com/#!4/b67fc/1 (Не мога да повярвам, че това действително работи на SQLFiddle.) В този случай заявката, която ни интересува, е в дефиницията на схемата, тъй като SQL Fiddle позволява само SELECT в заявката.

Късмет. Ще ти трябва. Не се прострелвайте в крака.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. V$SQL_SHARED_CURSOR TOP_LEVEL_RPI_CURSOR

  2. Брой редове, засегнати от АКТУАЛИЗИРАНЕ в PL/SQL

  3. Oracle чете файл от директория с изключение

  4. Одитни пътеки на Oracle DB

  5. 11gR2 Compression Advisor =Evil