您当前的位置:《数据库原理及应用》听课笔记:28
《数据库原理及应用》听课笔记:28
嵌入SQL的DDL和DML语句除前加EXEC SQL外,与ISQL没不同。
举例如下,其他可类推:
EXEC SQL INSERT SC(SNO,CNO,GRADE)
        VALUES(:SNO,:CNO,:GRADE);
DML语句,插入元组由三个宿主变量构成,宿主变量由宿主语言程序预先赋值。
查询语句是使用最多的嵌入式SQL语句。
查询结果只有一个元组,则可直接使INTO子句将其值赋入宿主变量,例:
EXEC SQL SELECT GRADE
     INTO :GRADE,:GRADEI
     FROM SC
     WHERE SNO=:GIVENSNO AND CNO=:GIVENCNO;
~~SNO,CNO是SC主键,查询结果不超过一个元组,确保INTO赋值合法性。
~~GRADE域可取NULL,后边加了指示变量GRADEI。
数据暂存区域,指示器,游标
~~查询结果超过一个元组,不能一次性地给宿主变量赋值。
~~数据暂存区域是在应用程序中开辟的一个暂存结果关系的区域。
~~指示器,实际上是结果关系暂存区域中的一个移动指针,指示当前元组(前一位置)。以便取出赋值宿主变量处理。
~~游标:查询结果暂存区域及相应结果关系框架一起称游标,有时也称指示器为游标
说明游标语句格式:
EXEC SQL DECLARE <游标名> CURSOR FOR
      SELECT ···
      FROM  ···
      WHERE  ···;
定义一个名门游标,并将它与相应的查询语句相联系。一个查询语句定义一个游标,再查询还要再定义。。。
打开游标语句的格式:
  EXEC SQL OPEN <游标名>;
~~打开游标时,即执行与游标相联系的SQL查询语句,并将结果置于游标中,此时游标处于打开状,游标指向第一元组前一位置。
~~查询结果与WHERE子句条件有关,取决于游标打开时宿主变量当前值,但打开后再改变查询条件中的宿主变量值,查询结果不会随之改变,除非关闭后重新打开一次。
取数语句的格式如下:
EXEC SQL FECTH <游标名> INTO :hostvar1,:hostvar2,··;
~~每次执行FECTH语句,先将指示器前进一个元组,然后取出当前元组赋分量值给hostvar1,hostvar2,···等宿主变量。
~~要恢复游标初始位置,应关闭游标后重新打开才行。
~~新SQL版本有指示器定位任意位置,后退,跳跃功能。
~~数已取完,再执行FECTH,(返回 SQLCODE代码100)
取完或发生错误(负值)时,应关闭游标,语句格式
EXEC SQL CLOSE <游标名>;
关闭后,再从该游标名下取数(FECTH),将返回错误。
再打开游标时,返回的结果可能跟上次打开的结果不一样。。。
下边举一个游标使用的例子。
EXEC SQL DECLARE <CI> CURSOR FOR
     SELECT SNO,GRADE
     FROM SC
     WHERE CNO=:GIVENCNO;
EXEC SQL OPEN CI;
while(TRUE)
{
if(SQLCA.SQLCODE==100)
    break;
if(SQLCA.SQLCODE<0)
    break;
EXEC SQL FETCH CI INTO :SNO,:GRADE,:GRADEI;
/*处理从游标所取出的数据的语句*/
}
EXEC SQL CLOSE CI;
收藏状态
收藏本课程的同学
相关课程