Welcome 微信登录

首页 / 数据库 / MySQL / 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  
//  Oracle 学会怎么样分解复杂的问题经过验证的Linux下安装MySQL总结相关资讯      Oracle教程 
  • Oracle中纯数字的varchar2类型和  (07/29/2015 07:20:43)
  • Oracle教程:Oracle中查看DBLink密  (07/29/2015 07:16:55)
  • [Oracle] SQL*Loader 详细使用教程  (08/11/2013 21:30:36)
  • Oracle教程:Oracle中kill死锁进程  (07/29/2015 07:18:28)
  • Oracle教程:ORA-25153 临时表空间  (07/29/2015 07:13:37)
  • Oracle教程之管理安全和资源  (04/08/2013 11:39:32)
本文评论 查看全部评论 (0)
表情: 姓名: 字数