for循环中的Oracle动态Schema

时间:2018-01-10 14:09:19

标签: oracle for-loop dynamic plsql schema

如何在for循环中使用动态sql语句? 我有一个来自外部循环的变量i.owner,它表示Schema。

mydata %>% 
       group_by(Index) %>% 
       summarise(Mean_2014 = mean(Y2014))

## # A tibble: 3 x 2
##   Index  Mean_2014
##   <fctr>     <dbl>
## 1 A           1.00
## 2 C           1.00
## 3 I           1.00

游标会导致类似的问题。

1 个答案:

答案 0 :(得分:3)

您不能在cursor-for循环中使用动态SQL。您必须批量查询集合,或者可能更有用地使用open for, fetch and close pattern,例如:

declare
  c sys_refcursor;
begin
  for i in (<however you get the owner/table_name now>)
  loop

    open c for 'select * from ' || i.owner || '.' || i.table_name;
    loop
      begin
        fetch c into ...;
        exit when c%notfound;
      exception when others then DBMS_OUTPUT.PUT_LINE('error');
      end;
    end loop; -- j
    close c;
  end loop; -- i
end;
/

问题在于...部分 - 即您要获取的内容。如果表结构,或者至少是您要查询的列,每次循环i循环都是相同的,那么您可以定义单个标量变量以获取每个列,或者基于{{定义记录变量其中一个表的一个表(如果它们都是相同的,你总是有一个你知道存在的,并且你正在使用%rowtype),或者定义一个记录的字段可以解释你正在获取的内容。

如果结构可能有所不同,那么您必须查看select *包。

如果表名始终相同,并且不是来自dbms_sql循环,则可以略微简化为:

i