首页 » ORACLE 9i-23c » oracle 排除(exclude)字段查询表

oracle 排除(exclude)字段查询表

如果一张表有30个字段,40个,100个…,反正就是不少字段时,如果你查询部分字段数据,是不是要一个个字段名都写上,有没有一种指明排除几个字段查询呢?今天看有人问这个问题,随便做一下。

SQL>CONN anbob/anbob

SQL> create table test_cols(id int);

Table created.

SQL> declare
2  v_sql varchar2(2000);
3  begin
4  for i in 1..20 loop
5   v_sql:='alter table test_cols add id'||i||' int';
6  execute immediate v_sql;
7  end loop;
8  end;
9  /

PL/SQL procedure successfully completed.

SQL> desc test_cols
Name                                                                                Null?    Type
----------------------------------------------------------------------------------- --------
ID                                                                                           NUMBER(38)
ID1                                                                                          NUMBER(38)
ID2                                                                                          NUMBER(38)
ID3                                                                                          NUMBER(38)
ID4                                                                                          NUMBER(38)
ID5                                                                                          NUMBER(38)
ID6                                                                                          NUMBER(38)
ID7                                                                                          NUMBER(38)
ID8                                                                                          NUMBER(38)
ID9                                                                                          NUMBER(38)
ID10                                                                                         NUMBER(38)
ID11                                                                                         NUMBER(38)
ID12                                                                                         NUMBER(38)
ID13                                                                                         NUMBER(38)
ID14                                                                                         NUMBER(38)
ID15                                                                                         NUMBER(38)
ID16                                                                                         NUMBER(38)
ID17                                                                                         NUMBER(38)
ID18                                                                                         NUMBER(38)
ID19                                                                                         NUMBER(38)
ID20

sql> CREATE OR REPLACE FUNCTION select_exclude (tabname VARCHAR2, exc_cols VARCHAR2)
-- parame tablename 表名
-- parame exc_cols 排除字段名 格式如'col1,col2,co3'
-- Copyright  zhangweizhao  www.anbob.com 2011-5-5
-- describe 排除字段查询

RETURN sys_refcursor
IS
type_cur     sys_refcursor;
v_sql        VARCHAR2 (4000);
v_cols       VARCHAR2 (1000);
v_exc_cols   VARCHAR2 (1000);
BEGIN
v_exc_cols := UPPER ('''' || REPLACE (exc_cols, ',', ''',''') || '''');
--select regexp_replace('tab1,tab2,tab3','([^,]+)','''\1''') from dual
v_sql :=
'select  cols  from (
SELECT wmsys.wm_concat (column_name) cols  FROM (SELECT   column_name  FROM all_tab_cols '
|| 'WHERE table_name = '''
|| UPPER (tabname)
|| ''' AND column_name NOT IN ('
|| v_exc_cols
|| ')    ORDER BY column_id))';

EXECUTE IMMEDIATE v_sql
INTO v_cols;

v_sql := 'select  ' || v_cols || '  from ' || tabname;

-- dbms_output.put_line(v_sql);
OPEN type_cur FOR v_sql;

RETURN type_cur;
END;

SQL> set linesize 4000
SQL> set wrap off
SQL> select select_exclude('test_cols','id11,id6') from dual;

SELECT_EXCLUDE('TEST
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

ID        ID1        ID2        ID3        ID4        ID5        ID7        ID8        ID9       ID10       ID12       ID13       ID14       ID15  ID16        ID17       ID18       ID19       ID20
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1          2
3          4
5          6
5                     6
5                     6
5                     6
5                     6

7 rows selected.

打赏

对不起,这篇文章暂时关闭评论。