1
什么是Pro*C/C++

1、通过在过程编程语言C/C++中嵌入SQL语句而开发出的应用程序

2、什么是嵌入式SQL

1、在通用编程语言中使用的SQL称为嵌入式SQL

2、在SQL标准中定义了非常多中语言的嵌入式SQL

3、各个厂商对嵌入式SQL的详细实现不同

3、什么是Pro*C/C++

1、在C/C++语言中嵌入SQL语句而开发出的应用程序。

2、目的:使c/c++这样的效率语言称为訪问数据库的工具。

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

宿主语言  
       Pro程序

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

FORTRAN       
   Pro*FORTRAN

PASCAL           
Pro*PASCAL

COBOL           
        Pro*COBOL

PL/I    
            Pro*PL/I

Ada 
            Pro*Ada

5、訪问数据库的方法

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

(2)用第四代语言应用开发工具开发的应用程序訪问数据库,这些工具有SQL*Froms。QL*Reportwriter,SQL*Menu等.

(3)利用在第三代语言嵌入的SQL语言或ORACLE库函数来调用来訪问。

訪问oracle数据库的方法。

其他:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

6、第一个pro*C程序

A  
在进行pro*c程序开发的时候。要配置/home/oracle_11/app/oracle/product/11.2.0/db_1/precomp/admin下的pcscfg.cfg。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

上面的配置是一个正确的配置。

B  
创建dm01_hello.pc

文件内容例如以下:

依赖的头文件:

/home/oracle_11/app/oracle/product/11.2.0/db_1/precomp/public下的SQLCA.H

dm01_hello.pc文件内容(使用UE工具。保存后就可以通过FTP上传到server上)

#include <stdio.h>

#include <string.h>

#include "sqlca.h"

//定义宿主变量 serverid

EXEC SQL BEGIN DECLARE SECTION;

//格式:username/用户password@server名

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

EXEC SQL END DECLARE SECTION;

int main()

{

int ret  = 0;

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

//在C中是宿主变量

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

//嵌入式SQL语言必需要以 EXEC SQL开头

//: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;

}

编译并执行:dm01_hello.pc,执行的命令是:proc
dm01_hello.pc

接着生成.out文件。

注意一个错误1:

出现上面的错误的原因是没有引入共享库。要依照以下的方式运行:

gcc dm01_hello.c -o dm01_hello 
-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

上面的是引入clntsh.so这个共享库

注意错误2:

[oracle@localhost day03]$ ./dm01_hello

hello....

serverid:scott/123456@orcl

EXEC SQL connect:err, -12541

能够通过以下的命令查看错误原因:

oerr ora 12541  
(这个错误是由于监听未启动)

这时候要:

sqlplus /nolog

conn /as sysdba

startup

quit

在运行:

lsnrctl start  
(能够通过ps –u oracle命令查看oracle相关启动服务)

再运行的时候就不会出现错误了。

7 PreCompile编译器预编译程序

1、该工具在什么地方

功能:完毕Pro*c源程序到纯C源程序的转换

基本命令格式:

PROC INAME=filename [OptionName1=value1]…[OptionNameN=valueN]

经常使用编译选项:

INAME=path and filename (name of the input file)

ONAME=path and filename (name of the output file)

INCLUDE=path 
(头文件所在路径)

--INCLUDE =路径名
或 INCLUDE =(路径名1,路径名2)

PARSE=FULL | PARTIA | NONE (default FULL for C, Others for C++) 
假设想编译c++,要改成PARTIA或NONE

CODE=ANSI_C | CPP (default ansi_c)

USERID=username/password


proc编译c++文件

默认情况下proc是编译
.c 文件的。要想编译c++文件。须要运行类似以下的操作:

proc iname=./dm02_hello.pconame=dm02_hello.cc PARSE=NONE CODE=CPP

#include <iostream>

#include <stdio.h>

#include <string.h>

#include "sqlca.h"

using namespace std;

//定义宿主变量 serverid

EXEC SQL BEGIN DECLARE SECTION;

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

EXEC SQL END DECLARE SECTION;

int main()

