用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语句!
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语句!
as
select col1,col2,....
from table_name
where .....
(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;
/
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.
有些人在建表的时候,把表名和字段名都用了引号
如
create table "aa"(
"id" number(2),
"name" varchar2(8),
"score" number(5)
)如果是这样,我的程序会出错
最好不要使用带引号的表名和字段名,会有很多麻烦的
创建了存储过程,编译用过
可是我调用时exec test('AJWC01','DW');
出错
我是说去掉dbms_output.put_line(sqlstr);dbms_output.put_line(sqlstr);是要和set serveroutput on配合起来使用的
只有先set serveroutput on,才能显示dbms打印的内容你set serveroutput on 并不是存储过程的内容
只是SQL*PLUS的一个命令而已这里只是为了显示一下给你看,你需要的SQL语句而已
你的exec test('AJWC01','DW');提出3个问题,第三个问题我已经在上面说明。。
1、表的名字是AJWC01吗?
2、不要的字段名是DW吗?
3、你在建立字段名和表名的时候有引号吗?
需要你自己添加代码,返回结果集
你可以在论坛上搜索,
“怎样在存储过程里返回查询结果集"
自己试试啦。。
sqlstr := ' create or replace view FFF as select '||colstr||' from '||tablename;
你只要在存储过程返回这个sqlstr给应用程序即可
然后在应用程序里执行这个sqlstr比如java
sql = sqlstr;
,是将字符段打印出来阿