2011-08-12 9 views
7

Me encantaría poder utilizar las tablas del sistema (Oracle en este caso) para determinar qué campos se utilizan en una instrucción SELECT. Algo así como:Seleccionar dinámicamente las columnas que se utilizarán en una instrucción SELECT

SELECT 
(
select column_name 
from all_tab_cols 
where table_Name='CLARITY_SER' 
AND  OWNER='CLARITY' 
AND  data_type='DATE' 
) 
FROM CLARITY_SER 

Esta sintaxis no funciona, ya que la sentencia devuelve varias filas, en lugar de una fila de columnas múltiples.

¿Es posible generar una instrucción SQL dinámicamente consultando la información del esquema de la tabla para seleccionar solo ciertas columnas?

** editar ** Haga esto sin usar una función o procedimiento, si es posible.

+1

I editado el mensaje para agregar una pregunta que se espera debe ser muy responsable. Aunque las personas pueden dar a entender lo que estás preguntando, pensé que era mejor ser explícito. –

+0

¿Quiere decir sin recurrir a un lenguaje de programación para construir una declaración SQL? – paulmorriss

+0

¿Cuál es el motivo para hacer esto? –

Respuesta

2

No, no es posible especificar una lista de columnas dinámicamente en SQL. Tendrá que usar un lenguaje de procedimiento para ejecutar la primera consulta, usar eso para construir una segunda consulta y luego ejecutar la segunda consulta.

6

Usted puede hacer esto:

declare 
    l_sql varchar2(32767); 
    rc sys_refcursor; 
begin 
    l_sql := 'select '; 
    for r in 
    (select column_name 
    from all_tab_cols 
    where table_Name='CLARITY_SER' 
    AND  OWNER='CLARITY' 
    AND  data_type='DATE' 
) 
    loop 
    l_sql := l_sql || r.column_name || ','; 
    end loop; 
    l_sql := rtrim(l_sql,',') || ' from clarity_ser'; 
    open rc for l_sql; 
    ... 
end; 
1

Se podría utilizar SQL dinámico. Cree una función que tome el nombre de la tabla, el propietario, el tipo de datos, ejecute la consulta interna y devuelva una lista de nombres de columna separados por comas, o una tabla de matriz, si lo prefiere. A continuación, construya la consulta externa y ejecútela con execute immediate.

CREATE FUNCTION get_column_list(
     table_name IN varchar2, 
     owner_name IN varchar2, 
     data_type IN varchar2) 
    RETURN varchar2 
    IS 
BEGIN 
...... (get columns and return comma-separated list) 
END; 
/

Si su función devuelve una lista separada por comas puede inline que:

execute immediate 'select ' || get_column_list(table_name, owner_name, datatype) || ' from ' || table_name 

La verdad es que es mucho tiempo que no jugaba con Oracle, así que puede ser un poco pero estoy bastante Seguro que esto es bastante factible.

1

En SQLPlus usted puede hacer esto:

COLUMN cols NEW_VALUE cols 

SELECT max(ltrim(sys_connect_by_path(column_name, ','), ',')) cols 
FROM 
(
select rownum rn, column_name 
from all_tab_cols 
where table_Name='CLARITY_SER' 
and  OWNER='CLARITY' 
AND  data_type='DATE' 
) 
start with rn = 1 connect by rn = prior rn +1 
; 

select &cols from clarity.clarity_ser; 
+0

¿Funcionaría esto en SQL Developer de Oracle? – craig

+0

@craig, no lo creo, porque no creo que el comando COLUMN sea compatible allí. Puede tener alguna otra forma de hacerlo. –

Cuestiones relacionadas