在表和列名都是变量的情况下,如何动态循环处理表中所有列的值。

问题描述 投票:0回答:1

到目前为止,我有以下代码来循环处理所有的表和列名

    for table_names in (select table_name from all_tables) loop
        l_table_name := table_names.table_name;
            for col_names in (select column_name from all_tab_cols where table_name = l_table_name) loop
                l_col_name := col_names.column_name;

现在我想循环处理一列中的所有值。

                for vals in (select l_col_name from l_table_name) loop
                    dbms_output.put_line(1);
                end loop;

错误

PL/SQL: ORA-00942: table or view does not exist
oracle plsql dynamic-sql
1个回答
1
投票

你可以做一些动态SQL,但说实话,我不确定你会得到什么好处......但无论如何,这里有一些东西可以让你开始做。

SQL> declare
  2    rc sys_refcursor;
  3    l_date date;
  4    l_timestamp timestamp;
  5    l_number number;
  6    l_string varchar2(4000);
  7  begin
  8   for table_names in (select table_name from user_tables) loop
  9              for col_names in (select column_name , data_type from all_tab_cols where table_name = table_names.table_name) loop
 10                  open rc for 'select '||col_names.column_name||' from '||table_names.table_name;
 11                  loop
 12                    if col_names.data_type = 'DATE' then
 13                      fetch rc into l_date;
 14                      dbms_output.put_line(table_names.table_name||','||col_names.column_name||','||l_date);
 15                    elsif col_names.data_type like 'TIMESTAMP%' then
 16                      fetch rc into l_timestamp;
 17                      dbms_output.put_line(table_names.table_name||','||col_names.column_name||','||l_timestamp);
 18                    elsif col_names.data_type like 'NUMBER%' then
 19                      fetch rc into l_number;
 20                      dbms_output.put_line(table_names.table_name||','||col_names.column_name||','||l_number);
 21                    else
 22                      fetch rc into l_string;
 23                      dbms_output.put_line(table_names.table_name||','||col_names.column_name||','||l_string);
 24                    end if;
 25                    exit when rc%notfound;
 26                  end loop;
 27          end loop;
 28   end loop;
 29  end;
 30  /
EMP,EMPNO,7369
EMP,EMPNO,7499
EMP,EMPNO,7521
EMP,EMPNO,7566
EMP,EMPNO,7654
EMP,EMPNO,7698
EMP,EMPNO,7782
EMP,EMPNO,7788
EMP,EMPNO,7839
EMP,EMPNO,7844
EMP,EMPNO,7876
EMP,EMPNO,7900
EMP,EMPNO,7902
EMP,EMPNO,7934
EMP,EMPNO,7934
EMP,ENAME,SMITH
EMP,ENAME,ALLEN
EMP,ENAME,WARD
EMP,ENAME,JONES
EMP,ENAME,MARTIN
EMP,ENAME,BLAKE
EMP,ENAME,CLARK
EMP,ENAME,SCOTT
EMP,ENAME,KING
EMP,ENAME,TURNER
EMP,ENAME,ADAMS
EMP,ENAME,JAMES
EMP,ENAME,FORD
EMP,ENAME,MILLER
EMP,ENAME,MILLER
EMP,JOB,CLERK
EMP,JOB,SALESMAN
EMP,JOB,SALESMAN
EMP,JOB,MANAGER
EMP,JOB,SALESMAN
EMP,JOB,MANAGER
EMP,JOB,MANAGER
EMP,JOB,ANALYST
EMP,JOB,PRESIDENT
EMP,JOB,SALESMAN
EMP,JOB,CLERK
EMP,JOB,CLERK
EMP,JOB,ANALYST
EMP,JOB,CLERK
EMP,JOB,CLERK
EMP,MGR,7902
EMP,MGR,7698
EMP,MGR,7698
EMP,MGR,7839
EMP,MGR,7698
EMP,MGR,7839
EMP,MGR,7839
EMP,MGR,7566
EMP,MGR,
EMP,MGR,7698
EMP,MGR,7788
EMP,MGR,7698
EMP,MGR,7566
EMP,MGR,7782
EMP,MGR,7782
EMP,HIREDATE,17-DEC-80
EMP,HIREDATE,20-FEB-81
EMP,HIREDATE,22-FEB-81
EMP,HIREDATE,02-APR-81
EMP,HIREDATE,28-SEP-81
EMP,HIREDATE,01-MAY-81
EMP,HIREDATE,09-JUN-81
EMP,HIREDATE,09-DEC-82
EMP,HIREDATE,17-NOV-81
EMP,HIREDATE,08-SEP-81
EMP,HIREDATE,12-JAN-83
EMP,HIREDATE,03-DEC-81
EMP,HIREDATE,03-DEC-81
EMP,HIREDATE,23-JAN-82
EMP,HIREDATE,23-JAN-82
EMP,SAL,800
EMP,SAL,1600
EMP,SAL,1250
EMP,SAL,2975
EMP,SAL,1250
EMP,SAL,2850
EMP,SAL,2450
EMP,SAL,3000
EMP,SAL,5000
EMP,SAL,1500
EMP,SAL,1100
EMP,SAL,950
EMP,SAL,3000
EMP,SAL,1300
EMP,SAL,1300
EMP,COMM,
EMP,COMM,300
EMP,COMM,500
EMP,COMM,
EMP,COMM,1400
EMP,COMM,
EMP,COMM,
EMP,COMM,
EMP,COMM,
EMP,COMM,
EMP,COMM,
EMP,COMM,
EMP,COMM,
EMP,COMM,
EMP,COMM,
EMP,DEPTNO,20
EMP,DEPTNO,30
EMP,DEPTNO,30
EMP,DEPTNO,20
EMP,DEPTNO,30
EMP,DEPTNO,30
EMP,DEPTNO,10
EMP,DEPTNO,20
EMP,DEPTNO,10
EMP,DEPTNO,30
EMP,DEPTNO,20
EMP,DEPTNO,30
EMP,DEPTNO,20
EMP,DEPTNO,10
EMP,DEPTNO,10
BONUS,ENAME,CLERK
BONUS,JOB,CLERK
BONUS,SAL,10
BONUS,COMM,10
DEPT,DEPTNO,10
DEPT,DEPTNO,20
DEPT,DEPTNO,30
DEPT,DEPTNO,40
DEPT,DEPTNO,40
DEPT,DNAME,ACCOUNTING
DEPT,DNAME,RESEARCH
DEPT,DNAME,SALES
DEPT,DNAME,OPERATIONS
DEPT,DNAME,OPERATIONS
DEPT,LOC,NEW YORK
DEPT,LOC,DALLAS
DEPT,LOC,CHICAGO
DEPT,LOC,BOSTON
DEPT,LOC,BOSTON
SALGRADE,GRADE,1
SALGRADE,GRADE,2
SALGRADE,GRADE,3
SALGRADE,GRADE,4
SALGRADE,GRADE,5
SALGRADE,GRADE,5
SALGRADE,LOSAL,700
SALGRADE,LOSAL,1201
SALGRADE,LOSAL,1401
SALGRADE,LOSAL,2001
SALGRADE,LOSAL,3001
SALGRADE,LOSAL,3001
SALGRADE,HISAL,1200
SALGRADE,HISAL,1400
SALGRADE,HISAL,2000
SALGRADE,HISAL,3000
SALGRADE,HISAL,9999
SALGRADE,HISAL,9999

PL/SQL procedure successfully completed.

SQL>
SQL>
© www.soinside.com 2019 - 2024. All rights reserved.