当前位置:文档之家› 南天Oracle编程培训教材

南天Oracle编程培训教材

ORACLE ESQL/C程序设计

培训教材

2009年6月

目录

第一部分SQL查询语句 (3)

1、概述 (3)

2、如何使用SQL (3)

1.用户通过命令sqlplus user/passwd@sid进行到ESQL交互界面; (3)

2.开发时可以使用osql命令进行登录. (3)

3.通过设置export EDITOR=vi 当使用edi sel 时可以生成sel.sql (4)

4.当写完DDL或者是DML语句后, 保存退出 (4)

5.常用ORACLE在命令行上的命令 (4)

3、数据库数据类型 (4)

4、SQL语句摘要 (5)

1.数据定义语句 (6)

2.数据处理语句 (7)

3.数据权限语句 (14)

第二部分PROC*C简介 (15)

1、概述 (15)

2、ORACLE预编译设置 (15)

3、前导文件 (16)

4、宿主变量 (16)

5、连接到ORACLE (17)

6、错误处理(一) (17)

7、事务控制 (18)

8、使用结构与数组 (19)

9、使用游标 (20)

10、动态SQL语句 (21)

11、锁模式 (22)

第三部分INFORMIX与ORACLE差异之处 (23)

第四部分常用知识点滴 (24)

ORACLE SQL ESQL(C)

培训教材

广州南天电脑系统有限公司

2009年6月

第一部分SQL查询语句

1、概述

ESQL命令行查询方式,由Oracle公司提供的解析程序,可以用它对数据库进行操作.

例如:

.建立或删除数据库;

.建立或删除表或索引;

.插入或删除数据;

.选择不同的数据库;

.显示表的信息;

.授予或收回库\表特权等.

2、如何使用SQL

1.用户通过命令sqlplus user/passwd@sid进行到ESQL交互界

面;

2.开发时可以使用osql命令进行登录.

alias osql='cd ~/sql; pwd; sqlplus EXEC SQLORA_USER/EXEC SQLORA_PWD@EXEC SQLORACLE_SID; cd -'

3.通过设置export EDITOR=vi 当使用edi sel 时可以生成

sel.sql

这样就像vi一样的方式可以写DDL语句.

4.当写完DDL或者是DML语句后, 保存退出

相关命令可以运行刚才创建的语句

'/' : 运行刚才的DDL或者是DML

'l[ist]' : 显示编辑的角本语句

5.常用ORACLE在命令行上的命令

help clear

cl scr

desc s_emp

list

ed aa

/

help set (set line pagesize time head )

exit quit

spool

3、数据库数据类型

用户在数据库中必须注明每一字段的数据类型。

简要的ESQL有效数据类型如下:

CHAR(n)字符串的长度为n (1<=n<32,767)

INTERGER范围在-2,147,483,647到+2,147,483,647的全体整数

NUMBER[(m{,n})]十进制浮点数,其中包括所有有效数字为m(<=32)(精度)及小数点右边n(<=m)(标度)的数字。当用户给定了m值和n值,对NUMBER变量的操作将采用“固定小数点”的算法。所有绝对值小于0.5*10-n被赋为零,可以正确存储的此种类型的最大变量值为10m-n-10-n。

FLOAT 二进制浮点数,与双精度浮点类型数据一致。FLOAT数据类型值的范围

与用户机器中C语言的“double”数据类型的值域相同。在小机器中,SQL将FLOAT置为NUMBER(16)。

MONEY[(m[,n])]与NUMBER数据类型相似,MONEY类型数据也可以包含两个参数。

其中m,n的限度与NUMBER(m,n)中的相同。两者之间的不同就在于MONEY型变量显示有EXEC SQL符。MONEY(m)型被定义为NUMBER(m,2)并且如再无其它参数,MONEY的缺省定义为NUMBER(16,2)忽略参数的数目,MONEY型数据通常被看作定点十进制数。

DATE日期型值必须包含两个隔线标志,格式可以为mm/dd/yy或者mm/dd/yyyy。

Mm指明月份(1或者01为1月,2或者02为2月,以此类推)。Dd指明月中的某一天(从1到某月最大天数)。Yy和yyyy指明年份,当你仅用两位标明年份时,SQL假定你是指“19”**年。SQL的DATE型数据含有从1899年12月31起至某年某月某日的天数。

下表为数据库数据类型和C数据类型的对应:

4、SQL语句摘要

ORACLE使用这些不同类型的ESQL语句:

数据定义语句

?数据处理语句

?数据权限语句

?数据完整性语句

?辅助性语句

1. 数据定义语句

数据定义语句包括建立、删除数据库及其表名、视图及索引等;还包括修改或重命名某表和字段的语句。在下列语句中,只有DATABASE语句在对已存在的库中数据进行处理前是必须的。

CREATE DATABASE 建立一个数据库目录,启动系统目录,并且使新建的数据库

为当前数据库。任何时候只能有一个当前数据库。

CLOSE DATABASE 关闭当前数据库文件,只有2种SQL语句可以执行:?CREATE DATABASE

?DROP DATABASE

DROP DATABASE 删除某数据库子目录,所有的表,索引,系统目录。

