proc*c/c++简介

一、概述

1. 概念

通过在过程化编程语言C/C++中嵌入SQL语句而开发出的应用程序。在通用编程语言中使用的SQL称为嵌入式SQL。

在SQL标准中定义了多种语言的嵌入式SQL ,各个厂商对嵌入式SQL的具体实现不同。

在C/C++语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C++程序。

目的:使c/c++这种高效率语言成为访问数据库的工具。

嵌入式SQL的载体是宿主语言。

宿主语言          Pro程序

C/C++                  Pro*C/C++

FORTRAN            Pro*FORTRAN

PASCAL                Pro*PASCAL

访问数据库的方法

用SQL*Plus, 它有SQL命令以交互的应用程序访问数据库;

用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;

利用在第三代语言内嵌入的SQL语言或ORACLE库函数调用来访问。

访问oracle数据库的方法

SQLPLUS    oracle自带访问数据库工具

JDBC           java  database  connectivity  standard

ODBC         open  database  connectivity开放数据库互连

OCI             oracle  call  interface

OCCI           oracle  c++  call  interface

Pro*X                   Pro*C/C++           Pro*COBOL等

2. 程序结构

Pro*C程序实例

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include "sqlca.h"



EXEC SQL BEGIN DECLARE SECTION;

         char username[32];

         char password[32];

         char dname[25];

EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE sqlca;



void sqlerror();

main()

{

   EXEC SQL WHENEVER SQLERROR DO sqlerror();

   strcpy(username,“haha");

   strcpy(password, “haha");

   EXEC SQL CONNECT:username IDENTIFIED BY:password;

   EXEC SQL select dname into :dname from dept where id=10;

   printf(“dname:%s \n”, dname);

}

void sqlerror()

{

   EXEC SQL WHENEVER SQLERROR CONTINUE;

   printf("\n---- oracle error detected:\n");

   printf("%.70s\n", sqlca.sqlerrm.sqlerrmc);

   EXEC SQL ROLLBACK WORK RELEASE;

   exit(1);

}

Pro*C程序结构

Include 头文件 (c/c++ and pro*c/c++)

定义变量

定义函数

main

                   连结数据库: connect

                   SQL 操作语句:  EXEC SQL …….;

                   exception handler

                   断开连结:

        EXEC SQL COMMIT / ROLLBACK WORK release

3. 开发流程

需要使用proc将.pc文件预编译为.c文件,再按照.c文件的流程编译.c文件。

例子

编写hello.pc

#include <stdio.h>

#include <string.h>

#include "sqlca.h"

EXEC SQL BEGIN DECLARE SECTION ;

         char *serverid = "scott/123456@orcl";

EXEC SQL END DECLARE SECTION;

int main()

{

         int ret = 0;

         printf("hello...\n");

         printf("serverid:%s\n", serverid);

         EXEC SQL connect :serverid;

         if(sqlca.sqlcode != 0)

         {

                   ret = sqlca.sqlcode;

                   printf("EXEC SQL connect:err, %d\n", ret);

                   return ret;

         }

         printf("connect ok\n");

         return ret;

}

使用proc命令proc  hello.pc

使用gcc命令

gcc  hello.c  -I/home/oracle_11/app/oracle/product/11.2.0/db_1/precomp/public  -L//home/oracle_11/app/oracle/product/11.2.0/db_1/lib  -lclntsh

c++例子

编写c++版的hellocpp.pc

#include <stdio.h>

#include <string.h>

#include "sqlca.h"

using namespace std;

EXEC SQL BEGIN DECLARE SECTION ;

         char *serverid = "scott/123456@orcl";

EXEC SQL END DECLARE SECTION;

int main()

{

         int ret = 0;

         cout << "hello...\n" << endl;

         cout << "serverid:" << serverid << endl;

         EXEC SQL connect :serverid;

         if(sqlca.sqlcode != 0)

         {

                   ret = sqlca.sqlcode;

                   printf("EXEC SQL connect:err, %d\n", ret);

                   return ret;

         }

         printf("connect ok\n");

         return ret;

}

使用proc编译

proc iname=C:\Users\Administrator\Desktop\hellocpp.pc oname= C:\Users\Administrator\Desktop\hellocpp.cc PARSE=NONE CODE=CPP

使用g++编译

g++  hellocpp.cc  -I/home/oracle_11/app/oracle/product/11.2.0/db_1/precomp/public  -L//home/oracle_11/app/oracle/product/11.2.0/db_1/lib  -lclntsh

二、prc*c/c++基础开发

1. 连接数据库

见上面的例子。

2. 宿主变量和指示器变量

宿主变量是一种pro*c语言变量, 用于在应用程序中和oracle数据库之间传递数据。Pro*C程序中,既可在SQL语句中引用,也可在C语句中引用的变量称为SQL变量。

宿主变量的数据类型
                                    char                     单字符

                                    char[n]                N个定长字符数组

                                    int                        整数

                                    Short                   短整数

                                    long                     长整数

                                    float                    单精度浮点数

                                    double                 双精度浮点数

                                    VARCHAR[n]       变长字符串

例子

编写demo1.pc

#include <stdio.h>

#include <string.h>

#include "sqlca.h"

EXEC SQL BEGIN DECLARE SECTION ;

         char *serverid = "scott/123456@orcl";

         int tid;

         char tname[20];

         char taddress[50];

         int tid2;

         char tname2[20];

         char taddress2[50];

EXEC SQL END DECLARE SECTION;

int main()

{

         int ret = 0;

         printf("hello...\n");

         printf("serverid:%s\n", serverid);
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值