关于oracle里有没有像EXCEL那样的查找定位功能
发布网友
发布时间:2022-04-09 22:51
我来回答
共4个回答
热心网友
时间:2022-04-10 00:20
首先我想说一个问题:就是权限问题,比如说你使用一个用户登陆了数据库,那么你有权限查看别的用户下的数据吗?如果没有授权,就算是DBA登陆了,也不能查看其它用户的私有数据(没有授权的).
不过要是查看某个用户(查询自己的用户名:select user from al)下面的某个表中是否含有某个数据,按理论来说,是可以实现的.不过实现过程不是一般的复杂.
我这样想的:
写一个过程,参数有:用户名,是输入参数,varchar2,要查找的字符串,in varchar2(因为每种类型都可以转换为这个类型,除了blob,clob),再一个就是out sys_cursor.
第三个参数因为不确定几个表中有这个数据,所以要用游标类型.
过程中用到DBMS_SQL这个包,与all_objects这个视图,
先根据视图查询出这个用户下面有哪些表,
SELECT * FROM All_Objects WHERE owner='USERNAME' AND object_type='TABLE'
存在一个数组中,然后LOOP这个数组,
使用DBMS_SQL这个包根据条件查询,对表进行查询.
对DBMS_SQL这个包的使用你可以上网查,网上很多.
不过由于进行的查询操作比较多,所以就算写出来了这个过程,时间上可能要花费比较大.少也要几秒钟,多的话,很多很多几分钟也是可能的.这个主要看表的多少,与表中数据量的多少.
如果要查询的用户下面,有四五个表中的数据,都超过了几千万条的话,这个过程我觉得可能就会跑一段时间了.因为几千万条的数据,对一个没有索引的查询是多么的慢,而且还要对每一列的每一个数据进行匹配.所以说在时间上花费会比较大,
自己写着玩还可以.不过要是真的要用的话,我觉得可能性不是很大.
我刚刚写了一个存储过程,测试过了,
如果说得到一个表的所有数据,数据大的时候,会报buffer overflow.所以我又加了几个参数,取哪一列的第几行到第几行的数据。以作参考:
CREATE OR REPLACE PROCEDURE current_col_value(table_name VARCHAR2,col NUMBER,f NUMBER ,t NUMBER) IS
l_cursor INTEGER := dbms_sql.open_cursor;
l_state VARCHAR2(3000);
l_status INTEGER;
col_cnt INTEGER;
desc_tab dbms_sql.desc_tab;
v VARCHAR2(300);
BEGIN
l_state := 'select * from ' || table_name || ' where 1=2 ';
dbms_sql.parse(l_cursor, l_state, dbms_sql.native);
dbms_sql.describe_columns(l_cursor, col_cnt, desc_tab);
IF col>col_cnt THEN
dbms_output.put_line('给出的列值太大');
ELSIF t<f THEN
dbms_output.put_line('第三个参数不可大于第四个参数');
ELSE
l_state := 'select * from (select ' || desc_tab(col).col_name || ', rownum rnum from '
|| table_name||') where rnum between :f and :t';
dbms_sql.parse(l_cursor, l_state, dbms_sql.native);
dbms_sql.bind_variable(l_cursor,':f',f);
dbms_sql.bind_variable(l_cursor,':t',t);
dbms_output.put_line(l_state);
dbms_sql.define_column(l_cursor, 1, v, 300);
l_status := dbms_sql.execute(l_cursor);
LOOP
EXIT WHEN dbms_sql.fetch_rows(l_cursor) <= 0;
dbms_sql.column_value(l_cursor, 1, v);
dbms_output.put_line(v);
END LOOP;
END IF;
dbms_sql.close_cursor(l_cursor);
EXCEPTION
WHEN OTHERS THEN
IF dbms_sql.is_open(l_cursor) THEN
dbms_sql.close_cursor(l_cursor);
END IF;
END;
热心网友
时间:2022-04-10 01:38
这个真没有,excel充其量只能算一个表格,不能算一个数据库,像oracle,sql servlet,db2,mysql等这些数据库,都是没有这样的功能的!不好意思了、
热心网友
时间:2022-04-10 03:13
你可以使用pLSQL试试看,其如果使用SQL语句则更好
热心网友
时间:2022-04-10 05:04
我的excel 是关闭的数据表的格式 列数跟xlsx文件里也是一样的我用的系统是OleDbConnection _connection= new OleDbConnection(