CREATE TABLE 建立一个表及其各字段和数据类型。

ALTER TABLE 从某个表中增加或删除字段及修改字段的数据类型。

RENAME TABLE 改变表的名称。

DROP TABLE 删除某表的所有数据,索引并消除该表在系统目录中的入口。

CREATE VIEW 从现存的表和视图中选择记录和字段定义一个表。由于基础

表中数据的变化,所以视图建立在基础表之上。

DROP VIEW 从系统目录中删除视图的定义,同时与之相关的视图定义也

被删除了。基础表不受影响。

CREATE SYNONYM 定义某个表或视图的别名。别名将作用为只允许它的定义者

才可以将它删除。这意味着如果多个人想使用某个表或视图,

则他们必须分别建立别名。

DROP SYNONYM 从系统目录中删除别名。

RENAME COLUMN 改变字段名称。

CREATE INDEX 对某表中的一个或多个字段建立索引。

ALTER INDEX 允许用户修改表以使记录顺序与索引顺序一致。该索引称为

综合索引。

DROP INDEX 删除索引。

UPDATE STATISTICS 在系统目录上修改表的统计数字。

以上一些语句的完整形式分别如下:

1、 CREATE DATABASE database_name——创建数据库

2、 EXEC SQL CONNECT :nam IDENTIFIED BY :pwd USING :sid

3、 DROP DATABASE database_name——删除数据库,包含已经建立的表【内容】、索引

4、 COMMIT WORK RELEASE;——关闭已经打开的数据库

5、 CREATE [ TEMP ] TABLE table_name

(column_name 数据类型[ NOT NULL ] [ DEFAULT 初值][ 其他约束条

件],……)

[ IN dbspace_name1,……];

——【在数据空间dbspace_name1……中】建立【临时】表table_name

6、 ALTER TABLE table_name

