什么是Pro*C/C++,嵌入式SQL,第一个pro*c程序,pro*c++,Makefile,Proc增删改查

简介:  1 什么是Pro*C/C++ 1、通过在过程编程语言C/C++中嵌入SQL语句而开发出的应用程序 2、什么是嵌入式SQL 1、在通用编程语言中使用的SQL称为嵌入式SQL 2、在SQL标准中定义了很多中语言的嵌入式SQL 3、各个厂


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*FromsQL*Reportwriter,SQL*Menu.

3)利用在第三代语言嵌入的SQL语言或ORACLE库函数来调用来访问。访问oracle数据库的方法。

其它:

6、第一个pro*C程序

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

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

B   创建dm01_hello.pc

文件内容如下:

依赖的头文件:

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

dm01_hello.pc文件内容(使用UE工具,保存后即可通过FTP上传到服务器上)

#include <stdio.h>

#include <string.h>

#include "sqlca.h"

 

//定义宿主变量 serverid

EXEC SQL BEGIN DECLARE SECTION;

  //格式:用户名/用户密码@服务器名

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++,要改成PARTIANONE

CODE=ANSI_C | CPP (default ansi_c)

USERID=username/password

 

8  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

执行结果:

注意上面红线部分和执行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;

}

运行结果:

删除

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;

}

运行结果:

更新:

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;

}

执行结果:

数据库中的结果:

查询并显示结果:

#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;

}

 

 

 

 

 

 

 

 

 

 

 

目录
相关文章
|
22天前
|
开发框架 Linux C语言
C、C++、boost、Qt在嵌入式系统开发中的使用
C、C++、boost、Qt在嵌入式系统开发中的使用
31 1
|
28天前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
113 0
|
1月前
|
数据处理 C++ UED
如何作为一个嵌入式软件工程师博主获得铁粉:C/C++ 技术分享之道
如何作为一个嵌入式软件工程师博主获得铁粉:C/C++ 技术分享之道
46 0
|
1月前
|
SQL Oracle Java
sql文件批处理程序-java桌面应用
sql文件批处理程序-java桌面应用
25 0
|
6天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
14 0
|
23天前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
|
1月前
|
缓存 编译器 程序员
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
62 0
|
1月前
|
缓存 编译器 程序员
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
27 0
|
1月前
|
缓存 算法 编译器
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
39 0
|
1月前
|
自然语言处理 编译器 调度
深入gcc编译器:C/C++代码如何变为可执行程序
深入gcc编译器:C/C++代码如何变为可执行程序
77 0