J'ai une requête mySQL pour obtenir les colonnes d'une table comme celle-ci:
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')"
Comment modifier la requête ci-dessus dans la base de données Oracle 11g? Je dois obtenir les noms de colonnes sous forme de jeu de résultats pour la table 'utilisateurs', à l'exception de certaines colonnes spécifiant un schéma. À l’heure actuelle, j’ai toutes les tables dans mon nouvel espace de table. Par conséquent, dois-je spécifier le nom de l’espace de table au lieu du nom de schéma?
De plus, existe-t-il un HQL générique pour cela? Dans ma nouvelle base de données Oracle (je ne connais pas encore Oracle), je n’ai que le nom de l’espace table, c’est donc équivalent au nom du schéma (logique?)
L'équivalent Oracle pour information_schema.COLUMNS
est USER_TAB_COLS
pour les tables appartenant à l'utilisateur actuel, ALL_TAB_COLS
ou DBA_TAB_COLS
pour les tables appartenant à tous les utilisateurs.
L'espace de table n'est pas équivalent à un schéma, vous n'avez pas non plus à fournir le nom de l'espace de table.
Fournir le schéma/nom d'utilisateur serait utile si vous souhaitez interroger ALL_TAB_COLS
ou DBA_TAB_COLS
pour les colonnes de tables OF appartenant à un utilisateur spécifique. dans votre cas, j'imagine que la requête ressemblerait à quelque chose comme:
String sqlStr= "
SELECT column_name
FROM all_tab_cols
WHERE table_name = 'USERS'
AND owner = '" +_db+ "'
AND column_name NOT IN ( 'PASSWORD', 'VERSION', 'ID' )"
Notez qu'avec cette approche, vous risquez une injection SQL.
EDIT: Les noms de table et de colonne ont été mis en majuscule car ils sont généralement en majuscule dans Oracle; ils ne sont que des majuscules ou des minuscules s'ils sont créés avec des guillemets doubles.
La requête ci-dessous a fonctionné pour moi dans la base de données Oracle.
select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
dans Oracle, vous pouvez utiliser
desc users
pour afficher toutes les colonnes contenant dans la table des utilisateurs
La seule façon dont j'ai pu obtenir les noms de colonne a été d'utiliser la requête suivante:
select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'
La requête à utiliser avec Oracle est:
String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='"+_db+".users' and COLUMN_NAME not in ('password','version','id')"
Jamais entendu parler de HQL pour de telles requêtes. Je suppose que cela n’a aucun sens pour les implémentations ORM de s’y attaquer. ORM est un mappage relationnel objet et vous recherchez un mappage de métadonnées ... Vous ne voudriez pas utiliser HQL, mais plutôt utiliser des méthodes API à cet effet, ou utiliser du SQL direct. Par exemple, vous pouvez utiliser JDBC DatabaseMetaData .
Je pense que le tablespace n'a rien à voir avec le schéma. Les espaces de table AFAIK sont principalement utilisés à des fins techniques internes logiques, ce qui devrait déranger les administrateurs de base de données. Pour plus d'informations sur les espaces de table, voir doc Oracle .
À plusieurs reprises, nous aurions besoin d’une liste de toutes les colonnes d’une table séparée par des virgules dans un schéma. Dans de tels cas, nous pouvons utiliser cette fonction générique qui récupère la liste séparée par des virgules sous forme de chaîne.
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;
/
Ainsi, le simple fait d'appeler la fonction à partir de la requête génère une ligne avec toutes les colonnes.
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
Remarque: LISTAGG
échouera si la longueur totale de toutes les colonnes dépasse 4000
caractères, ce qui est rare. Dans la plupart des cas, cela fonctionnera.
Vous pouvez essayer ceci:
décrire 'Nom de la table'
Il renverra tous les noms de colonne et types de données
le fait est que crapaud vous devez écrire majuscule nom de la table, comme ceci:
select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
Je trouve celui-ci utile dans 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;
SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;
-> Notez que ceci est un résultat de requête, un ResultSet. Ceci est exportable dans d'autres formats ..__ Et vous pouvez aussi exporter le format Résultat de la requête au Text
. L'exportation ressemble à celle ci-dessous quand j'ai fait 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>
-> Remarque: il s'agit d'une sortie de script.