{ ADD ( newcol_name 数据类型[ BEFORE oldcol_name ],……

| DROP ( oldcol_name, ……)

| MODIFY ( oldcol_name newcol_type [ NOT_NULL ],……) } ……

——修改表table_name结构,增加∕删除∕修改字段

7、 DROP TABLE table_name;——删除已经存在的表,包含数据

2. 数据处理语句

数据处理语句是经常使用的语句,语句如下:

DELETE 从表中删除一个或多个记录。

INSERT 从表中增加一个或多个记录。

SELECT 从数据库中提取数据。

UPDATE从表中的记录上修改数据。

4.2.1、SELECT语句

SELECT语句是十分重要和复杂的SQL语句。举例如下:

SELECT lname,company

FROM customer

WHERE customer_num=101;

此语句查询的是名为customer的表,返回值是客户编号为101的记录。从该记录中选择并显示相应的名和公司名称的字段值。

其一般形式为:

SELECT [ UNIQUE | DISTINCT | ALL ] Selectlist

[ INTO 子句] FROM TableList

[ WHERE 子句]

[ GROUP BY ColumnBroupList ]

[ HAVING GroupFilter [

[ ORDER BY OrderFilter ]

[ INTO TEMPT able ]

现在简单的对SELECT的每个子句做扼要的说明:

SELECT子句:

功能:用来在数据库的一个或者多个表中检索数据。

格式:SELECT [ UNIQUE | DISTINCT | ALL ] Selectlist。

说明:SELECT 必要的关键字。

ALL 可选的关键字。它使得选取满足WHERE子句的所有记录,而

不将重复的记录去掉。缺省值。

DISTINCT 可选关键字,它将查询结果中重复的记录去掉。

UNIQUE 同DISTINCT。

Selectlist 用逗号分割的一系列字段名和∕或者表达式,其中字段名必须式

无二义性的,可在其前面加上表名作前缀以免混淆,如https://www.doczj.com/doc/2710169483.html,

等,其中a为表(别)名。

注意事项:

(1)、如果想选取一个表中的所有字段,可以使用“*”号选取。

(2)、如果在selectlist中给出一个聚合函数和一个字段,则字段必须用到GOURP BY 中。

INTO 子句:

功能:给出用来接受SELECT语句检索出来的数据的宿主变量。

格式:INTO variable_list

说明:INTO 必需的关键字。

Variable_list 检索后返回的宿主变量。其顺序和类型应该和SELECT子句

Selectlist中的相应的字段或者表达式一致。

示例:

EXEC SQL SELECT *

INTO EXEC SQLvalue

FROM table1

WHERE con1 = “满足条件”;

上例从表table1中选出满足条件con1=”满足条件”的记录放到结构变量value中。

注意事项:

①如果是一条独立的SELECT语句,则它必须只返回一条记录,并且必须带有

INTO子句。

②如果返回不止一条记录,则要使用指针和FETCH语句,每次取一个记录。

③如果没有满足条件的记录,则SQLCODE(sqlca.code)为SQLNOTFOUND

(1403),如果SQLCODE为0则表示语句成功执行,如果SQLCODE 小于0,

则表示数据库操作失败。

FROM子句:

功能:用来给出从其中选取数据的一个或者多个表。

格式:FROM { table_name [ table_alias ] | OUTER

table_name [ table_alias ] | OUTER ( table_expr )}[,……] 说明:FROM 关键字。

OUTER 可选关键字。

Table_name 要搜索的数据所在的表的名字。

Table_alias 表table_name的别名。

示例:

EXEC SQLSELECT a.x,b.y

FROM table_name1 a,OUTER table_name2 b

WHERE a.value = b.value;

上例中将所有table_name1中的记录的x字段取出来,将满足条件的table_name2中的y字段取出来,如果没有则用NULL值填入。如果上面的语句在游标中使用,如果有“EXEC SQLFETCH INTO EXEC SQLX,EXEC SQLY;”这样的语句,则其意义为,对于每条表a 中的记录,X被赋值为a的x字段的值,如果表b中有满足条件的记录,则Y被赋值为表b 中y字段的值,否则变量Y被赋值为“NULL”。

WHERE 子句:

功能:用来建立对选取数据的搜索准则和连接条件。

格式:WHERE condition

说明:WHERE 关键字。

Condition 有逻辑运算符AND、OR或者NOT连接起来的一个或者多个搜索条件。搜索田间可以是以下三种之一:比较条件、连接条件或者带子查

询语句的条件。

(1)、比较条件

①expr rel_op expr

其中expr代表表达式,rel_op代表关系运算符。如:

EXEC SQLSELECT x,y

FROM table_name

WHERE num > 100;

②expr [ NOT ] BETWEEN expr AND expr

其中expr代表表达式(以下同),NOT为关键字(以下同),表示在左边的表达式在给出的范围之外;BETWEEN和AND是关键字,表示左边表达式的值在右边两个表达式值给出的区间内。如:

EXEC SQLSELECT x,y

FROM table_name

WHERE num BETWEEN 20 AND 100;

③expr [ NOT ] IN ( value_list )

其中IN为关键字,value_list为括号中的一系列值。如:

EXEC SQLSELECT x,y

FROM table_name

WHERE num IN (1,20,30,50 );

④column_name [ NOT ] LIKE “string”

其中column_name 是字段名,LIKE是必需的关键字,string是括在引号中的字符模式。String可由通配符和字符构成,“%”表示匹配任意字符,“_”下划线字符,匹配任何一个字符。如:

EXEC SQLSELECT x,y

FROM table_name

WHERE name LIKE “Squash%”;

⑤column_name [ NOT ] MATCHES “string”

其中MATCHES为关键字,同上面的表达式所起的意义一样,只是模式string中的通配符与上面的不同:“*”表示匹配任意字符,“?”匹配任何一个字符,“[……]”匹配括号中的任何一个字符,“[a-z]”表示a到z中的任何一个字符,“[abcdef]”表示abcdef字符中的任何一个,“[^abcdef]”表示除了abcdef五字符外的任何一个字符。如:

EXEC SQLSELECT x,y

FROM table_name

WHERE name MATCHES “Squash*”;

⑥column_name IS [ NOT ] NULL

其中IS NULL为关键字,意为column_name为【非】空。如:

EXEC SQLSELECT x,y

FROM table_name

WHERE name IS NOT NULL;

(2)、连接条件连接条件是在WHERE子句中建立一个表中的字段和另一个表中的字段的关系。连接动作的结果是产生一个临时复合表,原来的两个表中任意一对满足条件的记录连接起来,形成复合表中的一个记录。

格式:SELECT select_list

FROM table1,table2,……

WHERE condition;

SELECT子句是一个合法的SELECT语句,其中包含table1和table2的字段,FROM 是必需的关键字。Table1、table2是连接中的两张表。Condition是同时涉及table1和table2中字段的任何比较条件。在连接中包括多重连接、自连接和外连接。其中外连接已在FROM 子句中已经介绍过了(OUTER)。

多重连接是指把多于一个表连接起来,在连接条件中需用到FROM子句中两对以上的表。如:

SELECT x.a,x.b,y.c,y.d

FROM table1 x,table2 y

WHERE x.a =y.c;

上例中的table1.a和table2.c数据类型必须类型一致。

自连接是针对同一张表而言的。这是须将表名在FROM子句中列出两次,并对其赋予两个不同的别名。在WHERE子句中用这些别名来引用这“两”张表。如:

SELECT a,b

FROM table_name x,table_name y

WHERE x.a =2 * y.a;

(3)、带子查询的条件

这种条件是在WHERE子句中使用SELECT子句。一个子查询可以返回一个值,可以不返回值,也可以返回一组值。但是,在子查询中的SELECT中可能有一个字段或者表达式,且其不能包含ORDER BY的子句。使用带子查询的条件可以将一个表达式与另一个SELECT语句的结果进行比较,或者判断一个表达式是否包含在另一个SELECT语句的结果中,还可询问另一个SELECT语句是否选取任何记录。

格式:WHERE expr rel_op { ALL | [ ANY | SOME ]} ( SELECT_statement );

WHERE expr [ NOT ] IN ( SELECT_statement );

WHERE expr [ NOT ] EXISTS ( SELECT_statement );

其中,ALL为关键字。它指出子查询可以返回零个、一个或者多个值,它对每一个返回值比较都为真时,搜索条件成立。如果子查询不返回值,则搜索条件不成立。ANY∕SOME 为关键字。它指出查询可以返回零个、一个或者多个值,当它对其中的至少一个返回值比较为真时,搜索条件成立。如果查询不返回值,则搜索条件不成立。IN为关键字。用来判断expr表达式的值是否包含在后面的SELECT语句返回值中。EXISTS为关键字。用来测试后面的SELECT语句是否返回任何记录。如果子查询返回一个或者多个记录,则搜索条件成立。SELECT_statement为一条SELECT语句。如:

SELECT *

FROM table_name1

WHERE name =

( SELECT name

FROM table_name2

WHERE condition );

上面这条语句中,condition应该使得SELECT子查询返回的记录唯一。其中table_name1和table_name2中的name 的类型必须一致。

SELECT *

FROM table_name1

WHERE name IN

(SELECT name

FROM table_name2

WHERE condition);

SELECT *

FROM table_name1

WHERE EXISTS

( SELECT *

FROM table_name2

WHERE condition );

GROUP BY子句:

功能:用来将表中记录按指定字段上值相等的原则分组,为每一组结果产生一条记录格式:GROUP BY group_list

说明:GROUP BY为关键字,group_list为一个或者多个字段名。字段名间用都好隔开,查询根据这些字段决定分组。对于满足WHERE子句条件,并且在group_list

指出的字段中包含唯一值的每个记录组,查询结果都只包含一个记录。

示例:

SELECT a,sum(num)

FROM table_name

GROUP BY a;

HAVING子句:

功能:用来为GROUP BY子句所划分的记录组提供附加条件。

格式:HAVING condition

说明:HAVING为关键字,condition是在WHERE子句所定义的条件。实际上,HAVING子句常常是GROUP BY子句的补充说明。其分组条件中的每项条件是将

记录组的聚合特性与另一个记录特性或者与一个常量进行比较。如果有HAVING

子句而没有GROUP BY子句,则HAVING子句用于WHERE子句的所有记录,

即所有WHERE子句条件的记录都被认为是一组。在没有GROUP BY子句时,满

足WHERE子句的所有记录形成一个记录组。

示例:

SELECT a,COUNT( * ),SUM( value )

FROM table_name

GROUP BY a

HAVING COUNT( * ) > 2;

ORDER BY子句:

功能:将检索出来的结果按一定的顺序排序输出。

格式:ORDER BY column_name [ ASC | DESC] [,……]

说明:其中ORDER BY为关键字,ASC、DESC为关键字,分别代表按升序、降序排列,缺省时为ASC。Column_name 为要排序的字段名。

示例:

SELECT a,b

FROM table_name

ORDER BY a;

注意事项:

①ORDER BY 子句中的排序字段不超过8个。

②只能对在select_list中明显的或者隐含的给出名字的那些字段进行排序。

③ORDER BY子句包括的字段数据总长度不得超过120字节。

INTO TEMP子句:

功能:INTO TEMP子句是通过建立一个临时表来存放查询结果,当程序结束时,临时表自动删除。

格式:INTO TEMP table_name

说明:INTO TEMP为关键字,table_name为临时表名。

注意事项:

①在对此需要同一查询结果时利用临时表将节省时间。

②临时表只有在退出ORACLE-ESQL∕C程序或对它执行了DROP TABLE语句才

消失,所以建议:程序如果再也永不着表内容时,将临时表显式的删除(DROP)。

③在临时表table_name中无索引。

④INTO子句和INTO TEMP不能同时使用。

⑤临时表是针对每个用户的,每一用户都可以建立、使用、删除自己的临时表,各

个用户的临时表之间互不相关。

⑥临时表中的字段表名即是select_list给出的那些名字。如果对字段或者表达式给

出了显示标号,则临时表中的字段名就是这些显示标号。

UNION运算符:

功能:UNION用于两个SELECT语句之间的关键字,它将两个SELECT语句的查询结果联合起来。

格式:SELECT_statement UNION [ ALL ] SELECT_statement

[ UNION [ ALL ] SELECT_statement ……]

说明:其中SELECT_statement是一条SELECT语句。UNION是关键字,选取两个查询所得的所有记录,去掉重复的,返回剩下的记录。ALL是关键字,它将所有

结果联合起来,即使有重复的记录也不删除,如果不适用ALL选项,则查询结果

中的重复部分将被删掉。

示例:

SELECT a,b

FROM table1

WHERE condition1

UNION

SELECT c,d

FROM table2

WHERE condition2;

注意事项:

①UNION操作符使用后可使查询处理更容易些,但也可以使用一个查询来打到与

用UNION等价的查询结果。

②如果在最后一个SELECT语句中加入了INTO TEMP子句,则UNION的结果将

被送到临时表中。

③结果表中的字段名与第一个SELECT语句中的字段相同。

④对于可用UNION算符进行联接的查询有以下限制:

每个查询的select_list中的字段的数量以及数据类型必须相同。

如果有ORDER BY子句,则它必须跟随于最后一个SELECT语句,并且要用整数而不是用标识符来指示要排序的项,排序在集合运算完成以后进行。

UNION操作符不允许用在在查询中,也不允许用在视图的定义中。

4.2.2、INSERT语句

功能:INSERT语句的主要目的是在表中增加一条或多条新纪录。

格式:INSERT INTO table_name

[ (Column_list) ]

VALUES( valuelist )

说明:INSERT INTO为关键字,VALUES关键字,table_name为操作的表名,Colomn_list为要插入的字段名,可以是一个字段名或者多个字段名(用逗号隔开)。

Valuelist是要插入的字段的值,可以是一个或者多个用逗号隔开的主变量或常数。示例:

EXEC SQLINSERT INTO table_name

VALUES( “he”,”1234”,“0.52”,EXEC SQLX);

注意事项:

①在valuelist中,字符型和日期型的常数必须用引号括起来。

②可以在valuelist中使用带负指示变量的宿主变量,它与NULL关键字的意义相

同。

③如果column_list中没有包括所有的字段,则在columnn_list中未出现的字段将

被赋予空值,如这些字段不允许为空,则发生错误。

④对于SERIAL类型的字段给出零值(0)表示SQL要将其置为下一个序列数。

如果希望使用你给出的值,那么这个值就不要用零,并且与表中已有的序列数不重复。如果对于SERIAL字段给出一个非零值,而这个值与其它序列数重复,或者在该字段上定义了唯一索引,那么就会发生错误。

⑤如果创建数据库时带有事务说明(日志),则每条SQL语句都被看作一个事务,

即使没有使用BEGIN WORK和COMMIT WORK或ROLLBACK WORK。由于在一个事务中INSERT语句影响到大量的记录,所以,这些记录都要锁闭起来知道整个操作完成为止。如果影星到的记录数量有可能超出操作系统规定的可同时加锁的最大数量,那么就需要减少INSERT语句影响到的范围,或在执行前先把整个表锁起来。

4.2.3、UPDATE语句

功能:UPDATE语句可用来改变一个或者多个记录中的一个或多个字段的值。

格式:UPDATE table_name SET

{ column_name =expr [,……] |

{( column_list ) | * } =( expr_list )}

[ WHERE { condition | CURRENT OF cursor_name }]

说明:UPDATE SET WHERE CURRENT OF均为关键字。Column_name为要修改的字段名,column_list为要修改的字段组(“*”表示所有字段均修改),

expr_list为表达式列表。Condition为修改条件,CURRENT OF cursor_name

为修改游标cursor_name当前指针所在的记录。

示例:

EXEC SQLUPDATE table_name SET

(a,b) =(“hello”,“20010104”)

WHERE CURRENT OF cursor_1;

上面的例子是将表table_name中游标cursor_1当前指针所指的记录中的a,b字段分别设为“hello”,“20010104”。

UPDATE的另外用途是修改数据库的统计数据,以便优化数据搜索。其格式为:UPDATE STATISTICS [ FOR TABLE table_name ],其中UPDATE STATISTICS FOR TABLE为关键字,table_name为表名。

注意事项:

①SQL用UPDATE STATISTICS语句进行数据优化搜索,如果对一个表进行

大量修改,最好用UPDATE语句来改进查询效率。

②仅当存在当前数据库是,UPDATE STATITICS语句才有效。

③除非执行UPDATE STATITICS语句,否则SQL不会修改统计数据。

④若不用FOR TABLE子句,UPDATE STATITICS语句只修改当前数据库中

的所有表数据。

4.2.4、DELETE语句

功能:删除数据库表中的一个或多个记录。

格式:DELETE FROM table_name

[ WHERE { condition | CURRENT OF cursor_name } ]

说明:DELETE FROM WHERE CURRENT OF均为关键字,table_name为操作的表名,condition 为操纵条件,cursor_name为打开的游标名。

示例:

EXEC SQLDELETE FROM table1

WHERE a =“hello”;

3. 数据权限语句

只有数据库管理员或表的主人特定准予了使用权的用户才能从数据库和表中特定的字段中存取数据。用户可以通过执行LOCK TABLE语句暂时限制某个表的存取。(执行之后,SQL仅仅锁住记录直至执行结束。通常不必要直接锁表/记录)。

SQL提供如下语句便于用户作数据存取:

GRANT 对特殊用户或对所有用户准予数据库存取权限。

REVOKE 对特殊用户或对所有用户撤消数据库存取权限。

LOCK TABLE 仅允许当前用户存取某个表,而其它用户只可以读此表。只有当多用户环境和同时作用于此表会引起用户间干扰时使用LOCK TABLE语句。由于限制了其它用户对表的存取,LOCK TABLE语句减少了数据库此时的存取能力。如果需要这种处理,用户必须在写入LOCKTABLE语句之前写上BEGIN WORK语句。

注意:数据处理语句仅作用于多用户系统。

第二部分PROC*C简介

1、概述

使用PRO*C预编译器开发内嵌SQL的步骤

2、ORACLE 预编译设置

常用的ORACLE预编译选项有INAME、ONAME、INCLUDE、PARSE、SQLCHECK 和USERID

?INAME: 用于指定被编译的源文件的名称。

?ONAME: 用于指定预编译后生成C文件名,如不指定,则自动采用INAME所

指定的输入文件名,后缀由CPP_SUFFIX确定

?INCLUDE: 指定#include或EXEC SQL INCLUDE语句所对应的头文件所在的

路径。

?PARSE: 指定预编译器解析源程序的方法

1. FULL :使用C解析器解析

2.PARTIAL或NONE:能解析C++代码,必须在定义部分定义宿主变量

?SQLCHECk:用于指定SQL语法和语义的检查方法

1. SEMANTICS或FULL ,可以识别PL/SQL块(同时必须设置USERID)

2. SYNTAX

?USERID: 指定用户名、口令和网络名

USERID=username/password@serivice

系统配置文件:存放PROC*C的预编译选项,位于

$ORACLE_HOME/precomp/admin/pcscfg.cfg

3、前导文件

包含ORACLE-ESQL/C语句的C程序包括以下前导文件:

sqlca.h 包含存放出错信息的结构。

sqlda.h 包括含有值指针和动态变量描述的结构。

包括这些文件的语法如下:

EXEC SQLinclude ;

EXEC SQLinclude ;

如果你的程序不用到包含于上述文件中的结构或定义,程序就不必包括sqlda.h,但总要含有sqlca.h以检查ORACLE-ESQL/C 是执行成功还是失败。

4、宿主变量

?什么是宿主变量

在PROC中,在SQL语句中用到的变量称为宿主变量。他们应在EXEC SQL BEGIN DECLARE SECTION;与EXEC SQL EDN DECLARE SECTION之间声明

?宿主变量可以使用的数据类型

char、char[n]、int、short、long、float、double、VARCHAR[n]

VARCHAR 变量:VARCHAR 类型用于定义变长字符串,该类型不是C语言的数据类型,它只能用于定义宿主变量。预编译后会转换成以下C结构:

struct{

unsigned short len;

unsigned char arr[20];

}

?指示变量

指示变量是一种短整数的的C语言变量,主要用于处理数据库的NULL值,指示变量只能是short

1. 在输出宿主变量后使用指示变量,指示变量值含义:

-1:数据库列值为NULL;

0:表示实际列值付给了输出宿主变量

>0:表示将被截断列值付给了输出宿主变量,并且在指示变量中存储的是实际列值的数据长度

-2:表示将被截断列值付给了输出宿主变量,但实际列值的长度不能确定

2. 在输入宿主变量后使用指示变量,指示变量值含义

<0 : 忽略输入宿主变量值,将NULL赋给数据库列

>=0: 将输入宿主变量值赋给数据库列

?宿主变量与指示变量的使用规则

宿主变量及指示变量在潜入SQL语句中必须使用(:) , 指示变量必须跟在宿主变量后面

5、连接到ORACLE

?在对数据库存取之前,必须先把程序与ORACLE数据库连接起来。即登录到

ORACLE上。

?语法格式

EXEC SQL CONNECT :username IDENTIFIED :passwd

[ USING :server ]

:username用户名

:passwd用户密码

:server服务器名称

6、错误处理(一)

?SQLSTATE与SQLCODE

SQLSTATE 用于存放错误代码与警告代码的状态变量

char SQLSTA TE[6]

SQLCODE 用于存储错误代码的状态变量,它是一个有符号整数

long SQLCODE

?SQLCA结构

SQLCA的组成

SQLCA是一个结构类型的变量,它是ORACLE 和应用程序的一个接口。在执行

Pro*C程序时,ORACLE把每一个嵌入SQL语句执行的状态信息存入SQLCA中,根据这些信息,可判断SQL语句的执行是否成功,处理的行数,错误信息等,其组成如表所示

Struct sqlca

{ char sqlcaid [ 8 ] ; ---标识通讯区

long sqlabc; -- 通讯区的长度

long sqlcode; ---保留最近执行的SQL语句的状态码

struct { unsigned short sqlerrml; ---信息文本长度

Char sqlerrmc[70];

}sqlerrm;

char sqlerrp [ 8 ];

long sqlerrd [ 6 ];

char sqlwarn [ 8 ];

char sqlext [ 8 ];

}

其中:

1)SQLCA.sqlerrm.sqlerrmc:带有SQLCA.sqlcode的错误正文。

2)SQLCA.sqlerrd:当前ORACLE的状态,只有SQLCA.sqlerrd [2] 有意义,表示DML 语句处理的行数。

3)SQLCA.sqlwarn:提供可能遇到的条件信息

