簡體   English   中英

如何通過PL / SQL過程使用動態數據類型動態創建表

[英]How do I create a table dynamically with dynamic datatype from a PL/SQL procedure

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; 

有什么更好的辦法嗎?

如果我正確地閱讀了此內容,則似乎要創建一個新表,其中每個郵政編碼都包含一個列。

我認為您想出的答案是實現既定目標的最佳方法。 我要補充一點,您可能想對用於循環的游標進行排序,這將確保列始終保持相同的順序。

但是,您的目標值得高度懷疑。 最好退后一步,考慮創建此表是否真的是解決問題的正確方法。 這似乎是大規模的反規范化,並且將是一場噩夢。 不知道為什么要采用這種方法,我無法提供更好的解決方案,但是,盡管如此,我認為可能有一個解決方案。

為什么不在僅包含帶有zip列的表的表上創建視圖?

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

這樣,您無需復制數據。 或您的確切要求是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM