第一种动态sql
EXEC SQL EXECUTE IMMEDIATE :psql;
.仅适用于非select语句
.嵌入SQL语句中不能包含输入宿主变量
void main()
{
EXEC SQL WHENEVER SQLERROR DO sqlerr();
EXEC SQL connect:serverid ;
printf("connect ok!\r\n");
char buf[]={};
while()
{
memset(buf,,sizeof(buf));
memset(psql,,sizeof(psql));
printf("\r\n SQL:");
gets(buf);
if(buf[]=='')
{
break;
}
strcpy(psql,buf);
//动态sql第一种
EXEC SQL EXECUTE IMMEDIATE :psql;
EXEC SQL COMMIT;
printf("SQL 语句执行成功 !\r\n");
}
//提交断开连接
EXEC SQL COMMIT RELEASE;
system("pause");
}
第二种动态sql
EXEC SQL PREPARE 标识符 FROM 'SQL语句';
EXEC SQL EXECUTE 标识符 USING 宿主变量1,宿主变量2;
.仅适用于非select语句
.嵌入SQL语句中可以包含输入宿主变量和指示变量,其个数和类型在预编译时已知。
void main()
{
EXEC SQL WHENEVER SQLERROR DO sqlerr();
EXEC SQL connect:serverid ;
printf("connect ok!\r\n");
while()
{
memset(name1,,sizeof(name1));
printf("\r\n 请输入要修改的ida的ID:");
scanf("%d",&ida1);
getchar();
printf("\r\n 请输入要修改的name的值:");
gets(name1);
if(ida1==)
{
break;
}
//动态sql第二种
//准备固定的sql语句
//mypresql:准备sql语句的标识符
//:a和:b :并非宿主变量,而是一个占位符
EXEC SQL PREPARE mypresql FROM 'update t2 set name=:a where ida=:b';
//执行动态sql
EXEC SQL EXECUTE mypresql USING :name1,:ida1; EXEC SQL COMMIT;
printf("SQL 语句执行成功 !\r\n");
}
//提交断开连接
EXEC SQL COMMIT RELEASE;
system("pause");
}
第三种动态sql
.输入宿主变量个数固定 查询条件固定
.输出宿主变量个数固定 返回结果固定
void main()
{
EXEC SQL WHENEVER SQLERROR DO sqlerr();
EXEC SQL connect:serverid ;
printf("connect ok!\r\n");
while()
{
memset(name1,,sizeof(name1));
printf("\r\n 请输入要查询的name的值:");
gets(name1);
if(name1[]=='')
{
break;
}
//动态sql第三种
//准备固定的sql语句
//mypresql:准备sql语句的标识符
//:a和:b :并非宿主变量,而是一个占位符
EXEC SQL PREPARE mypresql FROM 'select ida,idb,name from t2 where name=:a';
//定义游标
EXEC SQL DECLARE c CURSOR FOR mypresql;
//打开游标,传入参数
EXEC SQL OPEN c USING :name1;
//查询数据
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while()
{
exec sql fetch c into :ida2,:idb2,:name2:name2_ind;
if(name2_ind==-)
{
memset(name2,,sizeof(name2));
strcpy(name2,"null");
}
printf("ida=%d,idb=%d,name=%s\r\n",ida2,idb2,name2);
}
//关闭游标
EXEC SQL CLOSE c;
}
//提交断开连接
EXEC SQL COMMIT RELEASE;
system("pause");
}