?WHENEVER语句

a. 条件: SQLWARNING:该常量用语检测Oracle 警告

SQLERROR:该常量用于检测Oracle 错误

NOT FOUND:该常量用剧检测SELECT 或FETCH语句未检索行的情况

b.操作: CONTINUE:当满足SQL异常条件时,继续执行下一条语句

DO:当满足SQL异常条件时,执行错误处理函数,在执行了错误函数之后,

会执行错误SQL语句后的下一条语句

DO BREAK:当满足SQL异常条件时,执行BREAK语句,该操作主要用

于循环语句,当符合WHENEVER条件时,会退出循环语句

DO CONTINUE:当满足SQL异常条件时,执行CONTINUE语句,该操作

主要用于循环语句,当符合WHENEVER条件时,继续下一循环

GO TO label_name:跳转到特定标号处执行

STOP:回退事务,停止运行

c.语句范围

WHENEVER是定义语句,它会自动检测应用程序中的所有SQL语句,当编

写程序时,WHENEVE应该放在第一条内嵌SQL语句(如CONNECT)之前.

如果在应用程序中使用了多条WHENEVER语句,那么在进行随后的处理时,

只有最近的WHENEVER语句起作用

d.函数sqlgls ,用于取得最近执行的SQL语句的完整文本。

格式:int sqlgls(char* sqlstm, size_t *stmlen, size_t *sqlfc);

