什么是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、各个厂商对嵌入式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数据库的方法。

其它:

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

执行结果:

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

}

 

 

 

 

 

 

 

 

 

 

 

时间: 2024-11-17 11:42:30

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

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库.   创建表: create table person( _id integer primary key, name varchar(20), age integer );   添加: insert into person(name, age) values('lisi', 19);   删除: delete from person where _id = 1;   修改: update person se

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

[正文] 首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(八)----JDBC入门及简单增删改数据库的操作 一.ResultSet接口的介绍: 对数据库的查询操作,一般需要返回查询结果,在程序中,JDBC为我们提供了ResultSet接口来专门处理查询结果集. Statement通过以下方法执行一个查询操作: ResultSet executeQuery(String sql) throws SQLException  单词Query就是查询的意思.函数的返回类型是ResultSe

sql2005-eclipse对数据库sql server2005的增删改查

问题描述 eclipse对数据库sql server2005的增删改查 package Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; import java.awt.*; import javax.swing.*; public class data extends JFrame implements ActionListener{ //priv

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

 二.SQL语句映射文件(2)增删改查.参数.缓存 2013-09-06 17:05:42 标签:配置文件 动态 元素 MyBatis学习 之 一.MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习 之 二.SQL语句映射文件(1)resultMap MyBatis学习 之 二.SQL语句映射文件(2)增删改查.参数.缓存 MyBatis学习 之 三.动态SQL语句 MyBatis学习 之 四.MyBatis配置文件 2.2 select 一个select 元素

SQLAlchemy增删改查基本操作,及SQL基本技能样码(join,group)

练了一天,基本的东东应该有感觉了. #coding=utf-8 from datetime import datetime from sqlalchemy import (MetaData, Table, Column, Integer, Numeric, String, Boolean, DateTime, ForeignKey, ForeignKey, create_engine) from sqlalchemy import (insert, select, update, delete,

sql 基础(增删改查)

sql执行顺序 1 执行where子句,从表中选行. 2 执行group by子句,对结果进行分组. 3 执行聚集函数(如count().max()). 4 执行having子句,过滤分组. 5 排序. 注释 可以使用/**/,表示块注释.也可以使用"-- a comment",表示行注释. 引号问题 既有单引号又有双引号怎么办? 答:连续两个单引号就表示一个单引号.例: sql中,insert into yourTable(f1) values(特殊字符串); 字符串内容若为'a&q

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

 2.2 select 一个select 元素非常简单.例如: Xml代码   <!-- 查询学生,根据id -->   <select id="getStudent" parameterType="String" resultMap="studentResultMap">       SELECT ST.STUDENT_ID,                  ST.STUDENT_NAME,              

sql基础 (表结构的增删改查)

1.创建 create table 表名( 列名1 数据类型 约束条件, 列名2 数据类型 约束条件, 列名3 数据类型 约束条件, ... 列名n 数据类型 约束条件, primary key (); foreign key () references 其他表表名() ); 2.修改 /*增加列*/ alter table antibotepl add `del` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除'; /*修改列,名字由schema改为att

Linq to SQL对象的增删改

你的程序里,是否到处充斥着这种代码: db.Customers.InsertOnSubmit(customer); db.SubmitChange(); 如果某一天,因为 Customers 表的数据库巨增,需要把它拆成两个表,你是否会胆寒???当然,对于查询,我们可以通过视图来解决.对于插入,或者更新呢?据说,现在的数据库在某些情况下,可以对视图进行数据的更新.插入.但是我们要考虑的是不可以的情况.是不是得每个地方都改呀?对于一个大型的项目,这种改动是很可怕的,某个地方少改了,就糟糕了.不过,