大纲

  • 一、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 的运行过程:

  1. 编写嵌有 SQL 语句的源程序 test.pc;
  2. 使用 DM 预编译工具 dpc_new 编译 test.pc,生成 test.c;
  3. 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;
}

希望大家学的开心,开心的学