Sqltm 用于指定存放SQL语句文本的缓存区

Stmlen用于指定缓冲区的最大长度

Sqlfc存放SQL命令代码

7、事务控制

?事务的概念

数据库事务是由一组SQL 语句组成的一个逻辑工作单元。您可以把事务看作是一组不可分的SQL 语句,这些语句作为一个整体永久记录在数据库中或一并撤销

?事务的相关语句

1. COMMIT 提交事务

EXEC SQL COMMIT [WORK] [ RELEASE]

2. ROLLBACK回退事务

EXEC SQL ROLLBACK [WORK] [ RELEASE]

EXEC SQL ROLLBACK TO SA VEPOINT savepoint

3. SA VEPOINT设置保存点

EXEC SQL SA VEPOINT savepoint

8、使用结构与数组

使用宿主结构主要是为了一次能访问多列

?宿主结构的定义

EXEC SQL BEGIN DECLARE SECTION

struct { …..

} stuct_name

EXEC SQL END DECLARE SECTION;

?宿主结构的使用

宿主结构的使用与一般的宿主变量类似,需要注意的事项

a.结构成员与类型必须与SQL语句列的数据个数、类型以及顺序相匹配。

b.不能使用嵌套的宿主结构

c.不能使用C联合作为宿主结构,也不能再宿主结构中嵌套联合

