2011-06-15 14 views

cevap

62

Oracle Database'deki sütunlarla ilgili tüm meta veriler, aşağıdaki görünümlerden biri kullanılarak erişilebilir.

user_tab_cols; - Kullanıcının sahip olduğu tüm tablolar için

all_tab_cols; - Kullanıcının erişebileceği tüm tablolar için

dba_tab_cols; - Veritabanındaki tüm tablolar için. Eğer SCOTT.EMP Tablo ADD_TMS gibi bir sütun arayan ve onu yok yalnızca sütun eklemek eğer

Yani, PL/SQL Kodu .. bu satırlar boyunca olurdu

DECLARE 
    v_column_exists number := 0; 
BEGIN 
    Select count(*) into v_column_exists 
    from user_tab_cols 
    where column_name = 'ADD_TMS' 
     and table_name = 'EMP'; 
     --and owner = 'SCOTT --*might be required if you are using all/dba views 

    if (v_column_exists = 0) then 
     execute immediate 'alter table emp add (ADD_TMS date)'; 
    end if; 
end; 
/

Bunu bir komut dosyası olarak çalıştırmayı planlıyorsanız (bir prosedürün parçası değil), komut için alter komutunu dahil etmenin en kolay yolu, Başlama Sonu almadığınızı varsayarak, komut dosyasının sonunda hataları görmektir. senaryo ..

Eğer

file1.sql varsa

Komut dosyası çalıştırıldığında, diğer iki sütun tabloya eklenir ve günlüğe "col2" yazılması hatası gösterilirdi, bu yüzden tamam olmanız gerekir.

+1

Daha az deneyimli Oracle kullanıcıları için, her iki tarafı da sütun ve tablo adı karşılaştırmaları yaparsanız bazı sorunlardan kurtulabilir: 'lower (column_name) = lower ('mycol')' – mastaBlasta

6

Normalde, ANSI-92 standart meta tablolarını böyle bir şey için denemenizi öneririm ancak şimdi Oracle'ın desteklemediğini görüyorum.

-- this works against most any other database 
SELECT 
    * 
FROM 
    INFORMATION_SCHEMA.COLUMNS C 
    INNER JOIN 
     INFORMATION_SCHEMA.TABLES T 
     ON T.TABLE_NAME = C.TABLE_NAME 
WHERE 
    C.COLLATION_NAME = 'columnname' 
    AND T.TABLE_NAME = 'tablename' 

Bunun yerine, sizin gibi looks Ben yukarıda doğrulamak için Oracle örneği yok özür yok

-- Oracle specific table/column query 
SELECT 
    * 
FROM 
    ALL_TAB_COLUMNS 
WHERE 
    TABLE_NAME = 'tablename' 
    AND COLUMN_NAME = 'columnname' 

gibi bir şey yapmak gerekir. Eğer işe yaramazsa, lütfen bana bildirin ve bu yazıyı sileceğim.

+3

veya denemek ve istisna – Randy

+7

yakalamak, sen' OWNER' üzerinde bir yüklemi eklemek isteyebileceğiniz Birden fazla şemada aynı tablonun bulunması durumunda sütun. Yalnızca geçerli kullanıcının şemasındaki tablolarla ilgilendiğinizi biliyorsanız, bunun yerine USER_TAB_COLUMNS görünümünü kullanın. –

17

Veya, hatayı göz ardı edebilirsiniz: Eğer `ALL_TAB_COLUMNS` veri sözlüğü görünümü sorgulamak durumunda

declare 
    column_exists exception; 
    pragma exception_init (column_exists , -01430); 
begin 
    execute immediate 'ALTER TABLE db.tablename ADD columnname NVARCHAR2(30)'; 
    exception when column_exists then null; 
end; 
/
+0

nice & clean. Teşekkürler! –

+0

Sweet! Bu, table_exists için de kullanılabilir mi? –

+0

Maalesef "table_exists" yok. – grokster

İlgili konular