只有兩種
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),個(gè)舊企業(yè)網(wǎng)站建設(shè),個(gè)舊品牌網(wǎng)站建設(shè),網(wǎng)站定制,個(gè)舊網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,個(gè)舊網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
在某一列后面,就用AFTER,放在最后面
在一張表的最前面,用FIRST關(guān)鍵字
沒(méi)有BEFORE關(guān)鍵字
ALTER [IGNORE] TABLE tbl_name ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
在Oracle 10g有幾種查找數(shù)據(jù)的方法,了解這些查找數(shù)據(jù)的方法,有利于我們讀懂執(zhí)行計(jì)劃,并通過(guò)執(zhí)行計(jì)劃來(lái)優(yōu)化我們的ORacle數(shù)據(jù)庫(kù)系統(tǒng)。查找數(shù)據(jù)主要有以下方式:
全表掃描和RowId查找數(shù)據(jù)
1.1 全表掃描(Full Table Scans)
有時(shí)Oracle數(shù)據(jù)庫(kù)在評(píng)估最優(yōu)執(zhí)行計(jì)劃時(shí),當(dāng)去取大量數(shù)據(jù)時(shí),就會(huì)優(yōu)先考慮使用全表掃描,因?yàn)檫@時(shí)全表掃描是最優(yōu)的。一般取出的數(shù)據(jù)占表的數(shù)據(jù)5%--10%左右會(huì)發(fā)生表掃描,一般在OLTP系統(tǒng)中盡量避免表掃描。為了更好的使用表掃描,提高效率,在oracle 中有好幾種分區(qū)方法,提高表掃描的效率,讓表按具體業(yè)務(wù)邏輯來(lái)分區(qū),盡量做到分區(qū)消除,減少表掃描的大小,提高性能。
1.2 ROWID查找數(shù)據(jù)(Table Access by ROWID 或 Rowid lookup)
行ROWID是行數(shù)據(jù)在數(shù)據(jù)庫(kù)文件,數(shù)據(jù)塊和行在塊的具體位置,所以是Oracle最快的定位方法。這種方法只能一次讀取一個(gè)IO,不會(huì)涉及多個(gè)IO
首先我想說(shuō)一個(gè)問(wèn)題:就是權(quán)限問(wèn)題,比如說(shuō)你使用一個(gè)用戶登陸了數(shù)據(jù)庫(kù),那么你有權(quán)限查看別的用戶下的數(shù)據(jù)嗎?如果沒(méi)有授權(quán),就算是DBA登陸了,也不能查看其它用戶的私有數(shù)據(jù)(沒(méi)有授權(quán)的).
不過(guò)要是查看某個(gè)用戶(查詢自己的用戶名:select user from dual)下面的某個(gè)表中是否含有某個(gè)數(shù)據(jù),按理論來(lái)說(shuō),是可以實(shí)現(xiàn)的.不過(guò)實(shí)現(xiàn)過(guò)程不是一般的復(fù)雜.
我這樣想的:
寫一個(gè)過(guò)程,參數(shù)有:用戶名,是輸入?yún)?shù),varchar2,要查找的字符串,in varchar2(因?yàn)槊糠N類型都可以轉(zhuǎn)換為這個(gè)類型,除了blob,clob),再一個(gè)就是out sys_cursor.
第三個(gè)參數(shù)因?yàn)椴淮_定幾個(gè)表中有這個(gè)數(shù)據(jù),所以要用游標(biāo)類型.
過(guò)程中用到DBMS_SQL這個(gè)包,與all_objects這個(gè)視圖,
先根據(jù)視圖查詢出這個(gè)用戶下面有哪些表,
SELECT * FROM All_Objects WHERE owner='USERNAME' AND object_type='TABLE'
存在一個(gè)數(shù)組中,然后LOOP這個(gè)數(shù)組,
使用DBMS_SQL這個(gè)包根據(jù)條件查詢,對(duì)表進(jìn)行查詢.
對(duì)DBMS_SQL這個(gè)包的使用你可以上網(wǎng)查,網(wǎng)上很多.
不過(guò)由于進(jìn)行的查詢操作比較多,所以就算寫出來(lái)了這個(gè)過(guò)程,時(shí)間上可能要花費(fèi)比較大.少也要幾秒鐘,多的話,很多很多幾分鐘也是可能的.這個(gè)主要看表的多少,與表中數(shù)據(jù)量的多少.
如果要查詢的用戶下面,有四五個(gè)表中的數(shù)據(jù),都超過(guò)了幾千萬(wàn)條的話,這個(gè)過(guò)程我覺得可能就會(huì)跑一段時(shí)間了.因?yàn)閹浊f(wàn)條的數(shù)據(jù),對(duì)一個(gè)沒(méi)有索引的查詢是多么的慢,而且還要對(duì)每一列的每一個(gè)數(shù)據(jù)進(jìn)行匹配.所以說(shuō)在時(shí)間上花費(fèi)會(huì)比較大,
自己寫著玩還可以.不過(guò)要是真的要用的話,我覺得可能性不是很大.
我剛剛寫了一個(gè)存儲(chǔ)過(guò)程,測(cè)試過(guò)了,
如果說(shuō)得到一個(gè)表的所有數(shù)據(jù),數(shù)據(jù)大的時(shí)候,會(huì)報(bào)buffer overflow.所以我又加了幾個(gè)參數(shù),取哪一列的第幾行到第幾行的數(shù)據(jù)。以作參考:
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('第三個(gè)參數(shù)不可大于第四個(gè)參數(shù)');
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列,
也就是說(shuō)要新增加一個(gè)新的D列,原D變?yōu)镋
那樣,你右鍵點(diǎn)D列的列標(biāo),里面有插入。
1、使用變量替換,比如:
1
insert into XX values(id, 'name');
2、把sql寫入文本中,就是insert into ....,關(guān)閉oracle的反饋
1
2
3
4
set feedback off; -- 關(guān)閉oracle的自動(dòng)反饋
@D:\insert.txt
-- 或者
start D:\insert.txt
可以根據(jù)where條件去找的
什么時(shí)候開始錯(cuò)誤的
找最后正常天之后的數(shù)據(jù)出來(lái)對(duì)
范圍慢慢縮小,你這種情況,肯定是業(yè)務(wù)數(shù)據(jù)保存的時(shí)候沒(méi)有SQL過(guò)濾