?指示结构的定义和使用

指示结构成员必须都是short类型,定义与定义宿主结构类似。

指示结构不许跟在宿主结构的后面,并且以:开始

在输入宿主结构后使用时,指示结构的成员个数必须与输出宿主结构的成员个数

匹配

在输出宿主结构后使用时,必须首先为指示结构成员赋值

使用宿主数组主要是为了一次能访问多行

?宿主数组的定义

EXEC SQL BEGIN DECLARE SECTION

char c_var[20][10];

float f_var[20];

……

EXEC SQL END DECLARE SECTION;

当定义宿主数组时,只有char、V ARCHAR可以是二维数组,其他类型只能定义为一

维数组

?宿主数组的使用

如果使用不同的多个宿主数组,维数不同,将按照维数最小的数组来处理数据

如果直接使用数组元素相当于引用宿主变量

使用SELECT语句,数组维数必须小于或等于返回记录结果,否则应该使用游标

FETCH。

INSERT 语句中使用宿主数组,V ALUES字句不能使用指针宿主数组。

UPDATE 、DELETE 可使用宿主数组,但CURRENT OF 字句不能使用宿主数组

使用FOR 字句指定处理元素个数(FOR 后允许使用宿主变量或整数,但不允许表

达式)

EXEC SQL FOR :num UPDA TE …..

