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