Это было бы немного динамического SQL, выбирая информацию из USER_TABLES
и USER_TAB_COLUMNS
.
Вот пример, основанный на схеме Скотта и ее таблицах DEPT
и SALGRADE
. Вы удалили (или изменили) предложение WHERE
из CUR_T
цикла курсора.
SQL> declare
2 l_str varchar2(2000);
3 begin
4 for cur_t in (select table_name
5 from user_tables
6 where table_name in ('DEPT', 'SALGRADE')
7 )
8 loop
9
10 l_str := 'create or replace view v_' || cur_t.table_name ||' as select ';
11
12 for cur_c in (select column_name
13 from user_tab_columns
14 where table_name = cur_t.table_name
15 )
16 loop
17 l_str := l_str ||
18 ' min(' || cur_c.column_name ||') ' || cur_c.column_name ||'_min, ' ||
19 ' max(' || cur_c.column_name ||') ' || cur_c.column_name ||'_max, ';
20 end loop;
21
22 l_str := rtrim(l_str, ', ') || ' from ' || cur_t.table_name;
23
24 dbms_output.put_line(l_str);
25 execute immediate(l_str);
26 end loop;
27 end;
28 /
PL/SQL procedure successfully completed.
SQL>
SQL> select * from v_dept;
DEPTNO_MIN DEPTNO_MAX DNAME_MIN DNAME_MAX LOC_MIN LOC_MAX
---------- ---------- -------------- -------------- ------------- -------------
10 40 ACCOUNTING SALES BOSTON NEW YORK
SQL> select * from v_salgrade;
GRADE_MIN GRADE_MAX LOSAL_MIN LOSAL_MAX HISAL_MIN HISAL_MAX
---------- ---------- ---------- ---------- ---------- ----------
1 5 700 3001 1200 9999
SQL>