Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle plsql中的循环_Oracle_Plsql_Cursor_Associative Array - Fatal编程技术网

Oracle plsql中的循环

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

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 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;