oracle資料庫語法
A. oracle,where in,資料庫語法
兩個結果之間要用逗號分割
你的可以寫為
select * from tab
where id in (select xid frmo tabl) or id in ('1','2', '3', '4')
你那樣寫語法不對
B. oracle資料庫的基本語法與sql一樣嗎
sql語句基本相同,各廠商有自己新加語句,相似功能不同實現方法,所以某些語句有不同。
C. oracle 資料庫 create cluster語法格式解釋
PCTFREE存儲參數告訴ORACLE什麼時候應該將數據塊從對象的空閑列表中移出。ORACLE的默認參數是PCTFREE=10;
也就是說,一旦一個INSERT操作使得數據塊的90%被使用,這個數據塊就從空閑列表(freelist)中移出。
PCTUSED存儲參數告訴ORACLE什麼時候將以前滿的數據塊加到空閑列表中。當記錄從數據表中刪除時,資料庫的數據塊就有空間接受新的記錄,
但只有當填充的空間降到PCTUSED值以下時,該數據塊才被連接到空閑列表中,才可以往其中插入數據。PCTUSED的默認值是PCTUSED=40。
(1)PCTUSED較高意味著相對較滿的數據塊會被放置到空閑列表中,從而有效的重復使用數據塊的空間,但會導致I/O消耗。
PCTUSED低意味著在一個數據塊快空的時候才被放置到空閑列表中,數據塊一次能接受很多的記錄,因此可以減少I/O消耗,提高性能。
(2)PCTFREE的值較大意味著數據塊沒有被利用多少就從空閑列表中斷開連接,不利於數據塊的充分使用。
PCTFREE過小的結果是,在更新時可能會出現數據記錄遷移(Migration)的情況。
(註:數據記錄遷移(Migration)是指記錄在是UPDATE操作擴展了一個列後,
PCTFREE參數所指定的空間不夠擴展,從而記錄被ORACLE強制遷移到新的數據塊,發生這種情況將較嚴重的影響ORACLE的性能,出現更新緩慢)。
PCTFREE的使用
在Oracle中表的每一行數據由唯一的ROWID標記;而Oracle支持的數據類型中有一些長度是可變的,如VARCHAR,當對這些數據進行UPDATE時,
如果塊中的可用空間不能容納UPDATE後的數據行時,Oracle將會把此行移到其它數據塊,同時保留此數據行的ROWID不變,
並在原有塊中建一指針指向行遷移後的位置。
在這種情況下讀取一行數據將需要訪問2個數據塊,從而導致性能下降。PCTFREE保留的空間就是為確保更改後的數據行可以仍存放於原有數據塊中,
避免行遷移的情況發生。
PCTUSED的使用
當塊的使用的空間下降到PCTUSED後,此塊被重新放回空閑鏈表(Freelist)中,作為後續Insert的候選塊。同樣,
設置PCTUSED需要視數據行的特性和Insert、Update、Delete的模式而定,但必須遵守的原則是:db_block_size* (100 - PCTFREE - PCTUSED)必須比行的長度大。
對於數據行長度變化較大的情況,應使用最大行長度來計算PCTUSED,並且應使用較低的PCTUSED值。
因為在執行Insert時,如果數據塊的可用空間不能裝下一行數據,當塊的使用的空間是在PCTUSED之上,Oracle將把此塊從Freelist中移走;
當塊的使用的空間是在PCTUSED之下,Oracle將會擴展段空間。因此,PCTUSED如果設得過高,將導致段的不斷擴展。當數據行長度不大時,
使用預設的PCTUSED(40)是比較合適的;對於行長度較大的情況,最長的行有可能會佔用半個以上的塊空間,此時可設置PCTUSED為10。
較小的PCTUSED僅在表中的數據以隨機方式被刪除,而且仍有一些行長時間保留在塊中時,才會造成空間使用上的問題,
因為這些塊可能需要較長的時間才能或永遠不能重新被用於存放新數據。在這種應用中,如果空間利用率一直處於較低水平,
則需對PCTUSED進行分析和調整。
D. ORACLE資料庫 查詢表名 查詢列名 查詢列中所有數據的語法分別是
1.查詢所有表的表名: select table_name from user_tables
解釋:從系統表user_tables中可以查找出所有的表名字。
2.查詢表中的所有列名:desc table tablename(表名)。
解釋:通過desc (描述)tablename即可查找出表中的所有欄位。
3.查詢所有數據:select * from tablename t。
解釋:通過select 命令可以從tablename 中查找出所有的表數據。
E. Oracle資料庫和Sqlserver資料庫的SQL語法有什麼不同希望具體說一下,謝謝!
SQL語法基本一樣,只是相關的方法實現有些不同。如SqlServer的SUBSTRING、CHARINDEX....等,在Oracle是SUBSTR、INSTR...。
詳細的還真要花時間總結才能全面
F. Oracle資料庫的存儲過程怎麼寫
1 CREATE OR REPLACE PROCEDURE 存儲過程名
2 IS
3 BEGIN
4 NULL;
5 END;
行1:
CREATE OR REPLACE PROCEDURE 是一個SQL語句通知Oracle資料庫去創建一個叫做skeleton存儲過程, 如果存在就覆蓋它;
行2:
IS關鍵詞表明後面將跟隨一個PL/SQL體。
行3:
BEGIN關鍵詞表明PL/SQL體的開始。
行4:
NULL PL/SQL語句表明什麼事都不做,這句不能刪去,因為PL/SQL體中至少需要有一句;
行5:
END關鍵詞表明PL/SQL體的結束.
存儲過程創建語法:
create or replace procere 存儲過程名(param1 in type,param2 out type)
as
變數1 類型(值范圍); --vs_msgVARCHAR2(4000);
變數2 類型(值范圍);
Begin
Select count(*) into 變數1 from 表A where列名=param1;
If (判斷條件) then
Select 列名 into 變數2 from 表A where列名=param1;
Dbms_output。Put_line(『列印信息』);
Elsif (判斷條件) then
Dbms_output。Put_line(『列印信息』);
Else
Raise 異常名(NO_DATA_FOUND);
End if;
Exception
When others then
Rollback;
End;
G. oracle資料庫的 to char 和to date 區別
一、功能不同
1、to char:將時間日期按照指定的格式輸出,得到的是字元串,而非date類型。
2、to date:將字元串按照指定的格式輸出,得到的是日期類型。
二、語法不同
1、to char:to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') 。
2、to date:to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') 。
三、規則不同
1、to char:只要被轉換的是一個日期,yyyy,mm,dd中間加不加連接符,加什麼連接符都可以。
2、to date:第一個參數的yyyy,mm,dd之間有沒有連接符。如果有,那麼第二個參數必須有連接符,隨便是什麼連接符。
H. oracle建表語句例子有哪些
oracle資料庫的建表語句,具體語法如下:
語法說明:
tablename:在資料庫中需要創建的表的表名稱,在同一個資料庫中的表名稱是不能重復的;
column_name:創建的表的列名稱,列名稱在一個表中也是不能重復的;
datatype:創建的表的列中存放數據的數據類型;
null,not null:允許該列為空或者不為空,默認情況下是不為空;
constraint:為表中的列設置約束,如主鍵約束,外鍵約束,唯一約束等。
(8)oracle資料庫語法擴展閱讀
邏輯結構
它由至少一個表空間和資料庫模式對象組成。這里,模式是對象的集合,而模式對象是直接引用資料庫數據的邏輯結構。模式對象包括這樣一些結構:表、視圖、序列、存儲過程、同義詞、索引、簇和資料庫鏈等。邏輯存儲結構包括表空間、段和范圍,用於描述怎樣使用資料庫的物理空間。
總之,邏輯結構由邏輯存儲結構(表空間,段,范圍,塊)和邏輯數據結構(表、視圖、序列、存儲過程、同義詞、索引、簇和資料庫鏈等)組成,而其中的模式對象(邏輯數據結構)和關系形成了資料庫的關系設計。
段(Segment):是表空間中一個指定類型的邏輯存儲結構,它由一個或多個范圍組成,段將佔用並增長存儲空間。
其中包括:
數據段:用來存放表數據;
索引段:用來存放表索引;
臨時段:用來存放中間結果;
回滾段:用於出現異常時,恢復事務。
范圍(Extent):是資料庫存儲空間分配的邏輯單位,一個范圍由許多連續的數據塊組成,范圍是由段依次分配的,分配的第一個范圍稱為初始范圍,以後分配的范圍稱為增量范圍。
數據塊(Block):
是資料庫進行IO操作的最小單位,它與操作系統的塊不是一個概念。oracle資料庫不是以操作系統的塊為單位來請求數據,而是以多個Oracle資料庫塊為單位。
I. oracle資料庫中可以用 if exists 嗎,我用為什麼報錯
對於Oracle中沒有 if exists(...) 的語法,目前有許多種解決方法,這里先分析常用的三種,推薦使用最後一種
第一種是最常用的,判斷count(*)的值是否為零,如下
declare
v_cnt number;
begin
select count(*) into v_cnt from T_VIP where col=1;
if v_cnt = 0 then
dbms_output.put_line('無記錄');
end if;
end;
首先這種寫法讓人感覺很奇怪,明明只需要知道表裡有沒有記錄,卻去統計了全表的記錄數。
這種方式對於小表而言可以接受,一旦表記錄很多的時候,性能問題就非常嚴重
因此有人就作了些修改,改成 select count(*) into v_cnt from T_VIP where col=1 and rownum=1
看起來似乎解決了性能問題,但是分析執行計劃可以知道,實際上是一樣的,不推薦使用。
第二種是所謂進攻式編程,不作預先判斷,而是直接默認通過判斷,然後使用 exception 來捕獲異常
比如我這里不判斷表中是否有滿足條件的記錄,默認它有,如果沒有就在異常中進行處理
declare
v_1 number;
begin
select vip_level into v_1 from T_VIP where 1=0;
exception
when no_data_found then
dbms_output.put_line('無記錄');
end;
這種方式從性能上講比第一種要好得多
不過首先它沒辦法適應所有的情況,如第一段代碼它就沒辦法改造
其次這種代碼看起來讓人覺得好像是發生了異常,而不是正常運行,從而造成混亂,不推薦使用。
第三種是利用 Oracle 原有的 Exists 語法,如下
declare
v_cnt number;
begin
select count(*)
into v_cnt
from al
where exists (select * from t_vip where col=1);
if v_cnt = 0 then
dbms_output.put_line('無記錄');
end if;
end;
通過在語句的外面套上一層al,來使用oracle原有的exists語法
雖然和第一種看起來類似,但分析執行計劃可以知道,性能比以上兩種都要好得多,與MSSQL的 if exists 最接近,推薦使用。
可以把判斷封裝成一個函數以方便使用,代碼如下
CREATE OR REPLACE FUNCTION EXISTS2 (IN_SQL IN VARCHAR2)
RETURN NUMBER
IS
/**********************************************************
* 使用示例
* begin
* if EXISTS2('select * from al where 1=1')=1 then
* dbms_output.put_line('有記錄');
* else
* dbms_output.put_line('無記錄');
* end if;
* end;
*****************************************************************/
V_SQL VARCHAR2(4000);
V_CNT NUMBER(1);
BEGIN
V_SQL := 'SELECT COUNT(*) FROM DUAL WHERE EXISTS (' || IN_SQL || ')';
EXECUTE IMMEDIATE V_SQL INTO V_CNT;
RETURN(V_CNT);
END;
-
對於常用的insert判斷還有更簡單的寫法,比如以下代碼
if not exists(select * from table1 where id=1)
insert into table1 values(1,'a');
可以改寫成
insert
when (not exists(select * from table1 where id=1)) then
into table1
select 1 as id, 'a' as data from al;
-
再比如以下的代碼
if not exists(select * from table1 where id=2)
insert into table1 values(2,'b')
else
update table1 set data='b' where id=2;
可以改寫成
merge into table1 his
using
(
select 2 as id, 'b' as data from al
) src
on (his.id=src.id)
when matched then
update set his.data=src.data where id=src.id
when not matched then
insert values(src.id,src.data);
-
這里附帶說下,有人喜歡把count(*)寫成count(列名),不推薦後一種,因為列名是需要額外的操作,去查詢系統表來定位列信息
另外count(1)和count(*)沒有差別,推薦使用count(*)直觀明了
J. 遇到Oracle資料庫SQL語句語法錯誤請求解答!
t3.annexName之前少了分隔符【,】。
良好的編碼風格可以幫助你避免此類問題,也利於快速debug。
12345678910111213SELECT count(1) FROM ( SELECT t.newId ,t.title ,t.body ,t2.type ,t.publisher t3.annexName FROM LYTEST2 t LEFT JOIN LYTEST22 t2 ON t.type=t2.typeId LEFT JOIN LYTEST2ANNEX t3 ON t.annex=t3.annexId order by t.newId )