只有两种
创新互联建站是一家集网站建设,个旧企业网站建设,个旧品牌网站建设,网站定制,个旧网站建设报价,网络营销,网络优化,个旧网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
在某一列后面,就用AFTER,放在最后面
在一张表的最前面,用FIRST关键字
没有BEFORE关键字
ALTER [IGNORE] TABLE tbl_name ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
在Oracle 10g有几种查找数据的方法,了解这些查找数据的方法,有利于我们读懂执行计划,并通过执行计划来优化我们的ORacle数据库系统。查找数据主要有以下方式:
全表扫描和RowId查找数据
1.1 全表扫描(Full Table Scans)
有时Oracle数据库在评估最优执行计划时,当去取大量数据时,就会优先考虑使用全表扫描,因为这时全表扫描是最优的。一般取出的数据占表的数据5%--10%左右会发生表扫描,一般在OLTP系统中尽量避免表扫描。为了更好的使用表扫描,提高效率,在oracle 中有好几种分区方法,提高表扫描的效率,让表按具体业务逻辑来分区,尽量做到分区消除,减少表扫描的大小,提高性能。
1.2 ROWID查找数据(Table Access by ROWID 或 Rowid lookup)
行ROWID是行数据在数据库文件,数据块和行在块的具体位置,所以是Oracle最快的定位方法。这种方法只能一次读取一个IO,不会涉及多个IO
首先我想说一个问题:就是权限问题,比如说你使用一个用户登陆了数据库,那么你有权限查看别的用户下的数据吗?如果没有授权,就算是DBA登陆了,也不能查看其它用户的私有数据(没有授权的).
不过要是查看某个用户(查询自己的用户名:select user from dual)下面的某个表中是否含有某个数据,按理论来说,是可以实现的.不过实现过程不是一般的复杂.
我这样想的:
写一个过程,参数有:用户名,是输入参数,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 colcol_cnt THEN
dbms_output.put_line('给出的列值太大');
ELSIF tf 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;
第四列即D列,
也就是说要新增加一个新的D列,原D变为E
那样,你右键点D列的列标,里面有插入。
1、使用变量替换,比如:
1
insert into XX values(id, 'name');
2、把sql写入文本中,就是insert into ....,关闭oracle的反馈
1
2
3
4
set feedback off; -- 关闭oracle的自动反馈
@D:\insert.txt
-- 或者
start D:\insert.txt
可以根据where条件去找的
什么时候开始错误的
找最后正常天之后的数据出来对
范围慢慢缩小,你这种情况,肯定是业务数据保存的时候没有SQL过滤