繁体   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