什么是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 |
?
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; } |
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的什么是Pro*C/C++,嵌入式SQL,第一个pro*c程序,pro*c++,Makefile,Proc增删改查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 13薪和年终奖冲突吗 两者是可以一起发的
- 下一篇: etf期权开户条件