用SQL创建SQL来实现
select 'select ' from dual 
union
select column_name||',' from cols where table_name=tablename and column_name not ()
union 
select ' from tablename;' from dual;
呵呵,有点麻烦,不过不用写那么多字段了!类似的思路去创建视图或者直接用sql语句!

解决方案 »

  1.   

    lialin(阿林) 你写的这个语句改成什么样才能运行,我运行不了
      

  2.   

    create view v_test 
    as
    select col1,col2,....
    from table_name
    where .....
      

  3.   

    set serveroutput oncreate or replace procedure test
    (mytable in varchar2,col_list in varchar2)
    as
      type ref_cursor  is ref cursor;
      cursor_col       ref_cursor;
      tablename        varchar2(100);
      collist          varchar2(1000);  sqlstr           varchar2(1000);
      colname          varchar2(100);
      col_name         varchar2(100);
      colstr           varchar2(1000);
    begin
      tablename := upper(mytable);
      collist   := upper(col_list||',');
      sqlstr := 'select column_name from user_col_comments where table_name='''||tablename||'''';
      open cursor_col for sqlstr;
      loop
         fetch  cursor_col into colname;
         exit   when cursor_col%notfound;
         col_name := colname||',';
         if instrb(collist,col_name)=0 then
            colstr:=colstr||','||colname;
         end if;
      end loop;
      close cursor_col;
      colstr := substrb(colstr,2);
      sqlstr := 'select '||colstr||' from '||tablename;
      dbms_output.put_line(sqlstr);
      execute immediate sqlstr;
    end test;
    /
      

  4.   

    你咋会不知道表里有那些字段呢?
    desc table_name就知道了啊还有,如果你的不显示的字段是固定的
    那么,和一般的select语句有什么区别啊
    比如SQL> desc aa;
     Name                                      Null?    Type
     ----------------------------------------- -------- ------------
     ID                                                 NUMBER(2)
     NAME                                               VARCHAR2(8)
     SCORE                                              NUMBER(3)如果永远是score不显示,
    那么只要select id,name from aa我的过程可以帮你实现动态的功能
    即 你在执行的时候
    exec test('表名','不显示的字段列表');
    其中,不显示的字段列表用逗号分割如,我在存储过程里打印了你需要的SQL语句,你可以注释掉那行,然后
    返回结果集即可,自己再添加返回结果集的功能吧。。
    SQL> exec test('aa','id');
    select NAME,SCORE from AAPL/SQL procedure successfully completed.
      

  5.   

    要特别说明一下,
    有些人在建表的时候,把表名和字段名都用了引号

    create table "aa"(
    "id" number(2),
    "name" varchar2(8),
    "score" number(5)
    )如果是这样,我的程序会出错
    最好不要使用带引号的表名和字段名,会有很多麻烦的
      

  6.   

    ATGC我按照你写的语句去掉了这行set serveroutput on
    创建了存储过程,编译用过
    可是我调用时exec test('AJWC01','DW');
    出错
      

  7.   

    不可能,我这里没有问题
    我是说去掉dbms_output.put_line(sqlstr);dbms_output.put_line(sqlstr);是要和set serveroutput on配合起来使用的
    只有先set serveroutput on,才能显示dbms打印的内容你set serveroutput on 并不是存储过程的内容
    只是SQL*PLUS的一个命令而已这里只是为了显示一下给你看,你需要的SQL语句而已
      

  8.   

    出错的唯一可能性就是你输错了表名或者字段名
    你的exec test('AJWC01','DW');提出3个问题,第三个问题我已经在上面说明。。
    1、表的名字是AJWC01吗?
    2、不要的字段名是DW吗?
    3、你在建立字段名和表名的时候有引号吗?
      

  9.   

    是啊,是没有结果集返回,我只是给你得到了一条你需要的正确的select语句,并执行它,
    需要你自己添加代码,返回结果集
    你可以在论坛上搜索,
    “怎样在存储过程里返回查询结果集"
    自己试试啦。。
      

  10.   

    我把语句改成创建试图,运行时提示权限不足,我的权限已经是DBA了
    sqlstr := ' create or replace view FFF as  select '||colstr||' from '||tablename;
      

  11.   

    实际上很简单啦
    你只要在存储过程返回这个sqlstr给应用程序即可
    然后在应用程序里执行这个sqlstr比如java
    sql = sqlstr;
      

  12.   

    各位高手,小弟才开始学ORACLE,dbms_output.put_line这个的意思是不是象MSSQL中的PRINT函数阿
    ,是将字符段打印出来阿