我想写个过程,参数是一个sql语句,字段数不定。执行后我想知道它的字段名和总字段数,请问如何做?

解决方案 »

  1.   

    提供一个思路
    使用动态SQL create view as 输入的SQL语句,然后查询它对应的数据字典。
      

  2.   

    用.net做过取sql字段名的,个数是查询结果的行数。.net如下语句:
     Dim dbConnect As OleDbConnection 
     dbConnect = New OleDbConnection(strDBConStr)
     dbConnect.Open() Dim dt As DataTable = dbConnect.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, New Object() {Nothing, Nothing, TableName})备注:
     1、其中strDBConStr为联结DB的字符串。
     2、dt的返回结果类似如下:
     { dt:
    TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME .....DOMAIN_NAME  TAB00 TAB2 NAME   1 False   24 False 131     10 0   
    TAB00 TAB2 OLD   2 False   24 False 131     10 0
             .........                      
     }
     3、第三列就是字段名,记录行数就是字段个数。
      

  3.   

    我的回答有误!请取消。别给分,谢谢!楼主的问题,我也不知道如何用sql实现,但想一想,如果用后台处理好象不难。
    写个按照表进行查询字段名、统计字段个数的过程;每次调用,把使用到的表传到你的过程中。当然如何以表为参数查出字段名、统计字段个数,我也不z到了,DBA的高手应该知道。
      

  4.   

    create or replace p_test(v_sql varchar2)
    is
      tmp_sql varchar2(256);
      i       number:=0;
      type cur_proc is ref cursor;
      c_proc cur_proc;
    begin
         tmp_sql:='create table tmp_table as '|| v_sql;
         execute tmp_sql;
         open c_proc is select column_name from user_tab_columns where table_name='TMP_TABLE';
         loop
             dbms_output.put_line(c_proc.column_name);
             i:=i+1;
         end loop;
         dbms_output.put_line('共有'||i||'个字段');
         drop table tmp_table;
    end;
    没测试,不知道行不行
    大体思路是建立一个跟传进来的sql结构一样的临时表,然后从系统表中读取字段名称及个数,最后删除临时表!
    不知道有没有更简单的方法,楼下接着说:)
      

  5.   

    open c_proc is select column_name from user_tab_columns where table_name='TMP_TABLE';
    写错了
    open c_proc for select column_name from user_tab_columns where table_name='TMP_TABLE';