2017-08-11 1 views
0

J'ai donc une table avec plus de 10000 enregistrements, avec des titres d'ID, produit, U, C, ELONG ... (cela continue avec diverses rubriques). Ce tableau comporte dans la colonne PRODUCT, 4 entrées possibles, CAPL, ZOD, HR et PKL. Je veux diviser cela pour qu'il y ait une table pour les données 'CAPL' seulement, les données ZOD uniquement les données HR uniquement et les données PKL seulement, dans SQL Developer. J'exécutez la commande suivante:SQL Developer Table de copie avec des données spécifiques

declare 
    l_sql varchar2(32767); 
    c_tab_comment varchar2(32767); 
    procedure run(p_sql varchar2) as 
    begin 
    execute immediate p_sql; 

    end; 
begin 
run('create table "MP".CAPLAAAA as select * from "MP"."LASTQTTBL" where PRODUCT = "CAPL"'); 
select comments into c_tab_comment from sys.all_TAB_comments where owner = 'MP' and table_name = 'LASTQTTBL' and comments is not null; 
run('comment on table MP.CAPLAAAA is '||''''||REPLACE(c_tab_comment, q'[']', q'['']')||''''); 

for tc in (select column_name from sys.all_tab_cols where owner = 'MP' and table_name = 'LASTQTTBL') 
    loop 
    for c in (select comments from sys.all_col_comments where owner = 'MP' and table_name = 'LASTQTTBL' and column_name=tc.column_name) 
    loop 
    run ('comment on column MP.CAPLAAAA.'||tc.column_name||' is '||''''||REPLACE(c.comments, q'[']', q'['']')||''''); 
end loop; 
end loop; 
EXCEPTION 
    WHEN OTHERS THEN NULL; 
end; 

Mais rien ne sort, même après l'exécution, il arrive avec « procédure PL/SQL terminée avec succès. » Sur la sortie du script.

Est-ce que je me trompe n'importe où? J'apprécierais beaucoup l'aide.

Répondre

0

Est-il nécessaire de conserver tous les commentaires de la table? Le script suivant crée 4 tables liées au nombre de produits dans une table TEST.

DROP TABLE TEST; 
/

CREATE TABLE TEST(A  VARCHAR2(20), 
        B  VARCHAR2(20), 
        C  VARCHAR2(20), 
        D  VARCHAR2(20), 
        PRODUCT VARCHAR2(20) 
       ); 
/

INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'CAPL'); 
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'CAPL'); 
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'ZOD'); 
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'ZOD'); 
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'HR'); 
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'HR'); 
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'PKL'); 
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'PKL'); 
/

SET SERVEROUTPUT ON; 
DECLARE 
    v_Sql VARCHAR2(100); 
    v_CodeResp INTEGER; 
    v_MsgResp VARCHAR2(500); 
    v_Name VARCHAR2(10); 
BEGIN 
    FOR x IN (SELECT PRODUCT 
         FROM TEST 
        GROUP BY PRODUCT) 
    LOOP 
     v_Name := x.PRODUCT; 
     v_Sql := 'CREATE TABLE ' || v_Name || 'AAAA AS SELECT A, B, C, D, PRODUCT FROM TEST WHERE PRODUCT = ' || ''''||v_Name||''''; 
     EXECUTE IMMEDIATE(v_Sql); 
    END LOOP; 

    COMMIT; 

    EXCEPTION 
     WHEN OTHERS THEN 
      v_CodeResp := SQLCODE; 
      v_MsgResp := v_CodeResp || ' ' || SUBSTR(SQLERRM, 300); 
     DBMS_OUTPUT.PUT_LINE(v_MsgResp); 
END;