Oracle plsql中的循环
Oracle PS SQL嵌套循环:Oracle plsql中的循环,oracle,plsql,cursor,associative-array,Oracle,Plsql,Cursor,Associative Array,Oracle PS SQL嵌套循环: Table 1 key_col start_year End_year 1000 2008 2010 1002 2009 2012 对于每个key\u col值,我希望通过循环该key\u col的start\u year和end\u year插入行。 例如,对于key\u col=1000,我想在我的目标表中插入以下内容 key_col year 1000 2008 1000 2009 1000 2
Table 1
key_col start_year End_year
1000 2008 2010
1002 2009 2012
对于每个key\u col
值,我希望通过循环该key\u col
的start\u year
和end\u yea
r插入行。
例如,对于key\u col=1000
,我想在我的目标表中插入以下内容
key_col year
1000 2008
1000 2009
1000 2010
如何在PL SQL中实现这一点?这里有一种方法,使用CTE(公共表表达式)
年份
生成从min(在本例中)2008到max 2012的年份,然后将结果与原始数据右外连接
with years(yr) as(
select min_year + (level - 1)
from ( select min(start_year) as min_year
, max(end_year) as max_year
from your_table) t
connect by min_year + (level - 1) <= t.max_year
)
select s.key_col
, s.yr
from ( select *
from your_table yt
right join years y
on (y.yr >= yt.start_year and
y.yr <= yt.end_year)
) s
order by key_col
, yr
这里是一种方法,使用CTE(公共表表达式)
年份
生成从min(在本例中)2008年到max 2012年的年份,然后将结果与原始数据右外连接
with years(yr) as(
select min_year + (level - 1)
from ( select min(start_year) as min_year
, max(end_year) as max_year
from your_table) t
connect by min_year + (level - 1) <= t.max_year
)
select s.key_col
, s.yr
from ( select *
from your_table yt
right join years y
on (y.yr >= yt.start_year and
y.yr <= yt.end_year)
) s
order by key_col
, yr
您可以尝试使用以下代码:
BEGIN
FOR RECORD IN (SELECT KEY_COL,START_YEAR,END_YEAR FROM TABLE1)--Loop records in table 1
LOOP
FOR YEAR IN RECORD.START_YEAR .. RECORD.END_YEAR --Loop from start to end years
LOOP
DBMS_OUTPUT.PUT_LINE(RECORD.KEY_COL||' - '||YEAR);--Show values for testing
INSERT INTO TARGET_TABLE (KEY_COL,YEAR) VALUES (RECORD.KEY_COL,YEAR);-- Insert
END LOOP;
END LOOP;
END;
您可以尝试使用以下代码:
BEGIN
FOR RECORD IN (SELECT KEY_COL,START_YEAR,END_YEAR FROM TABLE1)--Loop records in table 1
LOOP
FOR YEAR IN RECORD.START_YEAR .. RECORD.END_YEAR --Loop from start to end years
LOOP
DBMS_OUTPUT.PUT_LINE(RECORD.KEY_COL||' - '||YEAR);--Show values for testing
INSERT INTO TARGET_TABLE (KEY_COL,YEAR) VALUES (RECORD.KEY_COL,YEAR);-- Insert
END LOOP;
END LOOP;
END;
可能的重复可能的重复
BEGIN
FOR RECORD IN (SELECT KEY_COL,START_YEAR,END_YEAR FROM TABLE1)--Loop records in table 1
LOOP
FOR YEAR IN RECORD.START_YEAR .. RECORD.END_YEAR --Loop from start to end years
LOOP
DBMS_OUTPUT.PUT_LINE(RECORD.KEY_COL||' - '||YEAR);--Show values for testing
INSERT INTO TARGET_TABLE (KEY_COL,YEAR) VALUES (RECORD.KEY_COL,YEAR);-- Insert
END LOOP;
END LOOP;
END;