📄 esql-c资料(完全版)三_unix_操作系统_网络学院_天新网.htm
字号:
<TABLE cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<TBODY>
<TR>
<TD class=mainbgcolor width=6></TD>
<TD
style="BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid"
vAlign=center bgColor=#666666 height=25> <A
href="http://school.21tx.com/os/win9x/"><FONT
color=#ffffff>Windows9x</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/win2000/"><FONT
color=#ffffff>Win2000</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/winxp/"><FONT
color=#ffffff>WindowsXP</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/win2003/"><FONT
color=#ffffff>Windows2003</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/longhorn/"><FONT
color=#ffffff>Vista</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/dos/"><FONT
color=#ffffff>Dos</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/app/"><FONT
color=#ffffff>Windows</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/linux/"><FONT
color=#ffffff>Linux</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/unix/"><FONT
color=#ffcc00>Unix</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/freebsd/"><FONT
color=#ffffff>FreeBSD</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/solaris/"><FONT
color=#ffffff>Solaris</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/macos/"><FONT
color=#ffffff>MaxOS</FONT></A><FONT color=#ffffff> | </FONT><A
href="http://school.21tx.com/os/aix/"><FONT
color=#ffffff>AIX</FONT></A><FONT color=#ffffff> | </FONT></TD>
<TD class=mainbgcolor width=6></TD></TR></TBODY></TABLE></SPAN>
<TABLE cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<TBODY>
<TR>
<TD class=mainbgcolor width=6></TD>
<TD style="BORDER-LEFT: #cccccc 1px solid" vAlign=top align=middle
bgColor=#ffffff>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD colSpan=2 height=3></TD></TR>
<TR>
<TD width="2%"><IMG height=22
src="ESQL-C资料(完全版)三_Unix_操作系统_网络学院_天新网.files/dline.gif" width=19></TD>
<TD width="98%"
background=ESQL-C资料(完全版)三_Unix_操作系统_网络学院_天新网.files/dline02.htm>
您现在的位置:<A href="http://www.21tx.com/">天新网</A> > <A
href="http://school.21tx.com/">网络学院</A> > <A
href="http://school.21tx.com/os/">操作系统</A> > <A
href="http://school.21tx.com/os/unix/">Unix</A> </TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=6 width="98%"
background=ESQL-C资料(完全版)三_Unix_操作系统_网络学院_天新网.files/data_title_bg.gif
border=0>
<TBODY>
<TR>
<TD align=middle><FONT class=f18
color=#339900><B>ESQL/C资料(完全版)三</B></FONT></TD></TR>
<TR>
<TD align=middle>http://school.21tx.com 2005年03月13日 <FONT
color=#a20010></FONT></TD></TR></TBODY></TABLE>
<P align=center><SPAN id=txsite_ad_cnt_top1></SPAN><SPAN
id=txsite_ad_cnt_top2>
<TABLE cellSpacing=0 cellPadding=0 width=468 align=center border=0>
<TBODY>
<TR>
<TD height=6></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid"
align=middle width=468>
<SCRIPT type=text/javascript>
var arrBaiduCproConfig=new Array();
arrBaiduCproConfig['uid'] = 111945;
arrBaiduCproConfig['n'] = 'txadcpr';
arrBaiduCproConfig['tm'] = 30;
arrBaiduCproConfig['cm'] = 68;
arrBaiduCproConfig['um'] = 34;
arrBaiduCproConfig['rad'] = 1;
arrBaiduCproConfig['w'] = 468;
arrBaiduCproConfig['h'] = 60;
arrBaiduCproConfig['bd'] = '#ffffff';
arrBaiduCproConfig['bg'] = '#ffffff';
arrBaiduCproConfig['tt'] = '#0000ff';
arrBaiduCproConfig['ct'] = '#000000';
arrBaiduCproConfig['url'] = '#666666';
arrBaiduCproConfig['bdl'] = '#ffffff';
arrBaiduCproConfig['wn'] = 2;
arrBaiduCproConfig['hn'] = 1;
arrBaiduCproConfig['ta'] = 'right';
arrBaiduCproConfig['tl'] = 'bottom';
arrBaiduCproConfig['bu'] = 0;
</SCRIPT>
<SCRIPT src="ESQL-C资料(完全版)三_Unix_操作系统_网络学院_天新网.files/ui.js"
type=text/javascript>
</SCRIPT>
<SCRIPT type=text/javascript>
<!--
document.write(baiduCproIFrame());
-->
</SCRIPT>
</TD></TR>
<TR>
<TD height=6></TD></TR></TBODY></TABLE></SPAN><SPAN
id=txsite_ad_cnt_top3></SPAN></P>
<TABLE id=txsite_content cellSpacing=0 cellPadding=0 width="98%"
border=0><TBODY>
<TR>
<TD class=content><SPAN id=txsite_ad_cnt_start></SPAN>
<P class=line-height><BR>第四节 ORACLE数据库的嵌入SQL语言<BR>4.1
基本的SQL语句<BR>4.1.1宿主变量和指示符<BR>1)、声明方法<BR>同其他数据库管理器一样,ORACLE使用宿主变量传递数据库中的数据和状态信息到应用程序,应用程序也通过宿主变量传递数据到ORACLE数据库。根据上面两种功能,宿主变量分为输出宿主变量和输入宿主变量。在SELECT
INTO和FETCH语句之后的宿主变量称作“输出宿主变量”,这是因为从数据库传递列数据到应用程序。除了SELECT
INTO和FETCH语句外的其他SQL语句中的宿主变量,称为“输入宿主变量”。这是因为从应用程序向数据库输入值。如:INSERT、UPDATE等语句。请看下面这个例子:<BR>int
emp_number; <BR>char temp[20];<BR>VARCHAR emp_name[20]; <BR>/* get
values for input host variables */ <BR>printf("Employee number? ");
<BR>gets(temp);<BR>emp_number = atoi(temp);<BR>printf("Employee
name? "); <BR>gets(emp_name.arr); <BR>emp_name.len =
strlen(emp_name.arr); <BR>EXEC SQL INSERT INTO EMP (EMPNO, ENAME)
<BR>VALUES (:emp_number, :emp_name);
<BR>在上面这个例子中,其中的emp_number和emp_name就是宿主变量。值得注意的是,它同其他数据库的区别是,定义宿主变量可以不需要BEGIN
DECLARE SECTION和END DECLARE SECTION。<BR>2)、指示符变量<BR>大多数程序<A
href="http://school.21tx.com/photo/"
target=_blank>设计</A>语言(如C)都不支持NULL。所以对NULL的处理,一定要在SQL中完成。我们可以使用主机指示符变量来解决这个问题。在嵌入式SQL语句中,主变量和指示符变量共同规定一个单独的SQL类型值。指示符变量是一个2字节的整数。<BR>针对输入宿主变量和输出宿主变量,指示变量共有下面几种情况:<BR>同输入宿主变量一起使用时:<BR>-1
Oracle将null赋值给列,即宿主变量应该假设为NULL。 <BR>>=0
Oracle将宿主变量的实际值赋值给列。<BR>同输出宿主变量一起使用时:<BR>-1 表示该列的输出值为NULL。 <BR>0
Oracle已经将列的值赋给了宿主变量。列值未做截断。 <BR>>0
Oracle将列的值截断,并赋给了宿主变量。指示变量中存放了这个列的实际长度。 <BR>-2
Oracle将列的值截断,并赋给了宿主变量。但是这个列的实际长度不能确定。
<BR>从数据库中查询数据时,可以使用指示符变量来测试NULL:<BR>EXEC SQL SELECT ename, sal
<BR>INTO :emp_name, :salary <BR>FROM emp <BR>WHERE :commission
INDICATOR :ind_comm IS NULL ...
<BR>注意,不能使用关系操作符来比较NULL,这是因为NULL和任何操作都为false。如:<BR>EXEC SQL SELECT
ename, sal <BR>INTO :emp_name, :salary <BR>FROM emp <BR>WHERE comm =
:commission<BR>如果comm列的某些行存在NULL,则该SELECT语句不能返回正确的结果。应该使用下面这个语句完成:<BR>EXEC
SQL SELECT ename, sal <BR>INTO :emp_name, :salary <BR>FROM emp
<BR>WHERE (comm = :commission) OR ((comm IS NULL) AND
<BR>(:commission INDICATOR :ind_comm IS NULL));<BR>4.1.2
查询<BR>如果是单行查询,则应该使用SELECT
INTO语句。如果是多行查询,应该使用游标或宿主变量数组。如:单行查询的一个例子:<BR>EXEC SQL SELECT ename,
job, sal + 2000 <BR>INTO :emp_name, :job_title, :salary <BR>FROM emp
<BR>WHERE empno = :emp_number; <BR>在嵌入SQL语句中,也可以使用子查询。如:<BR>EXEC SQL
INSERT INTO emp2 (empno, ename, sal, deptno) <BR>SELECT empno,
ename, sal, deptno FROM emp <BR>WHERE job = :job_title; <BR>4.1.3
修改数据<BR>1)、插入数据<BR>使用INSERT语句插入数据。其语法同ANSI SQL语法类似。如:<BR>EXEC SQL
INSERT INTO emp (empno, ename, sal, deptno) <BR>VALUES (:emp_number,
:emp_name, :salary, :dept_number);
<BR>2)、更新数据<BR>使用UPDATE语句更新数据。其语法同ANSI SQL语法类似。如:<BR>EXEC SQL UPDATE
emp <BR>SET sal = :salary, comm = :commission <BR>WHERE empno =
:emp_number; <BR>3)、删除数据<BR>使用DELETE语句删除数据。其语法同ANSI
SQL语法类似。如:<BR>EXEC SQL DELETE FROM emp <BR>WHERE deptno =
:dept_number; <BR>4.1.4
游标<BR>用嵌入式SQL语句查询数据分成两类情况。一类是单行结果,一类是多行结果。对于单行结果,可以使用SELECT
INTO语句;对于多行结果,你必须使用游标来完成。游标是一个与SELECT语句相关联的符号名,它使用户可逐行访问由ORACLE返回的结果集。使用游标,应该包含以下四个步骤。<BR>1)、定义游标<BR>使用DECLARE语句完成。如:<BR>EXEC
SQL DECLARE emp_cursor CURSOR FOR <BR>SELECT ename FROM emp WHERE
deptno =
:dept_number;<BR>值得注意的是,不能在同一个文件中定义两个相同名字的游标。游标的作用范围是全局的。<BR>2)、打开游标<BR>使用OPEN语句完成。如:<BR>EXEC
SQL OPEN emp_cursor; <BR>3)、取一行值<BR>使用FETCH语句完成。如:<BR>EXEC SQL FETCH
emp_cursor INTO
:emp_name;<BR>4)、关闭游标<BR>使用CLOSE语句完成。它完成的功能是:释放资源,如占用内存,锁等。如:EXEC
SQL CLOSE emp_cursor; <BR>5)、使用游标修改数据<BR>我们可以使用CURRENT
OF子句来完成修改数据。如:<BR>EXEC SQL DECLARE emp_cursor CURSOR FOR <BR>SELECT
ename, sal FROM emp WHERE job = 'CLERK' <BR>FOR UPDATE OF sal;
<BR>... <BR>EXEC SQL OPEN emp_cursor; <BR>EXEC SQL WHENEVER NOT
FOUND GOTO ... <BR>for (;;) {<BR>EXEC SQL FETCH emp_cursor INTO
:emp_name, :salary; <BR>... <BR>EXEC SQL UPDATE emp SET sal =
:new_salary <BR>WHERE CURRENT OF emp_cursor; <BR>}
<BR>值得注意的是,在使用CURRENT
OF子句来完成修改数据时,在OPEN时会对数据加上排它锁。这个锁直到有COMMIT或ROLLBACK语句时才释放。<BR>以下是使用游标修改数据的一个完整例子:<BR>...<BR>/*
定义游标 */ <BR>EXEC SQL DECLARE emp_cursor CURSOR FOR <BR>SELECT ename,
job <BR>FROM emp <BR>WHERE empno = :emp_number <BR>FOR UPDATE OF
job; <BR>/* 打开游标 */ <BR>EXEC SQL OPEN emp_cursor; <BR>/* break if
the last row was already fetched */ <BR>EXEC SQL WHENEVER NOT FOUND
DO break; <BR>/* 循环取值*/ <BR>for (;;) <BR>{ <BR>EXEC SQL FETCH
emp_cursor INTO :emp_name, :job_title; <BR>/* 更新当前游标所在的行的数据*/
<BR>EXEC SQL UPDATE emp <BR>SET job = :new_job_title <BR>WHERE
CURRENT OF emp_cursor; <BR>} <BR>... <BR>/* 关闭游标 */ <BR>EXEC SQL
CLOSE emp_cursor; <BR>EXEC SQL COMMIT WORK RELEASE; <BR>...
<P>下面这个例子完整演示了静态游标的使用方法。这个例子的作用是,获得部门编号,通过游标来显示这个部门中的所有雇员信息。
<P>#include <stdio.h> <BR>/* 声明宿主变量 */ <BR>char userid[12] =
"SCOTT/TIGER";<BR>char emp_name[10];<BR>int emp_number;<BR>int
dept_number; <BR>char temp[32];<BR>void sql_error();<BR>/*包含SQLCA */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -