大纲
- 一、PROC简介
- 二、PROC使用
- 1.proC环境准备
- 2.proC代码示例
- 建立数据库连接
- 建表
- 查表
- 插入数据
- 更新数据
- 删表
一、PROC简介
嵌入式 SQL 是指在应用程序里直接嵌入 SQL 语句。因为嵌入SQL,应用程序又叫宿主程序,编写应用程序的高级语言又叫宿主语言。例如, PRO*C/C++能够在 C 和 C++宿主程序嵌入一些 SQL 语句。
可嵌入的 SQL 语句包括 DDL 与 DML 语句,以及一些事务控制语句,这些语句都是嵌入的可执行语句。可执行语句在编译时会调用 libdmdpc.so 库接口,通过它们连接数据库,进行数据定义及查询操作数据库数据, 以及处理事务,它们能存在 C/C++语言中任何可执行语句能嵌入的地方。
二、PROC使用
在 PROC 程序中能够自由地使用 SQL 语句与 C 语句, 也可以在 SQL 语句中使用 C 变量和结构。 在 PROC 中使用 SQL 语句必须在 SQL 语句前加上关键字“EXEC SQL” 并且以分号结束。 DM 的预编译命令行运行程序 dpc_new 将所有带有“EXEC SQL” 的语句转换为对 libdmdpc.so 库中接口的调用。
1.proC环境准备
举例说明嵌有 SQL 语句的 C 语言程序 PRO*C 的运行过程:
- 编写嵌有 SQL 语句的源程序 test.pc;
- 使用 DM 预编译工具 dpc_new 编译 test.pc,生成 test.c;
- C 编译器编译链接上述文件,以及 dpc_dll.h、 DPI.h、 DPItypes.h、sqlca.h、 dmdpc.lib、 dmdpc.dll,生成 test.exe 可执行程序。 若在Linux 下则将 dmdpc.lib、 dmdpc.dll 改为 libdmdpc.a 和 libdmdpc.so。
2.proC代码示例
建立数据库连接
在用户程序中,登录语句的逻辑位置必须先于所有可执行的 SQL语句,只有执行登录语句之后,才能执行其它可执行的 SQL语句。如果登录失败,则终止程序的运行
/* test.pc */
#include <stdio.h>
#include <stdlib.h>
/*宿主变量的定义 */
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char username[20],password[20],servername[20];
EXEC SQL END DECLARE SECTION;
int main()
{
printf(" Please input username:");
scanf("%s",username);
printf(" Please input password :");
scanf("%s",password);
printf(" Please input servername :");
scanf("%s",servername);
/*登录数据库*/
EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;
if ( sqlca.sqlcode!=0 )
{
printf( "login fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
exit(-1);
}
else
printf("login successful!\n");
/*退出数据库*/
EXEC SQL LOGOUT;
}
建表
建立一个测试表
/* test.pc */
#include <stdio.h>
#include <stdlib.h>
/*宿主变量的定义 */
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char username[20],password[20],servername[20];
EXEC SQL END DECLARE SECTION;
int main()
{
printf(" Please input username:");
scanf("%s",username);
printf(" Please input password :");
scanf("%s",password);
printf(" Please input servername :");
scanf("%s",servername);
/*登录数据库*/
EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;
if ( sqlca.sqlcode!=0 )
{
printf( "login fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
exit(-1);
}
else
printf("login successful!\n");
EXEC SQL CREATE TABLE TEST(AA INT,BB VARCHAR2);
if ( sqlca.sqlcode!=0 )
{
printf( "static 1:create fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
return 1;
}
else{
printf( "static 1:create ok!\n") ;
}
EXEC SQL COMMIT;
/*退出数据库*/
EXEC SQL LOGOUT;
}
查表
查询是最常用的 SQL 操作之一, 可以将从数据库中检索到的值赋给相应的目标变量
/* test.pc */
#include <stdio.h>
#include <stdlib.h>
/*宿主变量的定义 */
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char username[20],password[20],servername[20];
int aa=1;
char bb[50]="dm";
EXEC SQL END DECLARE SECTION;
int main()
{
printf(" Please input username:");
scanf("%s",username);
printf(" Please input password :");
scanf("%s",password);
printf(" Please input servername :");
scanf("%s",servername);
/*登录数据库*/
EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;
if ( sqlca.sqlcode!=0 )
{
printf( "login fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
exit(-1);
}
else
printf("login successful!\n");
EXEC SQL SELECT AA,BB INTO :aa,:bb FROM TEST WHERE AA=1;
printf("aa=%d\t bb=%s\n",aa,bb);
/*退出数据库*/
EXEC SQL LOGOUT;
}
插入数据
使用 INSERT 语句向数据库插入数据
/* test.pc */
#include <stdio.h>
#include <stdlib.h>
/*宿主变量的定义 */
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char username[20],password[20],servername[20];
int aa;
char bb[50];
EXEC SQL END DECLARE SECTION;
int main()
{
printf(" Please input username:");
scanf("%s",username);
printf(" Please input password :");
scanf("%s",password);
printf(" Please input servername :");
scanf("%s",servername);
/*登录数据库*/
EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;
if ( sqlca.sqlcode!=0 )
{
printf( "login fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
exit(-1);
}
else
printf("login successful!\n");
EXEC SQL INSERT INTO TEST(AA,BB) VALUES(:aa, :bb);
if ( sqlca.sqlcode!=0 )
{
printf( "static 1:insert fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
return 1;
}
else{
printf( "static 1:insert ok!\n") ;
}
EXEC SQL COMMIT;
/*退出数据库*/
EXEC SQL LOGOUT;
}
更新数据
使用 UPDATE 语句更新数据库表中指定列的值
/* test.pc */
#include <stdio.h>
#include <stdlib.h>
/*宿主变量的定义 */
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char username[20],password[20],servername[20];
int aa;
char bb[50];
char cc[50]="dameng";
EXEC SQL END DECLARE SECTION;
int main()
{
printf(" Please input username:");
scanf("%s",username);
printf(" Please input password :");
scanf("%s",password);
printf(" Please input servername :");
scanf("%s",servername);
/*登录数据库*/
EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;
if ( sqlca.sqlcode!=0 )
{
printf( "login fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
exit(-1);
}
else
printf("login successful!\n");
EXEC SQL SELECT AA,BB INTO :aa,:bb FROM TEST WHERE AA=1;
printf("aa=%d\t bb=%s\n",aa,bb);
if ( sqlca.sqlcode!=0 )
{
printf( "static 1:insert fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
return 1;
}
else{
printf( "static 1:insert ok!\n") ;
}
EXEC SQL SELECT AA,BB INTO :aa,:bb FROM TEST WHERE AA=1;
printf("aa=%d\t bb=%s\n",aa,bb);
EXEC SQL UPDATE TEST SET BB=:cc WHERE AA=1;
if ( sqlca.sqlcode!=0 )
{
printf( "static 1:update fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
return 1;
}
else{
printf( "static 1:update ok!\n") ;
}
EXEC SQL SELECT AA,BB INTO :aa,:bb FROM TEST WHERE AA=1;
printf("aa=%d\t bb=%s",aa,bb);
EXEC SQL COMMIT;
/*退出数据库*/
EXEC SQL LOGOUT;
}
删表
使用 DELETE 语句删除数据库表中的数据
/* test.pc */
#include <stdio.h>
#include <stdlib.h>
/*宿主变量的定义 */
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char username[20],password[20],servername[20];
int aa;
char bb[50];
char cc[50]="dameng";
EXEC SQL END DECLARE SECTION;
int main()
{
printf(" Please input username:");
scanf("%s",username);
printf(" Please input password :");
scanf("%s",password);
printf(" Please input servername :");
scanf("%s",servername);
/*登录数据库*/
EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;
if ( sqlca.sqlcode!=0 )
{
printf( "login fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
exit(-1);
}
else
printf("login successful!\n");
EXEC SQL SELECT AA,BB INTO :aa,:bb FROM TEST WHERE AA=1;
printf("aa=%d\t bb=%s\n",aa,bb);
if ( sqlca.sqlcode!=0 )
{
printf( "static 1:insert fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
return 1;
}
else{
printf( "static 1:insert ok!\n") ;
}
EXEC SQL SELECT AA,BB INTO :aa,:bb FROM TEST WHERE AA=1;
printf("aa=%d\t bb=%s\n",aa,bb);
EXEC SQL DELETE FROM TEST WHERE AA=1;
if ( sqlca.sqlcode!=0 )
{
printf( "static 1:update fail![%d, %s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc ) ;
return 1;
}
else{
printf( "static 1:update ok!\n") ;
}
EXEC SQL COMMIT;
/*退出数据库*/
EXEC SQL LOGOUT;
}
希望大家学的开心,开心的学