现有一个数据库,创建了两个用户user1,user2。每个用户都给了dba权限,在每个用户都建了相同的表如tbl_user
通过以下sql查询该表的列名,将列名以逗号分隔显示    SELECT SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME, ','), 2) str
    FROM (SELECT COLUMN_NAME,
                 ROW_NUMBER() OVER(ORDER BY COLUMN_NAME) rn,
                 COUNT(*) OVER() cnt
            FROM all_tab_columns
           where TABLE_NAME = upper('tbl_user'))
    WHERE rn = cnt
    START WITH rn = 1
    CONNECT BY rn = PRIOR rn + 1;奇怪的是直接用pl/sql developer的sql窗口查询和将该sql放到存储过程中查询的结果不同!在sql窗口中查询的时候出现了重复的列名,即将数据库中两个用户下的表的列名给查了出来;
在存储过程中查询的列名没有重复!!
望各位老大赐教。

解决方案 »

  1.   

    應和你的登錄身份有關系,用user1或user2登錄,使用user_tab_columns替換all_tab_columnsall代表當前用戶有權限看的,user代表屬於當前用戶的
      

  2.   


    因为oracle在存储过程中对权限控制更严,从角色继承的权限无效。
    也就是说,user1虽然有DBA权限,但是在存储过程中也无法访问user2的table,所以查询all_tab_columns的时候也不会返回user2的表格的列。
      

  3.   

    补充下,如果user1要在存储过程中查询user2的table,必须显式赋予权限,
    grant select on user2.tablexxx to user1;