2011-06-15 50 views

Respuesta

62

Se puede acceder a todos los metadatos sobre las columnas en Oracle Database utilizando una de las siguientes vistas.

user_tab_cols; - Para todas las tablas propiedad del usuario

all_tab_cols; - Para todas las tablas accesibles para el usuario

dba_tab_cols; - Para todas las tablas en la Base de datos.

lo tanto, si usted está buscando una columna como ADD_TMS en SCOTT.EMP tabla y agregar la columna sólo si no existe, el código PL/SQL sería lo largo de estas líneas ..

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

Si planea ejecutar esto como un script (no como parte de un procedimiento), la manera más fácil sería incluir el comando alter en el script y ver los errores al final del script, suponiendo que no tiene Begin-End para el guión ..

Si usted tiene file1.sql

Y col2 está presente, cuando se ejecuta el script, las otras dos columnas se agregarán a la tabla y el registro mostrará el error que indica que "col2" ya existe, por lo que debería estar bien.

+1

Para personas con menos experiencia en Oracle, podría ahorrarte algunos problemas si incluyes ambas partes en las comparaciones de nombres de tablas y columnas: 'lower (column_name) = lower ('mycol')' – mastaBlasta

6

Normalmente, sugiero probar las tablas de metatars estándar ANSI-92 para algo como esto, pero ahora veo que Oracle no lo admite.

-- 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' 

En cambio, looks como que necesita para hacer algo como

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

me disculpo porque no tengo una instancia de Oracle para verificar lo anterior. Si no funciona, házmelo saber y borraré esta publicación.

+3

o probarlo y detectar la excepción – Randy

+7

Si se consulta la 'ALL_TAB_COLUMNS' vista de diccionario de datos, que te gustaría incluir un predicado en la' OWNER' columna en caso de que exista la misma tabla en esquemas múltiples. Si sabe que solo le interesan las tablas en el esquema del usuario actual, debe usar la vista 'USER_TAB_COLUMNS' en su lugar. –

17

O bien, puede ignorar el error:

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. ¡Gracias! –

+0

¡Dulce! ¿Se puede usar esto también para table_exists? –

+0

Desafortunadamente, no hay "table_exists". – grokster

Cuestiones relacionadas