第一篇:黑马程序员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语言强化