sql - registros - Consulta de Oracle para recuperar nombres de columnas
pivot oracle columns to rows (11)
SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;
-> Tenga en cuenta que esto es Resultado de consulta, un ResultSet. Esto es exportable a otros formatos. Y puede exportar el resultado de la consulta al formato deText
. La exportación se ve a continuación cuando seleccionéSELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0;
:"SPRTELE_PIDM" "SPRTELE_SEQNO" "SPRTELE_TELE_CODE" "SPRTELE_ACTIVITY_DATE" "SPRTELE_PHONE_AREA" "SPRTELE_PHONE_NUMBER" "SPRTELE_PHONE_EXT" "SPRTELE_STATUS_IND" "SPRTELE_ATYP_CODE" "SPRTELE_ADDR_SEQNO" "SPRTELE_PRIMARY_IND" "SPRTELE_UNLIST_IND" "SPRTELE_COMMENT" "SPRTELE_INTL_ACCESS" "SPRTELE_DATA_ORIGIN" "SPRTELE_USER_ID" "SPRTELE_CTRY_CODE_PHONE "" SPRTELE_SURROGATE_ID "" SPRTELE_VERSION "" SPRTELE_VPDI_CODE "
DESCRIBE <TABLE_NAME>
-> Nota: Este es un resultado de script.
Tengo una consulta mySQL para obtener columnas de una tabla como esta:
String sqlStr="select column_name
from information_schema.COLUMNS
where table_name=''users''
and table_schema=''"+_db+"''
and column_name not in (''password'',''version'',''id'')"
¿Cómo cambio la consulta anterior en la base de datos Oracle 11g? Necesito obtener nombres de columnas como un conjunto de resultados para la tabla ''usuarios'' excluyendo ciertas columnas, especificando un esquema. Ahora mismo tengo todas las tablas en mi nuevo espacio de tabla, así que ¿especifico el nombre del espacio de tablas en lugar del nombre del esquema?
También hay un HQL genérico para esto? En mi nueva base de datos Oracle (soy nuevo en Oracle), solo tengo el nombre de espacio de tabla, ¿es equivalente al nombre de esquema (lógicamente?)
El equivalente de Oracle para information_schema.COLUMNS
es USER_TAB_COLS
para tablas propiedad del usuario actual, ALL_TAB_COLS
o DBA_TAB_COLS
para tablas propiedad de todos los usuarios.
Tablespace no es equivalente a un esquema, tampoco debe proporcionar el nombre del espacio de tabla.
Proporcionar el esquema / nombre de usuario sería útil si desea consultar ALL_TAB_COLS
o DBA_TAB_COLS
para columnas de tablas propiedad de un usuario específico. en su caso, me imagino que la consulta se vería algo así como:
String sqlStr= "
SELECT column_name
FROM all_tab_cols
WHERE table_name = ''USERS''
AND owner = ''" +_db+ "''
AND column_name NOT IN ( ''PASSWORD'', ''VERSION'', ''ID'' )"
Tenga en cuenta que con este enfoque, corre el riesgo de inyección SQL.
EDITAR: Alineó los nombres de tabla y columna ya que estos son típicamente mayúsculas en Oracle; solo son un caso menor o mixto si se crean con comillas dobles a su alrededor.
En varias ocasiones, necesitaríamos una lista separada por comas de todas las columnas de una tabla en un esquema. En tales casos, podemos utilizar esta función genérica que recupera la lista separada por comas como una cadena.
CREATE OR REPLACE FUNCTION cols(
p_schema_name IN VARCHAR2,
p_table_name IN VARCHAR2)
RETURN VARCHAR2
IS
v_string VARCHAR2(4000);
BEGIN
SELECT LISTAGG(COLUMN_NAME , '','' ) WITHIN GROUP (
ORDER BY ROWNUM )
INTO v_string
FROM ALL_TAB_COLUMNS
WHERE OWNER = p_schema_name
AND table_name = p_table_name;
RETURN v_string;
END;
/
Por lo tanto, simplemente llamando a la función desde la consulta produce una fila con todas las columnas.
select cols(''HR'',''EMPLOYEES'') FROM DUAL;
EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID
Nota: LISTAGG
fallará si la longitud combinada de todas las columnas supera los 4000
caracteres, lo cual es raro. Para la mayoría de los casos, esto funcionará.
Encuentro esto útil en Oracle:
SELECT
obj.object_name,
atc.column_name,
atc.data_type,
atc.data_length
FROM
all_tab_columns atc,
(SELECT
*
FROM
all_objects
WHERE
object_name like ''GL_JE%''
AND owner = ''GL''
AND object_type in (''TABLE'',''VIEW'')
) obj
WHERE
atc.table_name = obj.object_name
ORDER BY
obj.object_name,
atc.column_name;
La única forma en que pude obtener los nombres de las columnas fue usando la siguiente consulta:
select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like ''USERS''
La consulta para usar con Oracle es:
String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME=''"+_db+".users'' and COLUMN_NAME not in (''password'',''version'',''id'')"
Nunca he oído hablar de HQL para tales consultas. Supongo que no tiene sentido que las implementaciones de ORM lo solucionen. ORM es un mapeo relacional de objetos, y lo que está buscando es la asignación de metadatos ... No usaría HQL, más bien usaría métodos de API para este propósito o dirigiría SQL. Por ejemplo, puede usar JDBC DatabaseMetaData .
Creo que tablespace no tiene nada que ver con el esquema. Los espacios de tabla de AFAIK se utilizan principalmente para fines técnicos internos lógicos que deberían molestar a los DBA. Para obtener más información sobre los espacios de tabla, consulte Oracle doc .
La siguiente consulta me funcionó en la base de datos Oracle.
select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME=''MyTableName'';
Puede intentar esto: (Funciona en 11g y devuelve todo el nombre de columna de una tabla, aquí test_tbl es el nombre de la tabla y user_tab_columns son columnas de la tabla permitidas por el usuario)
select COLUMN_NAME from user_tab_columns
where table_name=''test_tbl'';
Puede usar la consulta siguiente para obtener una lista de nombres de tabla que utiliza la columna específica en DB2:
SELECT TBNAME
FROM SYSIBM.SYSCOLUMNS
WHERE NAME LIKE ''%COLUMN_NAME'';
Nota: aquí reemplace COLUMN_NAME
con el nombre de la columna que está buscando.
Puedes intentar esto:
describir ''Nombre de tabla''
Devolverá todos los nombres de columna y tipos de datos
en Oracle puedes usar
desc users
para mostrar todas las columnas que contienen en la tabla de usuarios