La récupération des Noms de Colonnes et les types de Données en PLSQL
Je suis en train d'écrire un bloc PL SQL qui récupère toutes les colonnes et les types de données des tables dans la base de données. Je suis en mesure d'obtenir les colonnes , mais pas les types de données. La recherche de suggestions pour une bonne approche. Toute aide serait appréciée. Mon code est comme suit
ACCEPT p_1 PROMPT 'Please enter the Table Name'
DECLARE
v_table_name VARCHAR2(40) :='&p_1';
-- First cursor
CURSOR get_tables IS
SELECT DISTINCT table_name
FROM user_tables
WHERE UPPER(table_name) = UPPER(v_table_name);
--Second cursor
CURSOR get_columns IS
SELECT DISTINCT column_name
FROM user_tab_columns
WHERE table_name = v_table_name;
v_column_name VARCHAR2(100);
-- Third Cursor
CURSOR get_types IS
SELECT data_type
FROM user_tab_columns
WHERE table_name = v_table_name;
v_data_type user_tab_columns.data_type%type;
BEGIN
-- Open first cursor
OPEN get_tables;
FETCH get_tables INTO v_table_name;
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('Table = ' || v_table_name );
DBMS_OUTPUT.PUT_LINE('=========================');
CLOSE get_tables;
-- Open second cursor
OPEN get_columns;
FETCH get_columns INTO v_column_name;
WHILE get_columns%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(' ' || v_column_name);
FETCH get_columns INTO v_column_name;
END LOOP;
CLOSE get_columns;
--Open Third Cursor
OPEN get_types;
FETCH get_types into v_data_type;
WHILE get_types%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(' ' || v_data_type );
FETCH get_types into v_data_type;
END LOOP;
CLOSE get_types;
END;
Mes états d'erreur PLS-00371: au plus une déclaration pour "V_DATA_TYPE' est autorisé
Vous devez vous connecter pour publier un commentaire.
Pas un PLSQL gourou, mais voici mon grain.
Accessoires pour Eric, vérifiez cette fil et sa réponse.
Oubliez pas que vous pouvez utiliser
DESC
de commande pour décrire une Table Oracle, Vue, Synonyme, d'un forfait ou d'une Fonction. Il vous donnera le nom, data_type et de la longueur.Et si cela fonctionne pour vous, vous devriez être en mesure d'obtenir les données pour l'ensemble de vos tables, bien que je ne suis pas un grand fan de curseurs, vous devriez faire amende.
Essayez ceci:
Mais être prudent sur le type de données que vous avez choisi pour
v_data_type
variable.Bon effort, mais trop de code. vous avez besoin d'un court de vacances 🙂
Votre bloc a beaucoup trop de code. C'est tout ce dont vous avez besoin:
fin;
J'ai rencontré un problème similaire. Il peut être consulté ici: La récupération de Structure de Table avec SQL Dynamique.
De choses à noter, j'ai fait en sorte que si data_scale = 0 j'ai indiqué que c'était pour être un Entier, et si il a >0, on a un Double.