Oracle 用过程获得表的字段


//在存储过程里面,我们常常将从一个表里面查询到的字段数据复制给一写变量,  
//然后调用包里面的函数dbms_output.put_line()来将其打印出来;  
//下面是一个实例:  
procedure show_employee(empno_in in emp.empno%type)    
as    
  v_sign number;    
  v_empno emp.empno%type;    
  v_ename emp.ename%type;    
  v_deptno emp.deptno%type;    
begin  
     select 1 into v_sign    
     from dual    
     where exists(select count(*) from emp where empno=empno_in);    
     if v_sign=1 then    
        select empno,ename,deptno into v_empno,v_ename,v_deptno    
        from emp where empno=empno_in;    
        dbms_output.put_line('information of'||empno_in||' are:');    
        dbms_output.put_line('empno:'||v_empno||',ename:'||v_ename||',deptno:'||v_deptno);    
     end if;    
     exception    
     when others then    
          dbms_output.put_line('no data found');    
end show_employee;  
SQL> exec show_employee('7900');  
information of7900 are:  
empno:7900,ename:JAMES,deptno:30  
//  
//但是我们怎么样将一个表的结构用存储过程倒出来呢?  
//就是写一个过程,参数是传进去表的名字,然后打印出表的所有字段;  
create or replace procedure pro_display_col(table_name_in varchar2)  
as 
  type arry_type is table of varchar2(30) index by pls_integer;  
  v_cols arry_type;  
begin  
     select tc.column_name bulk collect  
            into v_cols  
     from user_tab_columns tc  
     where tc.table_name=upper(table_name_in);  
       
     for i in 1..v_cols.count  
     loop  
         dbms_output.put_line(v_cols(i));  
     end loop;  
       
     exception  
     when others then  
          dbms_output.put_line(sqlerrm);  
end pro_display_col;  
/  
//解析:  
//此处定义了一个嵌套表数据类型,通俗意义上叫做数组,没有最大限制,  
//并定义了一个接收返回值的字符串类型,30个字节,接受15个字符  
//我们也可以将其定义为接受30个字符的嵌套表:  
//type array_type is a table of varchar2(30 char) index by pls_integer;  
//index by pls_integer是为了获得column_name数据时,不需要用v_cols.extend  
//来为获取的数据显示开辟空间,如果没有index by pls_integer,  
//那么我们每次获取数据时都要为其显示的开辟空间,v_cols.extend;  
//关于bulk collect  
//采用bulk collect可以将查询结果一次性地加载到collections中。  
//而不是通过cursor一条一条地处理。  
SQL> exec pro_display_col('emp');  
EMPNO  
ENAME  
JOB  
MGR  
HIREDATE  
SAL  
COMM  
DEPTNO  
//  
SQL> exec pro_display_col('dept');  
DEPTNO  
DNAME  
LOC  
//  
//其实最简单的获取表字段的方法:  
SQL> col data_type format a13;  
SQL> select column_name,data_type,data_length,data_precision,data_scale  
  2  from user_tab_columns  
  3  where table_name=upper('emp');  
COLUMN_NAME                    DATA_TYPE     DATA_LENGTH DATA_PRECISION DATA_SCALE  
------------------------------ ------------- ----------- -------------- ----------  
EMPNO                          NUMBER                 22              4          0  
ENAME                          VARCHAR2               10                  
JOB                            VARCHAR2                9                  
MGR                            NUMBER                 22              4          0  
HIREDATE                       DATE                    7                  
SAL                            NUMBER                 22              7          2  
COMM                           NUMBER                 22              7          2  
DEPTNO                         NUMBER                 22              2          0  
// 

相关内容