在WHERE字句中使用宿主数组SELECT 字句只能使用宿主变量,而不能使用宿

主变量,UPDA TE或DELETE语句,在WHERE字句既可以使用宿主变量也可以

2020年(Oracle管理)华为oracle培训教材

(Oracle管理)华为oracle培训教材

SQL语言简介 1、SQL概述 SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。 数据库对象包括表、视图、索引、同义词、簇、触发器、函数、过程、包、数据库链、快照等(表空间、回滚段、角色、用户)。数据库通过对表的操作来管理存储在其中的数据。 1)SQL*PLUS界面: 登录:输入SQLPLUS回车;输入正确的ORACLE用户名并回车;输入用户口令并回车,显示提示符:SQL> 退出:输入EXIT即可。 2)命令的编辑与运行: ●在命令提示符后输入SQL命令并运行,以分号结束输入;以斜杠结束输入;以空行结束输入; ●利用SQL缓冲区进行PL/SQL块的编辑和运行; ●利用命令文件进行PL/SQL块的编辑和运行。 2、数据库查询 1)用SELECT语句从表中提取查询数据。语法为 SELECT[DISTINCT]{column1,column2,…}FROMtablenameWHERE{conditi ons}GROUPBY{conditions}ORDERBY{expressions}[ASC/DESC]; 说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。

2)SELECT中的操作符及多表查询WHERE子句。(LIKE,IS,…) WHERE子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOTIN、BETWEEN、LIKE、ISNOTNULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。 3)ORDERBY子句 ORDERBY子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDERBY子句指定的表达式的值确定。 4)连接查询 利用SELECT语句进行数据库查询时,可以把多个表、视图的数据结合起来,使得查询结果的每一行中包含来自多个表达式或视图的数据,这种操作被称为连接查询。 连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在WHERE子句告诉ORACLE如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接和不等式连接。 5)子查询 如果某一个SELECT命令(查询1)出现在另一个SQL命令(查询2)的一个子句中,则称查询1是查询2的子查询。 3、基本数据类型(NUMBER,VARCHAR2,DATE)O RACEL支持下列内部数据类型: ●VARCHAR2变长字符串,最长为2000字符。 ●NUMBER数值型。

