程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [轉]什麼是Pro*C/C++,嵌入式SQL,第一個pro*c程序,pro*c++,Makefile,Proc增刪改查,makefileproc

[轉]什麼是Pro*C/C++,嵌入式SQL,第一個pro*c程序,pro*c++,Makefile,Proc增刪改查,makefileproc

編輯:關於C語言

[轉]什麼是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;

}

原文地址:http://www.2cto.com/database/201410/342324.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved