什么是Pro*C/C++,嵌入式SQL,第一个pro*c程序,pro*c++,Makefile,Proc增删改查,makefileproc
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 |
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; } |
adoquery1.Fielddefs[1].Name; 字段名
dbgrid1.columns[0].width:=10; dbgrid的字段宽度
adoquery1.Fields[i].DataType=ftString 字段类型
update jb_spzl set kp_item_name=upper(kp_item_name) 修改数据库表中某一列为大写
select * from master.dbo.sysobjects ,jm_barcode.dbo.users 多库查询
adotable1.sort:='字段名称 ASC' adotable排序
SQL常用语句一览
sp_password null,'新密码','sa' 修改数据库密码
(1)数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 orderby 字段名 [desc] "
sql="select * from 数据表 where 字段名 like '%字段值%' orderby 字段名 [desc]"
sql="select top10 * from 数据表 where 字段名 orderby 字段名[desc]"
sql="select * from 数据表 where 字段名 in('值1','值2','值3')"
sql="select * from 数据表 where 字段名 between 值1 and 值 2"
(2)更新数据记录:
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2……字段n=值n where 条件表达式"
(3)删除数据记录:
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表 "(将数据表所有记录删除)
(4)添加数据记录:
sql="insert into 数据表(字段1,字段2,字段3…) values(值1,值2,值3…)"
sql="insert into 目标数据表 select * from 源数据表"(把源数据表的记录添加到目标数据表)
(5)数据记录统计函数:
AVG(字段名)得出一个表格栏平均值
COUNT(*|字段名)对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名)取得一个表格栏最大的值
MIN(字段名)取得一个表格栏最小的值
SUM(字段名)把数据栏的值相加
引用以上函数的方法:
sql="selectsum(字段名)as别名from数据表where条件表达式"
setrs=conn.excute(sql)
用rs("别名")获取统的计值,其它函数运用同上。
(5)数据表的建立和删除:
CREATETABLE数据表名称(字段1类型1(长度),字段2类型2(长度)……)
例:CREATETABLEtab01 (namevarchar (50), datetimedef......余下全文>>
[回答]:需要至少3种知识
1.C语言
2.Unix操作系统
3.SQL文
很抱歉,proC和pro*C是完全的两种东西,楼主说的是pro*C吧。
下面分别介绍
1.C语言
C语言是国际上广泛流行的,很有发展前途的计算机高级语言.它适合作为系统描述语言,即可用来编写系统软件,也可用来编写应用软件.
2.Unix操作系统
2-1.Unix命令
Unix命令很多,大致分为以下几种
*1. 与用户相关的命令
*2. 命令或文件的查找
*3. 查看命令的用法
*4. 管理员常用命令
*5. 与进程相关的命令
*6. 通讯
*7. 文件比较
*8. 文件操作
*9. 目录操作
*10. 文件信息命令
*11. 编辑器
*12. 文件内容查找
*13. 任务调度
*14. 存储,归纳及压缩
*15. 其他命令
*16. 文本处理
*17. 网络配置命令及故障排除命令
2-2.Makefile
自动化编译工具,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
2-3.shell 在proc中主要用于启动程序
Bourne shell,由Stephen Bourne开发
Korn shell,由David Korn开发
C shell,由Bill Joy开发
shell的功能:
命令行解释功能
启动程序
输入输出重定向
管道连接
文件名置换
变量维护
环境控制
shell编程
3.SQL文
数据库操作语言
总结:
Pro*C的概念可以简单的理解为:通过在过程化编程语言C/C++中嵌入SQL语句而开发出的应用程序.
悉雨辰寂