2010-03-25 102 views
0
CREATE OR REPLACE PROCEDURE p_create_dynamic_table IS 
    v_qry_str VARCHAR2 (100); 
    v_data_type VARCHAR2 (30); 
BEGIN 
    SELECT data_type || '(' || data_length || ')' 
    INTO v_data_type 
    FROM all_tab_columns 
    WHERE table_name = 'TEST1' AND column_name = 'ZIP'; 

    FOR sql_stmt IN (SELECT * FROM test1 WHERE zip IS NOT NULL) 
    LOOP 
    IF v_qry_str IS NOT NULL THEN  
     v_qry_str := v_qry_str || ',' || 'zip_' || sql_stmt.zip || ' ' ||v_data_type;  
    ELSE  
     v_qry_str := 'zip_' || sql_stmt.zip || ' ' || v_data_type; 
    END IF; 
    END LOOP; 

    IF v_qry_str IS NOT NULL THEN 
    v_qry_str := 'create table test2 (' || v_qry_str || ')'; 
    END IF; 

    EXECUTE IMMEDIATE v_qry_str; 
    COMMIT; 
END p_create_dynamic_table; 

有沒有更好的方法來做到這一點?如何使用PL/SQL過程動態創建動態數據類型表

+1

試着解釋你爲什麼需要這個程序的原因。無論如何,提交併不需要,因爲DDL不是事務性的。 – FerranB 2010-03-25 23:20:40

+0

我99%相信你對這一切都是錯誤的。我的猜測是,你應該做更像這樣的事情,你將zip存儲爲值而不是列名。 CREATE TABLE test2( zip VARCHAR(10)PRIMARY KEY, value VARCHAR(30)) – 2010-03-26 07:05:14

回答

0

爲什麼不在表中創建一個視圖,其中只包含帶有zip的列?

create or replace view Zip_View as 
select * from test1 
where test1.zip is not null; 

這樣你就不需要複製數據。或者你確切的要求是什麼?

+0

我認爲Swapna希望每行包含另一個表中已知的每個郵政編碼的存儲桶。該視圖爲每個郵政編碼提供一行。我同意艾倫認爲這違反了1NF。也許這是解決一些一次性問題的一次性解決方案。 – DCookie 2010-03-25 20:45:11

1

如果我正確地閱讀此內容,看起來您要爲每個郵政編碼創建一個包含一列的新表。

我認爲你提出的答案是實現你陳述的目標的最佳方式。我想補充一點,你可能想對用於循環的遊標進行排序,這將確保列總是以相同的順序排列。

但是,您的目標非常可疑。退一步,考慮創建這張表是否真的是解決問題的正確方法可能更好。這似乎是一個大規模的非正常化,將是一個噩夢來維持。不知道爲什麼你採取這種方法,我不能提供更好的解決方案,但是,我認爲可能有一個。