[英]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.