第一篇:黑馬程序員C語言教程:C++語言78個常見編譯錯誤及分析
C語言常見編譯錯誤及分析大全 fatal error C1003: error count exceeds number;stopping compilation
中文對照:(編譯錯誤)錯誤太多,停止編譯 分析:修改之前的錯誤,再次編譯 fatal error C1004: unexpected end of file found
中文對照:(編譯錯誤)文件未結束
分析:一個函數或者一個結構定義缺少“}”、或者在一個函數調用或表達式中括號沒有配對出現、或者注釋符“/*?*/”不完整等 fatal error C1083: Cannot open include file: 'xxx': No such file or directory
中文對照:(編譯錯誤)無法打開頭文件xxx:沒有這個文件或路徑 分析:頭文件不存在、或者頭文件拼寫錯誤、或者文件為只讀 fatal error C1903: unable to recover from previous error(s);stopping compilation
中文對照:(編譯錯誤)無法從之前的錯誤中恢復,停止編譯 分析:引起錯誤的原因很多,建議先修改之前的錯誤 error C2001: newline in constant
中文對照:(編譯錯誤)常量中創建新行 分析:字符串常量多行書寫 error C2006: #include expected a filename, found 'identifier'
中文對照:(編譯錯誤)#include命令中需要文件名
分析:一般是頭文件未用一對雙引號或尖括號括起來,例如“#include stdio.h” error C2007: #define syntax
中文對照:(編譯錯誤)#define語法錯誤
分析:例如“#define”后缺少宏名,例如“#define” error C2008: 'xxx' : unexpected in macro definition
中文對照:(編譯錯誤)宏定義時出現了意外的xxx
分析:宏定義時宏名與替換串之間應有空格,例如“#define TRUE“1”” error C2009: reuse of macro formal 'identifier'
中文對照:(編譯錯誤)帶參宏的形式參數重復使用
分析:宏定義如有參數不能重名,例如“#define s(a,a)(a*a)”中參數a重復 error C2010: 'character' : unexpected in macro formal parameter list
中文對照:(編譯錯誤)帶參宏的形式參數表中出現未知字符 分析:例如“#define s(r|)r*r”中參數多了一個字符‘|’ error C2014: preprocessor command must start as first nonwhite space
中文對照:(編譯錯誤)預處理命令前面只允許空格
分析:每一條預處理命令都應獨占一行,不應出現其他非空格字符 error C2015: too many characters in constant 中文對照:(編譯錯誤)常量中包含多個字符 分析:字符型常量的單引號中只能有一個字符,或是以“”開始的一個轉義字符,例如“char error = 'error';” error C2017: illegal escape sequence 中文對照:(編譯錯誤)轉義字符非法
分析:一般是轉義字符位于 ' ' 或 “ ” 之外,例如“char error = ' 'n;” error C2018: unknown character '0xhh' 中文對照:(編譯錯誤)未知的字符0xhh 分析:一般是輸入了中文標點符號,例如“char error = 'E';”中“;”為中文標點符號 error C2019: expected preprocessor directive, found 'character' 中文對照:(編譯錯誤)期待預處理命令,但有無效字符
分析:一般是預處理命令的#號后誤輸入其他無效字符,例如“#!define TRUE 1” error C2021: expected exponent value, not 'character' 中文對照:(編譯錯誤)期待指數值,不能是字符
分析:一般是浮點數的指數表示形式有誤,例如123.456E error C2039: 'identifier1' : is not a member of 'identifier2' 中文對照:(編譯錯誤)標識符1不是標識符2的成員 分析:程序錯誤地調用或引用結構體、共用體、類的成員 error C2041: illegal digit 'x' for base 'n' 中文對照:(編譯錯誤)對于n進制來說數字x非法
分析:一般是八進制或十六進制數表示錯誤,例如“int i = 081;”語句中數字‘8’不是八進制的基數 error C2048: more than one default 中文對照:(編譯錯誤)default語句多于一個
分析:switch語句中只能有一個default,刪去多余的default
error C2050: switch expression not integral 中文對照:(編譯錯誤)switch表達式不是整型的
分析:switch表達式必須是整型(或字符型),例如“switch(“a”)”中表達式為字符串,這是非法的 error C2051: case expression not constant 中文對照:(編譯錯誤)case表達式不是常量
分析:case表達式應為常量表達式,例如“case “a””中““a””為字符串,這是非法的 error C2052: 'type' : illegal type for case expression 中文對照:(編譯錯誤)case表達式類型非法
分析:case表達式必須是一個整型常量(包括字符型)error C2057: expected constant expression 中文對照:(編譯錯誤)期待常量表達式
分析:一般是定義數組時數組長度為變量,例如“int n=10;int a[n];”中n為變量,這是非法的 error C2058: constant expression is not integral 中文對照:(編譯錯誤)常量表達式不是整數 分析:一般是定義數組時數組長度不是整型常量 error C2059: syntax error : 'xxx' 中文對照:(編譯錯誤)‘xxx’語法錯誤
分析:引起錯誤的原因很多,可能多加或少加了符號xxx error C2064: term does not evaluate to a function 中文對照:(編譯錯誤)無法識別函數語言
分析:
1、函數參數有誤,表達式可能不正確,例如“sqrt(s(s-a)(s-b)(s-c));”中表達式不正確
2、變量與函數重名或該標識符不是函數,例如“int i,j;j=i();”中i不是函數 error C2065: 'xxx' : undeclared identifier 中文對照:(編譯錯誤)未定義的標識符xxx 分析:
1、如果xxx為cout、cin、scanf、printf、sqrt等,則程序中包含頭文件有誤
2、未定義變量、數組、函數原型等,注意拼寫錯誤或區分大小寫。error C2078: too many initializers 中文對照:(編譯錯誤)初始值過多
分析:一般是數組初始化時初始值的個數大于數組長度,例如“int b[2]={1,2,3};” error C2082: redefinition of formal parameter 'xxx' 中文對照:(編譯錯誤)重復定義形式參數xxx 分析:函數首部中的形式參數不能在函數體中再次被定義 error C2084: function 'xxx' already has a body 中文對照:(編譯錯誤)已定義函數xxx 分析:在VC++早期版本中函數不能重名,6.0版本中支持函數的重載,函數名可以相同但參數不一樣
error C2086: 'xxx' : redefinition 中文對照:(編譯錯誤)標識符xxx重定義 分析:變量名、數組名重名
error C2087: '
分析:一般是定義二維數組時未指定第二維的長度,例如“int a[3][];”
error C2100: illegal indirection
中文對照:(編譯錯誤)非法的間接訪問運算符“*” 分析:對非指針變量使用“*”運算
error C2105: 'operator' needs l-value 中文對照:(編譯錯誤)操作符需要左值
分析:例如“(a+b)++;”語句,“++”運算符無效
error C2106: 'operator': left operand must be l-value 中文對照:(編譯錯誤)操作符的左操作數必須是左值 分析:
例如“a+b=1;”語句,“=”運算符左值必須為變量,不能是表達式
error C2110: cannot add two pointers 中文對照:(編譯錯誤)兩個指針量不能相加
分析:例如“int *pa,*pb,*a;a = pa + pb;”中兩個指針變量不能進行“+”運算
error C2117: 'xxx' : array bounds overflow 中文對照:(編譯錯誤)數組xxx邊界溢出
分析:一般是字符數組初始化時字符串長度大于字符數組長度,例如“char str[4] = “abcd”;”
error C2118: negative subscript or subscript is too large 中文對照:(編譯錯誤)下標為負或下標太大
分析:一般是定義數組或引用數組元素時下標不正確 error C2124: divide or mod by zero 中文對照:(編譯錯誤)被零除或對0求余 分析:例如“int i = 1 / 0;”除數為0
error C2133: 'xxx' : unknown size 中文對照:(編譯錯誤)數組xxx長度未知
分析:一般是定義數組時未初始化也未指定數組長度,例如“int a[];”
error C2137: empty character constant。中文對照:(編譯錯誤)字符型常量為空 分析:一對單引號“''”中不能沒有任何字符
error C2143: syntax error : missing 'token1' before 'token2'
error C2146: syntax 4error : missing 'token1' before identifier 'identifier' 中文對照:(編譯錯誤)在標識符或語言符號2前漏寫語言符號1 分析:可能缺少“{”、“)”或“;”等語言符號
error C2144: syntax error : missing ')' before type 'xxx' 中文對照:(編譯錯誤)在xxx類型前缺少‘)’ 分析:一般是函數調用時定義了實參的類型
error C2181: illegal else without matching if 中文對照:(編譯錯誤)非法的沒有與if相匹配的else 分析:可能多加了“;”或復合語句沒有使用“{}”
error C2196: case value '0' already used 中文對照:(編譯錯誤)case值0已使用 分析:case后常量表達式的值不能重復出現
error C2296: '%' : illegal, left operand has type 'float' 47 error C2297: '%' : illegal, right operand has type 'float' 中文對照:(編譯錯誤)%運算的左(右)操作數類型為float,這是非法的
分析:求余運算的對象必須均為int類型,應正確定義變量類型或使用強制類型轉換
error C2371: 'xxx' : redefinition;different basic types 中文對照:(編譯錯誤)標識符xxx重定義;基類型不同 分析:定義變量、數組等時重名
error C2440: '=' : cannot convert from 'char [2]' to 'char' 中文對照:(編譯錯誤)賦值運算,無法從字符數組轉換為字符
分析:不能用字符串或字符數組對字符型數據賦值,更一般的情況,類型無法轉換
error C2447: missing function header(old-style formal list?)51 error C2448: '
error C2450: switch expression of type 'xxx' is illegal 中文對照:(編譯錯誤)switch表達式為非法的xxx類型
分析:switch表達式類型應為int或char
error C2466: cannot allocate an array of constant size 0 中文對照:(編譯錯誤)不能分配長度為0的數組 分析:一般是定義數組時數組長度為0
error C2601: 'xxx' : local function definitions are illegal 中文對照:(編譯錯誤)函數xxx定義非法
分析:一般是在一個函數的函數體中定義另一個函數
error C2632: 'type1' followed by 'type2' is illegal 中文對照:(編譯錯誤)類型1后緊接著類型2,這是非法的 分析:例如“int float i;”語句
error C2660: 'xxx' : function does not take n parameters 中文對照:(編譯錯誤)函數xxx不能帶n個參數 分析:調用函數時實參個數不對,例如“sin(x,y);”
error C2664: 'xxx' : cannot convert parameter n from 'type1' to 'type2' 中文對照:(編譯錯誤)函數xxx不能將第n個參數從類型1轉換為類型2 分析:一般是函數調用時實參與形參類型不一致
error C2676: binary '<<' : 'class istream_withassign' does not define this operator or a conversion to a type acceptable to the predefined operator error C2676: binary '>>' : 'class ostream_withassign' does not define this operator or a conversion to a type acceptable to the predefined operator 分析:“>>”、“<<”運算符使用錯誤,例如“cin<
error C4716: 'xxx' : must return a value 中文對照:(編譯錯誤)函數xxx必須返回一個值
分析:僅當函數類型為void時,才能使用沒有返回值的返回命令。
fatal error LNK1104: cannot open file “Debug/Cpp1.exe” 中文對照:(鏈接錯誤)無法打開文件Debug/Cpp1.exe 分析:重新編譯鏈接
fatal error LNK1168: cannot open Debug/Cpp1.exe for writing 中文對照:(鏈接錯誤)不能打開Debug/Cpp1.exe文件,以改寫內容。分析:一般是Cpp1.exe還在運行,未關閉
fatal error LNK1169: one or more multiply defined symbols found 中文對照:(鏈接錯誤)出現一個或更多的多重定義符號。分析:一般與error LNK2005一同出現
error LNK2001: unresolved external symbol _main 中文對照:(鏈接錯誤)未處理的外部標識main 分析:一般是main拼寫錯誤,例如“void mian()”
error LNK2005: _main already defined in Cpp1.obj 中文對照:(鏈接錯誤)main函數已經在Cpp1.obj文件中定義 分析:未關閉上一程序的工作空間,導致出現多個main函數
warning C4003: not enough actual parameters for macro 'xxx' 中文對照:(編譯警告)宏xxx沒有足夠的實參 分析:一般是帶參宏展開時未傳入參數
warning C4067: unexpected tokens following preprocessor directive期待新行 分析:“#include
warning C4091: '' : ignored on left of 'type' when no variable is declared 中文對照:(編譯警告)當沒有聲明變量時忽略類型說明 分析:語句“int;”未定義任何變量,不影響程序執行
warning C4101: 'xxx' : unreferenced local variable 中文對照:(編譯警告)變量xxx定義了但未使用 分析:可去掉該變量的定義,不影響程序執行
warning C4244: '=' : conversion from 'type1' to 'type2', possible loss of data 中文對照:(編譯警告)賦值運算,從數據類型1轉換為數據類型2,可能丟失數據
分析:需正確定義變量類型,數據類型1為float或double、數據類型2為int時,結果有可能不正確,數據類型1為double、數據類型2為float時,不影響程序結果,可忽略該警告
warning C4305: 'initializing' : truncation from 'const double' to 'float' 中文對照:(編譯警告)初始化,截取雙精度常量為float類型 分析:出現在對float類型變量賦值時,一般不影響最終結果
warning C4390: ';' : empty controlled statement found;is this the intent? 中文對照:(編譯警告)‘;’控制語句為空語句,是程序的意圖嗎?
分析:if語句的分支或循環控制語句的循環體為空語句,一般是多加了“;”
warning C4508: 'xxx' : function should return a value;'void' return type assumed 中文對照:(編譯警告)函數xxx應有返回值,假定返回類型為void 分析:一般是未定義main函數的類型為void,不影響程序執行 c語言的錯誤對照表———— 在遇到錯誤時可以對照查看
warning C4552: 'operator' : operator has no effect;expected operator with side-effect 中文對照:(編譯警告)運算符無效果;期待副作用的操作符 分析:例如“i+j;”語句,“+”運算無意義
warning C4553: '==' : operator has no effect;did you intend '='? 中文對照:(編譯警告)“==”運算符無效;是否為“=”? 分析:例如 “i==j;” 語句,“==”運算無意義
warning C4700: local variable 'xxx' used without having been initialized 中文對照:(編譯警告)變量xxx在使用前未初始化
分析:變量未賦值,結果有可能不正確,如果變量通過scanf函數賦值,則有可能漏寫“&”運算符,或變量通過cin賦值,語句有誤
warning C4715: 'xxx' : not all control paths return a value 中文對照:(編譯警告)函數xxx不是所有的控制路徑都有返回值
分析:一般是在函數的if語句中包含return語句,當if語句的條件不成立時沒有返回值
warning C4723: potential divide by 0 中文對照:(編譯警告)有可能被0除 分析:表達式值為0時不能作為除數
warning C4804: '<' : unsafe use of type 'bool' in operation 中文對照:(編譯警告)‘<’:不安全的布爾類型的使用 分析:例如關系表達式“0<=x<10”有可能引起邏輯錯誤
第二篇:黑馬程序員C語言教程:C++易犯錯知識點黑馬程序員:一)
C++易犯錯知識點(一)
1、賦值構成一個表達式,具有值,其值為賦值符左邊表達式的值。表達式和語句的一個重要區別是,表達式有值,而語句沒有值。
2、隱式類型轉換總是朝著表達數據能力更強的方向,并且轉換總是逐個運算符進行的。如 float f=3.5;int n=6;long k=21;double ss=f*n+k/2;//在計算ss時,首先將f和n轉換成double,算得21,然后計算k/2得10,再將10(long int)轉換成double,最后得31。
27、C++基礎筆記(一)墨涵天地 有符號數向無符號數轉換。
3、當又有聲明又有定義時,定義中不允許出現默認參數,如果函數只有定義,才允許默認參數出現在定義中。默認值可以是一個全局變量,全局常量,或是一個函數,但是不能是局部變量,因為默認參數的函數調用是在編譯時確定的,而局部變量的位置和值在編譯時是無法確定的。如 int a=1;void fun(){ int i;void g(int x=i);//not right int g(int x=a);//right
}
4、define宏定義指令
1)使用其定義常量已被C++中的const定義語句所代替。2)用來定義帶參數的宏,已被C++的內聯函數所代替。3)其一個有效的使用是在條件編譯中。
5、編譯時必須知道數組的大小。如
int a[]={1,2,3,4,5};//編譯器會自動去數 for(int i=0;i 7、Free和malloc int* a;a=(int*)malloc(sizeof(int));cout< 8、指向常量的指針,指針常量,指向常量的指針常量 指向常量的指針:通過指針不能改變所指向的變量的值,但是指針的值可以變化(即指針可 以指向其它變量的地址)。形式如const int* pi=&a;原來的變量的訪問屬性也不會發生改變,如原來是普通變量,則其值可以變化,原來是常變量,則其值不能變化。 指針常量:在定義時必須初始化,且一旦賦值,則以后該指針的值將不會再發生變化(即不能再指向其它地址)。形如char* const pc=“abcd”;注意,pc的值是不能再改變了,但是*pc的值可以變化,如*pc=b;指向常量的指針常量:具有上述兩具指針的特點,須在定義時初始化,且一旦賦值,則以后該指針的值將不會再發生變化,且通過指針不能改變所指向的變量的值,形如const int* const cpc=“perfect”;注意,這種情況下,*cpc的值也是不能改變的,如*cpc=n是不對的。int main(){ char* const pc=“abcd”;cout< } 9、sum(int array[],int n)與sum(int* array,int n)是等價的。 10、函數返回值,可以返回堆地址,也可以返回全局或靜態變量的地址,但是不能返回局部變量的地址。 11、void指針是空類型指針,它不指任何類型,它僅僅是一個地址,不能進行指針運算,也不能進行間接引用。 NULL與void* 是不同的概念,NULL是一個指針值,任何類型的指針都可賦予該值。而void* 是一種類型(語法上是一個類型,本質上不是,沒有任何一個變量或對象,其類型為void),是一種無任何類型的指針。不允許對void進行引用。 12、由引號(“ ”)標識,但不是用來初始化數組的字符串,是字符串常量,如cout<<“hello”< 由于字符串常量的地址屬性,兩個同樣字符組成的字符串常量是不相等的,字符串常量的比較是地址的比較。 字符串常量,字符數組名(常量指針),字符指針均屬于同一種數據類型。 13、不能建立引用的數組,因為數組是某個數據類型的集合,數組名表示起始地址,它不是數據類型。如 int a[10];int& a1[10]=a;//not right 引用本身不是一種數據類型(int&不是類型,定義時也不產生內存空間),所以沒有引用的引用。也沒有引用的指針。引用是變量或對象的引用,而不是類型的引用,所以有空指針,但是沒有空引用。Int& ri=NULL //沒有意義 可以用引用返回值。在通常情況下,C++會建立一個臨時變量以將函數返回值帶回。但是如果用引用,則不用建立臨時變量。 C++規定,臨時變量或對象的生命周期在一個完整的語句表達式結束后便宣告結束。所以如果以返回值初始化一個引用,應當先建立一個變量,將函數返回值賦于這個變量,作如下處理: int x=fn1(5.0);//在這一句后臨時變量生命周期將結束 int& b=x;************************* float temp; float& fn2(float r){ temp=10*r;return temp;} 用如上的方法,則函數返回值將不再創建臨時變量,而直接與全局變量temp共享內存單元 ******************************* 以引用的初始化,可以是變量,也以是常量,也可以是一定類型的堆空間變量,但是引用不是指針,如下表達是不對的: int& a=new int(2); //not right 下面是用堆空間變量初始化引用的一個例子: #include //...{ cin>>rd; cout< cout<<&rd; } delete& rd;//或delete pd return 1;} 注意:用double& rd來定義引用,而&rd則是取引用所指向的空間的地址。 14、聲明一個結構并不分配內存,內存分配發生在定義這個新數據類型的變量中。結構不像數組,結構變量不是指針,&結構變量 取到的是結構中第一個成員變量的地址。結構變量可以相互賦值。結構成員不能作自身的結構變量,但是可以用結構指針作為成員。 15、將類定義和其它成員函數定義分開,是目前開發程序的通常做法。我們把類定義(頭文件)看成是類的外部接口,類的成員函數定義看成是類的內部實現。 類是一個抽象的概念,并不是一個實體,并不含有屬性值,而只有對象才占有一定的空間,含有明確的屬性值。 C++易犯錯知識點(二) 16、要想共享初始化的過程,可以先定義一個共享成員函數,然后每個構造函數都調用之。 17、C++提供的默認構造函數是個無參構造函數,它僅負責創建對象,而不做任何初始化工作。只要一個類定義了一個構造函數,C++就不再提供默認的構造函數。(如果此時還想要無參構造函數,則需要自己定義) 與變量定義類似,在用默認構造函數創建對象時,如果創建的是全局對象或靜態對象,則對象的位模式全為0,否則對象值是隨機的。創建對象的唯一途徑是調用構造函數。 靜態對象只被構造一次,所有全局對象都在主函數main()之前被構造。 18、面向對象程序設計主要是兩方面:面向對象應用程序設計,類庫的設計。面向對象程序設計的關鍵是如何抽象和分類。 19、全局變量、靜態變量、常量存放在全局數據區,所有類成員函數和非類成員函數代碼存放在代碼區,為運行函數而分配的局部變量、函數參數、返回數據、返回地址等存放在棧區,余下的空間都被作為堆區。 void* malloc(size_t);和void free(void*);在頭文件malloc.h中聲明。而操作符new和delete是C++的一部分,無須包含頭文件,它們都是從堆中分配和釋放內存塊,但是具體操作上兩者有很大的區別。 操作堆內存時,如果分配了內存,就有責任回收它,否則運行的程序將會造成內存泄露,這與函數中棧區分配局部變量有本質的區別。 從C++來說,不使用malloc()函數一個原因是,它在分配空間的時候不能調用構造函數。 類對象的建立是分配空間,構造結構及初始化的三位一體,它們統一由構造函數來完成。而new和delete在創建對象和刪除對象時,便同時調用構造函數和析構函數。 定義對象數組,在生成對象時,依次調用構造函數(如依次生成ps[0],ps[1],ps[2]......),由于分配數組時,new的格式是類型后面跟[元素個數](student* ps=new student[10]),不能再跟構造函數參數,所以從堆上分配對象數組,只能調用默認的構造函數,不能調用其它任何構造函數,如果該類沒有默認的構造函數,則分配對象數組失敗。Delete[] ps告訴C++將要該指針指向的是一個數組,如果在[]中填上了長度信息,C++將忽略。20、拷貝構造函數 當構造函數的參數為自身類的引用時,這個構造函數稱為拷貝構造函數。拷貝構造函數的功能是用一個已有對象初始化一個正在建立的同類對象。拷貝構造函數定義形式如下: Student(student& s) 27、C++基礎筆記(一)墨涵天地 Person p1; p2=p1; 27、C++基礎筆記(一)墨涵天地 27、C++基礎筆記(一)墨涵天地 在創建對象p2時,對象p1被復制給了p2,同時資源也作了復制,此時p1和p2指向不同的資源,這稱為深拷貝。 27、C++基礎筆記(一)墨涵天地 如果你的類需要析構函數來析構資源,則它也需要一個拷貝構造函數。C++提供的默認函 數只是對對象進行淺拷貝復制。如果對象的數據成員包括指向堆空間的指針,就不能使用這種拷貝方式,要自己定義拷貝構造函數,為創建的對象分配堆空間。 21、靜態成員 這種屬于類的一部分,但既不適用于普通成員函數,也不適用于全局變量表示的數據,我們用靜態成員來表示。 一般情況下,我們在類的內部實現中對靜態數據成員進行定義(在類的內部實現中分配空間和初始化)。 Int student::noOfstudent=0;靜態數據成員一般用于: 標志一個事件的發生與否,某個特定的指針,變化的對象等。 靜態成員函數定義是類的內部實現,屬于類的一部分,定義位置同一般成員函數。與靜態數據成員一樣,靜態成員函數與類相聯系,不與類的對象相聯系,所以訪問靜態成員函數時,不需要對象。如果用對象去引用靜態成員函數,只是用其類型。 #include } protected: char name[40];static int noOfStudents;};int Student::noOfStudents=1;int main(){ Student s;cout< ********************************* class Sc { public: void nsfn(int a);//類同聲明成Sc::nsfn(Sc* this,int a) static void sfn(int a);//無this指針 //...};void f(Sc& s){ s.nsfn(10);//C++編譯成Sc::nsfn(&s,10)s.sfn(10);//C++編譯成Sc::sfn(10)} 靜態的static一詞與靜態存儲類的static是兩個概念,一個論及類,一個論及內存空間的位置及作用域,所限定以要區分靜態對象和靜態成員。 9.通過子查詢建表 通過子查詢建表的例子 SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date FROM s_emp WHERE dept_id = 41;SQL> CREATE TABLE A as select * from B where 1=2;只要表的結構.10.用子查詢建表的注意事項 可以關連多個表及用集合函數生成新表,注意選擇出來的字段必須有合法的字段名稱,且不能重復。 用子查詢方式建立的表,只有非空NOT NULL的約束條件能繼承過來, 其它的約束條件和默認值都沒有繼承過來.根據需要,可以用alter table add constraint ……再建立其它的約束條件,如primary key等.11.Foreign Key的可選參數ON DELETE CASCADE 在創建Foreign Key時可以加可選參數: ON DELETE CASCADE它的含義是如果刪除外鍵主表里的內容,子表里相關的內容將一起被刪除.如果沒有ON DELETE CASCADE參數,子表里有內容,父表里的主關鍵字記錄不能被刪除掉.12.如果數據庫表里有不滿足的記錄存在,建立約束條件將不會成功.13.給表創建和刪除同義詞的例子 SQL> CREATE SYNONYM d_sum 2 FOR dept_sum_vu;SQL> CREATE PUBLIC SYNONYM s_dept 2 FOR alice.s_dept;SQL> DROP SYNONYM s_dept; 十、ORACLE里的數據字典 1.什么是數據字典?ORACLE的數據字典是數據庫的重要組成部分之一,它隨著數據庫 的產生而產生, 隨著數據庫的變化而變化, 體現為sys用戶下所有的一些表和視圖.2.數據字典里存了以下內容: 用戶信息 用戶的權限信息 所有數據對象信息表的約束條件統計分析數據庫的視圖等 不能手工修改數據字典里的信息.16 J2EE @ zxw 3.常用的數據字典 Dictionary 存放所有數據表,視圖,同義詞名稱和解釋 Dict_columns 數據字典里字段名稱的和解釋 Dba_users 用戶 Dba_tablespaces 表空間 Dba_data_files 數據庫的文件 Dba_free_space 空閑表空間 Dba_rollback_segs 回滾段 User_objects 數據對象 User_constraints 約束條件 User_sequences 序列號 User_views 視圖 User_indexes 索引 User_synonyms 同義詞 Session_roles 用戶的角色 User_role_privs 用戶的角色權限 User_sys_privs 用戶的系統權限 User_tab_privs 用戶的表級權限 V$session 實時用戶情況 V$sysstat 實時系統統計 V$sesstat 實時用戶統計 V$sgastat 實時SGA使用 V$locked_object 實時鎖 V$controlfile 控制文件 V$logfile 日志文件 V$parameter 參數文件 4.數據字典的分類 數據字典四大類別 User_ 用戶下所有數據庫對象 All_ 用戶權限范圍內所有的數據庫對象 Dba_ 所有的數據庫對象 V$Content$nbsp;統計分析數據庫的視圖 賦于oem_monitor權限非DBA用戶也可查詢V$*視圖 5.查詢數據字典 SQL> select * from dictionary where instr(comments,'index')>0;SQL> select constraint_name, constraint_type, 2 search_condition, r_constraint_name 3 from user_constraints 4 where table_name = ‘&table_name';十一.控制數據、INSERT(往數據表里插入記錄的語句)SQL> insert into 表名(字段名1, 字段名2, ……)values(值1, 值2, ……);SQL> insert into 表名(字段名1, 字段名2, ……)select(字段名1, 字段名2, ……)from 另外的表名 where 條件;可以用&標記變量的方法多次輸入記錄 快速插入數據的方法, 一般用于大于128M的數據轉移 SQL> insert /*+ append */ into 表名 select * from 另外的用戶名.另外的表名 WHERE 條件;SQL> commit;注意事項: 用INSERT /*+ APPEND */ 的方法會對target_tablename產生級別為6的獨占鎖,如果運行此命令時還有對target_tablename的DML操作會排隊在它后面, 對OLTP系統在用的表操作是不合適的。17 J2EE @ zxw 2.插入字符串類型的字段的注意事項: 字符串類型的字段值必須用單引號括起來, 例如: ’GOOD DAY’ 如果字段值里包含單引號’ 需要進行字符串轉換, 我們把它替換成兩個 單引號’ ’ 字符串類型的字段值超過定義的長度會出錯, 最好在插入前進行長度校驗 ‘’ 標記是NULL, user 標明當前用戶 日期字段的字段值可以用當前數據庫的系統時間SYSDATE, 精確到秒 用字符串轉換成日期型函數TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC.年-月-日 小時:分鐘:秒 的格式YYYY-MM-DD HH24:MI:SS NSERT時最大可操作的字符串長度小于等于4000個單字節, 如果要插入更長的字符串, 請考慮字段用CLOB類型, 方法借用ORACLE里自帶的DBMS_LOB程序包.3、UPDATE(修改數據表里記錄的語句)SQL> UPDATE 表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 條件;如果修改的值N沒有賦值或定義時, 將把原來的記錄內容清為NULL, 最好在修改前進行非空校驗;值N超過定義的長度會出錯, 最好在插入前進行長度校驗.新功能,可以修改子查詢后的結果集 例子:SQL> update(select * from s_dept)set id=50 where id=60; 4、DELETE(刪除數據表里記錄的語句)SQL> DELETE FROM 表名 WHERE 條件;注意:刪除記錄并不能釋放ORACLE里被占用的數據塊表空間.它只把那些 被刪除的數據塊標成unused.如果確實要刪除一個大表里的全部記錄, 可以用 TRUNCATE 命令, 它可以釋放占用的數據塊表空間 SQL> TRUNCATE TABLE 表名;此操作不可回退.5、SQL語句的分類 數據定義語言(DDL):create、alter、drop(創建、修改結構、刪除)(其他:rename)數據操縱語言(DML):insert、delete、select、update(增、刪、查、改)(其他:truncate) 數據控制語言(DCL):grant、revoke(授權、回收)、set role 事務控制:commit、rollback、savepoint(其他:lock table、set constraint、set transaction) 審計控制:audit、noaudit 系統控制:alter system 會話控制:alter session 其他語句:comment(添加注釋)、explain plan、analyze、validate、call 6、ORACLE里事務控制 Commit 提交事務 Rollback 回退事務 Savepoint 設置斷點, 在事務中標記位置, 事務結束, 斷點釋放 事務結束的情況遇到commit或者rollback遇到DDL和DCL語句發現錯誤,如死鎖用戶退出 SQL*PLUS系統重啟或崩潰 7.DML操作的注意事項 18 J2EE @ zxw 以上SQL語句對表都加上了行級鎖, 確認完成后, 必須加上事物處理結束的命令COMMIT 才能正式生效, 否則改變不一定寫入數據庫里.行級鎖也未能得到釋放.如果想撤回這些操作, 可以用命令 ROLLBACK 復原.在運行INSERT, DELETE 和 UPDATE 語句前最好估算一下可能操作的記錄范圍, 應該把它限定在較小(一萬條記錄)范圍內,.否則ORACLE處理這個事物用到很大的回退段.程序響應慢甚至失去響應.如果記錄數上十萬以上這些操作, 可以把這些SQL語句分段分次完成, 其間加上COMMIT 確認事物處理.太過頻繁的commit不好 sql語言的類型 數據語言實現數據的crud DML語句(Data Manipulation Language)數據庫操作語言 insert update delete select DDL語言 data definition Lanaguage create table create view index sequence synonym同義詞 truncate table DCL語言 data control language數據語言 commit rollback savetpointe OCA認證 OCP(dba)一起考, 參加oracle的培訓 2w Oracle數據庫管理員認證專員(OCA):Oracle Certified Associate Oracle數據庫管理員認證專家(OCP): Oracle Certified Professional Oracle數據庫管理員認證大師(OCM): Oracle Certified Master 語法: INSERT INTO table [(column [, column...])] VALUES(value [, value...]); --1 向表中插入所有列 insert into emp values(1, 'tom_111', 'enginerr', 7839, sysdate, 5000, 100, 10)--2 向表中插入部分列 insert into emp(empno, ename, job, hiredate)values(2, 'tom_2222', 'enginerr', sysdate) --3 隱式插入空值: 沒有寫出的列,默認為null值--4 顯示插入空值:--5 sql插入語言的地址符 & 取地址符后面相當于一個變量 mysql語言: preparedStatement語言 SQL> insert into emp(empno, ename, job, hiredate)values(&empno, &ename, &job, &hiredate);輸入 empno 的值: 3 輸入 ename 的值: 'tom_ccc' 輸入 job 的值: 'job' 輸入 hiredate 的值: '22-2月-81' 原值 1: insert into emp(empno, ename, job, hiredate)values(&empno, &ename, &job, &hiredate)新值 1: insert into emp(empno, ename, job, hiredate)values(3, 'tom_ccc', 'job', '22-2月-81') &地址符, 可以在任何sql語言中使用.在select 語言中也可以使用地址符 SQL> select ename, job, &tt from emp;輸入 tt 的值: deptno 原值 1: select ename, job, &tt from emp 新值 1: select ename, job, deptno from emp --7 批量插入數據--創建一張表 create table emp10 as select * from emp where 1=2;--一次性的將emp中所有10號部門的員工插入到emp10中 --在insert語言中使用子查詢 子查詢 不光用在查詢套查詢, 也可用在DML語句套select語句 insert into emp10--列完全一樣,可以不寫 select * from emp where deptno=10;delete from emp10; 有關update更新語句 UPDATE table SET column = value [, column = value,...] [WHERE condition];--列子 SQL> update emp10 set sal=2300 where empno=7934; 有關刪除數據 DELETE [FROM] table [WHERE condition]; delete和truncate表區別 delete逐條刪除 truncate先摧毀表再重建delete語言是DML語言 truncate是DDL DML語言可以閃回 做錯的并且提交了.可通過閃回,撤銷操作 DDL語言不可以閃回 flashback delete是逐條刪除,會產生碎片, truncate不會產生碎片 行移動功能: 要開啟閃回功能,必須要開啟行移動功能delete不會釋放空間 truncate會delete可以回滾 truncate不可以 oracle delete快 mysql truncate快.實驗: 從文件中導入數據, 通過命名delete 和 truncate刪除表數據 實驗 從文件中導入數據 SQL> set timing off;SQL> set feedback off;SQL> drop table testdelete purge;SQL> @c:Sql.sql;SQL> SQL> set timing on;//最后刪除數據表的時候,把時間打開,記錄時間 SQL> delete from testdelete;已用時間: 00: 00: 00.03 從文件中導入數據 SQL> set timing off;@c:Sql.sql; set timing off; select count(*)from testdelete;set timing on;//最后刪除數據表的時候,把時間打開,記錄時間 truncate table testdelete;已用時間: 00: 00: 00.39 事務基本概念 概念 一個或者多個DML語言組成特點 要么都成功,要么都失敗 特性 原子性 一致性 隔離性 持久性 事物的隔離性 多個客戶端同時操作數據庫的時, 要隔離他們的操作 否則:臟讀 不可重復讀 幻讀 設置不同的擱置級別來解決oracle中的事務 事務起始標志 DML語言(oracle默認事務似是打開的)2 事務的結束標志 提交: 顯示提交commit 隱式提交 1)執行DDL語言 eg create table語言 還有I個隱式的功能 提交之前的沒有提交的DML語言(insert update) 2)正常退出 回滾: 顯示 rollback 隱式 掉電/宕機/非正常退出==系統出錯了 oracle事務控制--保存點 create table testsavepoint(tid number, tname varchar2(20));set feedback on insert into testsavepoint values(1, 'tom1');insert into testsavepoint values(2, 'tom2');savepoint a;//創建一個保存點 insert into testsavepoint values(3, 'tom3a);rollback to savepoint a; 注意: 回退到savepoint a 前面插入的兩條sql語句還沒有提交;仍然還在一個事務里面;讓事務結束的方法 顯示 隱式 SQL> rollback / commit oracle數據的隔離級別問題 read only ,數據庫幾乎不做串行化操作,增加了read only SQL99第三篇:黑馬程序員C語言教程:C++易犯錯知識點黑馬程序員:二)
第四篇:黑馬程序員c語言教程:Oracle簡介
第五篇:黑馬程序員c語言教程:DML語言強化