//在存储过程里面,我们常常将从一个表里面查询到的字段数据复制给一写变量,//然后调用包里面的函数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; beginselect 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)astype arry_type is table of varchar2(30) index by pls_integer;v_cols arry_type;beginselect tc.column_name bulk collectinto v_colsfrom user_tab_columns tcwhere tc.table_name=upper(table_name_in);for i in 1..v_cols.countloopdbms_output.put_line(v_cols(i));end loop;exceptionwhen others thendbms_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');EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO//SQL> exec pro_display_col('dept');DEPTNODNAMELOC////其实最简单的获取表字段的方法:SQL> col data_type format a13;SQL> select column_name,data_type,data_length,data_precision,data_scale2 from user_tab_columns3 where table_name=upper('emp');COLUMN_NAME DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE------------------------------ ------------- ----------- -------------- ----------EMPNO NUMBER 22 4 0ENAME VARCHAR2 10 JOB VARCHAR2 9 MGR NUMBER 22 4 0HIREDATE DATE 7 SAL NUMBER 22 7 2COMM NUMBER 22 7 2DEPTNO NUMBER 22 2 0//