动态SQL--直接执行SQL
例
从关系STUDENT中删除指定条件的学生记录。
条件存在应用程序变量cond中,由于cond在语句末尾,其后应加‘;’号
EXEC SQL BEGIN DECLARE SECTION;
char Sqlstring[200]; /*定义宿主变量*/
EXEC SQL END DECLARE SECTION;
/*开始行和结束行均为独立语句*/
char cond[150];
/*填入SQL固定部分*/
strcpy(sqlstring,“DELETE FROM STUDENT WHERE");
printf("Enter Search condition;”);
scanf(“%s”,cond);
strcat(sqlstring,cond);
EXEC SQL EXECUTE IMMEDIATE :sqlstring;
三、带动态参数的动态SQL
~~也只用于非查询语句。
~~占位器(place holder)
它是一种未定义宿主变量,执行前应用程序提示用户输入参数,取代占位变量。
~~仍用删除符合条件的学生例子。
EXEC SQL BEGIN DECLARE SECTION;
char Sqlstring[200]; /*定义宿主变量*/
int birth-year;
EXEC SQL END DECLARE SECTION;
strcpy(sqlstring,“DELETE FROM STUDENT WHERE YEAR(BDATE)<= :y;");
/*y为占位器,YEAR为函数*/
printf("Enter birth year for deleting:");
scanf(“%d”,birth-year);
/*用PREPARE语句定义sqlstring中SQL语句为命令PURGE,PREPARE为准备*/
EXEC SQL PREPARE PURGE FROM :sqlstring;
/*用birth-year取代y,并执行PURGE*/
EXEC SQL EXECUTE PURGE USING :birth-year;
上例中:
~~y没有说明,place holder占位器
~~执行中将用户输入的birth-year值取代它。
~~动态SQL语句中可有多个占位变量,这时USING后为宿主变量列表,占位变量依据在语句中出现先后,从前向后使用USING后的宿主变量去代。
四、查询类动态SQL
~~查询类动态SQL必须返回查询结果,结果为一个元组还是多元组不能在编程时确定。故动态SQL一律用游标取数。
~~下边例子,用户输入ORDER BY子句和课号。
~~ORDER BY子句在语句尾,注意其后必须加分号。
~~如需要,整个SQL语句也可动态构成,这给动态SQL增加了交互能力,有时是很有用处的。