(Oracle管理)华为oracle培训教材

SQL语言简介 1、SQL概述 SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。 数据库对象包括表、视图、索引、同义词、簇、触发器、函数、过程、包、数据库链、快照等(表空间、回滚段、角色、用户)。数据库通过对表的操作来管理存储在其中的数据。 1)SQL*PLUS界面: 登录:输入SQLPLUS回车;输入正确的ORACLE用户名并回车;输入用户口令并回车,显示提示符:SQL> 退出:输入EXIT即可。 2)命令的编辑与运行: ●在命令提示符后输入SQL命令并运行,以分号结束输入;以斜杠结束输入;以空行结束输入; ●利用SQL缓冲区进行PL/SQL块的编辑和运行; ●利用命令文件进行PL/SQL块的编辑和运行。 2、数据库查询 1)用SELECT语句从表中提取查询数据。语法为 SELECT [DISTINCT] {column1,column2,…} FROM tablename WHERE {conditions} GROUP BY {conditions} ORDER BY {expressions} [ASC/DESC]; 说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。 2)S ELECT中的操作符及多表查询WHERE子句。(LIKE,IS,…) WHERE子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOT IN、BETWEEN、LIKE、IS NOT NULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。 3)O RDER BY 子句 ORDER BY 子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDER BY 子句指定的表达式的值确定。 4)连接查询 利用SELECT语句进行数据库查询时,可以把多个表、视图的数据结合起来,使得查询结果的每一行中包含来自多个表达式或视图的数据,这种操作被称为连接查询。 连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在WHERE子句告诉ORACLE如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接和

华为oracle培训教材

华为oracle 培训教材 1、SQL 概述 SQL 是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。 数据库对象包括表、视图、索引、同义词、簇、触发器、函数、过程、包、数据库链、快照等(表空间、回滚段、角色、用户) 。数据库通过对表的操作来管理存储在其中的数据。 1)SQL*PLUS 界面: 登录:输入 SQLPLUS 回车;输入正确的 ORACLE 用户名并回车;输入用户口令并回车,显示提示符: SQL> 退出:输入 EXIT 即可。 2)命令的编辑与运行: 在命令提示符后输入 SQL 命令并运行,以分号结束输入;以斜杠结束输入;以空行结束输入; 利用 SQL 缓冲区进行 PL/SQL 块的编辑和运行;利用命令文件进行 PL/SQL 块的编辑 和运行。 2、数据库查询 1)用 SELECT 语句从表中提取查询数据。语法为 SELECT [DISTINCT] {colu mn 1,colum n2,…} FROM table name WHERE {conditions} GROUP BY {conditions} ORDER BY {expressions} [ASC/DESC]; 说明: SELECT 子句用于指定检索数据库的中哪些列, FROM 子句用于指定从哪一个表或视图中检索数据。 2)SELECT中的操作符及多表查询 WHERE子句。(LIKE,IS,…) WHERE 子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOT IN、BETWEEN、LIKE、IS NOT NULL 等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。 3)ORDER BY 子句 ORDER BY 子句使得 SQL 在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDER BY 子句指定的表达式的值确定。 4)连接查询 利用 SELECT 语句进行数据库查询时,可以把多个表、视图的数据结合起来,使得查询结果的每一行中包含来自多个表达式或视图的数据,这种操作被称为连接查询。 连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在 WHERE 子句告诉 ORACLE 如何把多个表的数据进行合并。根据 WHERE 子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接和 不等式连接。

华为oracle培训教材

华为oracle培训教材 1、SQL概述 SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。 数据库对象包括表、视图、索引、同义词、簇、触发器、函数、过程、包、数据库链、快照等(表空间、回滚段、角色、用户)。数据库通过对表的操作来管理存储在其中的数据。 1)SQL*PLUS界面: 登录:输入SQLPLUS回车;输入正确的ORACLE用户名并回车;输入用户口令并回车,显示提示符:SQL> 退出:输入EXIT即可。 2)命令的编辑与运行: ●在命令提示符后输入SQL命令并运行,以分号结束输入;以斜杠结束输入;以空行结束输入; ●利用SQL缓冲区进行PL/SQL块的编辑和运行; ●利用命令文件进行PL/SQL块的编辑和运行。 2、数据库查询 1)用SELECT语句从表中提取查询数据。语法为 SELECT [DISTINCT] {column1,column2,…} FROM tablename WHERE {conditions} GROUP BY {conditions} ORDER BY {expressions} [ASC/DESC]; 说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。 2)S ELECT中的操作符及多表查询WHERE子句。(LIKE,IS,…) WHERE子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOT IN、BETWEEN、LIKE、IS NOT NULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。 3)O RDER BY 子句 ORDER BY 子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDER BY 子句指定的表达式的值确定。 4)连接查询 利用SELECT语句进行数据库查询时,可以把多个表、视图的数据结合起来,使得查询结果的每一行中包含来自多个表达式或视图的数据,这种操作被称为连接查询。 连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在WHERE子句告诉ORACLE如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接和

相关主题
文本预览
相关文档 最新文档