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;
}
原文地址:http://www.2cto.com/database/201410/342324.html