{

int ret = 0;

cout << "hello..." << endl;

//在C中宿主变量

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

//嵌入式SQL语言必需要以EXEC SQL开头

//:serverid 要引用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 iname=./dm02_hello.pc oname=dm02_hello.cc PARSE=NONE CODE=CPP

运行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

注意上面红线部分和运行C的不同样

接着编译cc文件:

g++ dm02_hello.cc -o dm02_hello -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

9.编写一个最简单的MakeFile

all:dm01_hello dm02_hello

dm01_hello:

@echo 'proc dm01_hello begin'

proc dm01_hello.pc

@echo 'gcc dm01_hello begin'

gcc dm01_hello.c -o dm01_hello -I${ORACLE_HOME}/precomp/public -L${ORACLE_HOME}/lib -lclntsh

dm02_hello:

@echo 'proc dm02_hello begin'

proc iname=./dm02_hello.pc oname=dm02_hello.cc PARSE=NONE CODE=CPP

@echo 'gcc dm02_hello begin'

g++ dm02_hello.cc -o dm02_hello -I${ORACLE_HOME}/precomp/public -L${ORACLE_HOME}/lib -lclntsh

clean:

@rm dm01_hello

@rm dm02_hello

运行命令:

make

10
数据库的增删改查:

编写公共的Makefile

all: dm01_dbop

dm01_dbop:

@echo 'proc dm01_dbop begin'

proc dm01_dbop.pc

@echo 'gcc dm01_dbop begin'

gcc dm01_dbop.c -o dm01_dbop  -I${ORACLE_HOME}/precomp/public -L${ORACLE_HOME}/lib –lclntsh

clean:

@rm dm01_dbop

插入数据:

#include <stdio.h>

#include <string.h>

#include <string.h>

#include "sqlca.h"

//定义宿主变量 serverid

EXEC SQL BEGIN DECLARE SECTION 
;

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

int              deptno;

char         dname[20];

char loc[20]      ;

int              deptno2;

char         dname2[20];

char loc2[20]    ;

EXEC SQL END DECLARE SECTION;

int main()

{

int ret  = 0;

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

//在C中是宿主变量

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

//嵌入式SQL语言必需要以 EXEC SQL开头

//: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");

deptno = 50;

strcpy(dname, "50name");

strcpy(loc, "50loc");

//添加数据

EXEC SQL insert into dept (deptno, dname, loc)     
values(:deptno, :dname, :loc);

EXEC SQL commit;

EXEC SQL COMMIT  RELEASE; //提交事务断开连接

return ret;

}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

删除

Makefile略

#include <stdio.h>

#include <string.h>

#include <string.h>

#include "sqlca.h"

//定义宿主变量 serverid

EXEC SQL BEGIN DECLARE SECTION 
;

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

int              deptno;

char         dname[20];

char loc[20]      ;

int              deptno2;

char         dname2[20];

char loc2[20]    ;

EXEC SQL END DECLARE SECTION;

int main()

{

int ret  = 0;

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

//在C中是宿主变量

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

//嵌入式SQL语言必需要以 EXEC SQL开头

//: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");

deptno = 50;

strcpy(dname, "50name");

strcpy(loc, "50loc");

EXEC SQL delete from dept where deptno=:deptno;

EXEC SQL commit;

EXEC SQL COMMIT  RELEASE; //提交事务断开连接

return ret;

}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

更新:

Makefile公用上面的

#include <stdio.h>

#include <string.h>

#include <string.h>

#include "sqlca.h"

//定义宿主变量 serverid

EXEC SQL BEGIN DECLARE SECTION 
;

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

int              deptno;

char         dname[20];

char loc[20]      ;

int              deptno2;

char         dname2[20];

char loc2[20]    ;

EXEC SQL END DECLARE SECTION;

//更新

int main()

{

int ret  = 0;

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

//在C中是宿主变量

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

//嵌入式SQL语言必需要以 EXEC SQL开头

//: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");

deptno = 50;

strcpy(dname, "50name");

strcpy(loc, "50loc");

//添加数据

EXEC SQL insert into dept (deptno, dname, loc)     
values(:deptno, :dname, :loc);

EXEC SQL commit;

printf("enter key ... update \n");

getchar();

getchar();

strcpy(loc, "50locloc");

EXEC SQL  update dept set loc = :loc 
where deptno=:deptno;

//EXEC SQL delete from dept where deptno=:deptno;

EXEC SQL COMMIT  RELEASE; //提交事务断开连接

return ret;

}

运行结果:

数据库中的结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

查询并显示结果:

#include <stdio.h>

#include <string.h>

#include <string.h>

#include "sqlca.h"

//定义宿主变量 serverid

EXEC SQL BEGIN DECLARE SECTION 
;

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

int              deptno;

char         dname[20];

char loc[20]      ;

int              deptno2;

char         dname2[20];

char loc2[20]    ;

EXEC SQL END DECLARE SECTION;

//获取

int main()

{

int ret  = 0;

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

//在C中是宿主变量

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

//嵌入式SQL语言必需要以 EXEC SQL开头

//: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");

deptno = 50;

strcpy(dname, "50name");

strcpy(loc, "50loc");

EXEC SQL select deptno, dname, loc into  :deptno2, :dname2, :loc2 
from dept where deptno=:deptno;

printf("%d, %s, %s\n", deptno2, dname2, loc2);

EXEC SQL COMMIT  RELEASE; //提交事务断开连接

return ret;

}

什么是Pro*C/C++,嵌入式SQL,第一个pro*c程序,pro*c++,Makefile,Proc增删改查的更多相关文章

  1. Sql中常用的创建表 约束 主外键 增删改查的语句

    创建数据库 USE master; GO --日记数据库 create database DiaryBase on ( name=DiaryBase_Dat,--逻辑名称 FILENAME='c:\D ...

  2. sqlHelper做增删改查,SQL注入处理,存储值,cookie,session

    一.存储值 eg:登录一个页面,在进入这个页面之前你怎么知道它登没登录呢?[在登录成功之后我们把状态保存起来] 存储值得方式有两种,一种是cookie,一种是session 1.1区别: 代码: if ...

  3. Sql Server xml 类型字段的增删改查

    1.定义表结构 在MSSM中新建数据库表CommunicateItem,定义其中一个字段ItemContentXml 为xml类型 2.编辑表数据,新增一行,发现xml类型不能通过设计器录入数据. 需 ...

  4. MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

    二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...

  5. Android SQL语句实现数据库的增删改查

    本文介绍android中的数据库的增删改查 复习sql语法: * 增 insert into info (name,phone) values ('wuyudong','111') * 删 delet ...

  6. 数据库开发基础-SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)

    控制数据库的服务: 方法一: 1.Windows+R 打开运行  打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...

  7. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学、字符串、日期时间)函数[转]

    SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学.字符串.日期时间)函数   --创建表格 create table aa ( UserName varchar(50 ...

  9. EF4.0和EF5.0增删改查的写法区别及执行Sql的方法

    EF4.0和EF5.0增删改查的写法区别 public T AddEntity(T entity) { //EF4.0的写法 添加实体 //db.CreateObjectSet<T>(). ...

随机推荐

  1. UTF-8编码中BOM的检测与删除[linux下命令]

    Posted on 2011-05-14 所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此 ...

  2. ssl介绍以及双向认证和单向认证原理

    SSL安全证书可以自己生成,也可以通过第三方的CA(Certification Authority)认证中心付费申请颁发. SSL安全证书包括: 1.       CA证书,也叫根证书或中间级证书.单 ...

  3. .NET Core Runtime ARM32 builds now available

    原文地址:传送门 .NET Core Runtime ARM32 builds now available The .NET Core team is now producing ARM32 buil ...

  4. POJ 1703 Find them, Catch them【种类/带权并查集+判断两元素是否在同一集合/不同集合/无法确定+类似食物链】

      The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the ...

  5. Hystrix熔断器(六)

    一.分布式面临的问题 复杂的分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败雪崩效应多个微服务之间调用的时候,假设服务A调用微服务B和微服务C, 微服务B和微服务C又 ...

  6. bit & byte & B & KB & Kbps & KBps & ps

    存储单位bit & byte & B & KB & Kbps & KBps & ps    (bit,位:byte,字节:区别) Bit,位 :二进制数 ...

  7. [Contest20180311]朋友

    是毒瘤的friends呢~ 注意到“产生感情”和后缀自动机的$Right$集合定义很像,所以先对所有串建广义sam,那么一个节点$s$里的所有串都互相产生感情,而从起点走到$s$走最长路所经过的节点里 ...

  8. 【动态规划】bzoj1270 [BeijingWc2008]雷涛的小猫

    暴力dp是n^2*m的……我们计算每棵树在每层的答案的时候,都需要计算出从那棵树转移过来最优. 但是我们发现,对一棵树而言,从上面转移过来都是一样的,所以我们可以在计算每棵树在每层的答案的时候,先预处 ...

  9. [CF773D]Perishable Roads

    [CF773D]Perishable Roads 题目大意: 一个\(n(n\le2000)\)个点的完全图\(G\),定义\(d(x)\)为生成树上点\(x\)到根路径上的最小边权.问图\(G\)的 ...

  10. Problem E: 调用函数,求m-n之间的所有完数

    #include<stdio.h> int factorsum(int number)//定义函数 { ; ;i<number;i++) ) s+=i; return s; } in ...