一、概念:
pro程序:通過在過程化編程語言中 嵌入sql語句開發出的應用程序叫pro程序。
宿主語言:sql語句所嵌入的語言。proc proc++目的:使c 或者 c++ 這種高效的語言成爲訪問oracle數據
的工具。
二、例子
a 連接數據庫
方式一:exec sql connect:用戶名 identified by 密碼;方式二:exec sql connect:用戶名/密碼;
b 查詢數據
exec sql select 字段 into 變量 from 表
where 條件;
c 斷開數據庫連接
exec sql commit work release;
linux上寫一個proc程序的步驟
1.編寫源代碼
vi ***.pc
2.預編譯 把pc文件變成c文件
proc ***.pc
3.編譯 鏈接
gcc ***.c -lclntsh
gcc ***.c -lorasql10 (windows)
4.執行
./a.out
一個例子
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
EXEC SQL INCLUDE SQLCA; (1)
int main()
{
EXEC SQL BEGIN DECLARE SECTION;// (2)
char firstname[13];
char userid[9]="open123";
char passwd[19]="open";
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT:userid identify by passwd; //(3)
EXEC SQL SELECT FIRSTNME INTO :firstname // (4)
FROM employee
WHERE LASTNAME = 'JOHNSON'; //(4)
printf( "First name = %s\n", firstname );
EXEC SQL CONNECT RESET; //(5)
return 0;
}
上面是一個簡單的靜態嵌入SQL語句的應用程序。它包括了嵌入SQL的主要部分:
(1)中的include SQLCA語句定義並描述了SQLCA的結構。SQLCA用於應用程序和數據庫之間的通訊,其中的SQLCODE返回SQL語句執行後的結果狀態。
(2)在BEGIN DECLARE SECTION和END DECLARE SECTION之間定義了宿主變量。宿主變量可被SQL語句引用,也可以被C語言語句引用。它用於將程序中的數據通過SQL語句傳給數據庫管理器,或從數據庫管理器接收查詢的結果。在SQL語句中,主變量前均有“:”標誌以示區別。
(3)在每次訪問數據庫之前必須做CONNECT操作,以連接到某一個數據庫上。這時,應該保證數據庫實例已經啓動。
(4)是一條選擇語句。它將表employee中的LASTNAME爲“JOHNSON”的行數據的FIRSTNAME查出,並將它放在firstname變量中。該語句返回一個結果。可以通過遊標返回多個結果。當然,也可以包含update、insert和delete語句。
(5)最後斷開數據庫的連接。
從上例看出,每條嵌入式SQL語句都用EXEC SQL開始,表明它是一條SQL語句。這也是告訴預編譯器在EXEC SQL和“;”之間是嵌入SQL語句。如果一條嵌入式SQL語句佔用多行,在C程序中可以用續行符“\”
和c++相關的
oname 默認生成是.c文件 如果改成c++的需要制定成.cpp
iname 輸入文件名 可以省略
parse 解析方式 默認是full c的方式. c++ 推薦的方式:none 嚴格的c++解析:partia ( 不推薦使用)
code 默認是ansi_c . c++ 使用 cpp
proc++ 例子
#include <iostream>
using namespace std;
exec sql include sqlca;
int main(){
exec sql begin declare section;
char userpasswd[30]="openlab/open123";
char var_name[30];
exec sql end declare section;
/* 連接數據庫 */
exec sql connect:userpasswd;
/* 查詢s_emp表中的 first_name id=1 */
exec sql select first_name into
:var_name from s_emp where id=1;
cout<<"var_name="<<var_name<<endl;
exec sql commit work release;
}
預編譯:
proc iname=second.pc oname=second.cpp
parse=none code=cpp編譯:g++ second.cpp -lclntsh
執行:
./a.out
注意:
.c++ 要求把所有的在sql中使用的變量 放入申明區
c語言 在linux 和unix 下不用把在sql中使用的變量放入申明區。c++ 無論在哪個系統下都需要把這些變量
放入申明區。
exec sql begin declare section;
/* 這就是申明區 */
exec sql end declare section;
三 宿主變量
既能在sql語句中使用,又能在宿主語言中使用.
1.宿主變量的類型char
char var[n] 定長字符串
short
int
long
float
double
varchar var[n] 變長字符串
a.變長字符串的使用
varchar var_name[n]={0};
在sql語句中 和定長字符串沒有區別
exec sql select first_name into :var_name
from s_emp where id=1;
在c中訪問數據需要使用 .arr
printf("var_name=%s\n",var_name.arr);
可以得到放入變長字符 數據的長度
var_name.len
在數據的之後 設置一個\0
var_name.arr[var_name.len]='\0';
b.處理變長字符串的方式2
使用 char_map=charz 定長處理 空格補齊 \0結尾
=charf|varchar2 定長 空格補齊
=string 變長 \0結尾
eg: proc charn.pc char_map=string //這樣就可以將charn.pc程序中的所有定長字符串變成 變長字符串了。
2.宿主變量的注意事項
1.強烈推薦把宿主變量放入申明區
exec sql begin declare section;
exec sql end declare section;
2.宿主變量可以使用指針 不推薦使用
3.DDL中不能使用宿主變量
4.在sql中使用宿主變量時 推薦加上冒號
exec sql select first_name into :var_name
where id=:id;