版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、王小龍Proc個人筆記總結(jié)procpro程序:通過在過程化語言中 嵌入sql語句 開發(fā)出的程序叫pro程序.宿主語言:sql語句所嵌入的語言為什么要使用 proc /proc+:使c 或者c+ 這種高效的語言成為訪問 oracle數(shù)據(jù)庫的工具./*連接數(shù)據(jù)庫*/exec sql connect:username identified by :password; /分開的exec sql connect:usernamepasswd; /連著的/*查詢*/exec sql select 字段 into :變量 from s_emp where id=1;/*斷開數(shù)據(jù)庫的連接*/exec sql
2、commit work release;exec sql rollback work release;1.編寫c的源代碼 如何編寫一個c程序 vi *.c2.編譯 鏈接 gcc *.c 3.執(zhí)行1.編寫源代碼 vi *.pc2.預(yù)編譯 proc *.pc 開發(fā)一個proc程序的步驟 會得到對應(yīng)的c文件 3.編譯 鏈接 gcc *.c -lclntsh gcc *.c -lorasql10 (windows) gcc *.c -lorasql10 -L 庫的位置 4.執(zhí)行 ./a.out vi first.pc#include 在sql語句中使用c的變量最好加上:,這樣強調(diào)說明是c中的變量,以防
3、c中的變量和表中的字段名相同exec sql include sqlca;int main() char userpasswd30=openlab/open123; char var_name25; exec sql connect:userpasswd; exec sql select first_name into :var_name from s_emp where id=1; printf(var_name=%sn,var_name); exec sql commit work release; proc first.pc 得到一個 first.c 1.寫源代碼 vi first.pc
4、 2.如果本地有 proc 則把 first.pc 預(yù)編譯成 first.c proc first.pc 如果本地沒有proc 就把first.pc 上傳到服務(wù)器 3.在服務(wù)器上 編譯鏈接 gcc *.c -lclntsh 4.執(zhí)行/*寫一個proc程序 把s_emp 表中的id=1的first_name salary 查詢出來放入c的變量中 然后輸出這些信息*/ #include exec sql include sqlca; int main() char userpwd30=openlab/open123; char var_name25; double var_salary; int
5、id=2; exec sql connect:userpwd; exec sql select first_name,salary into :var_name,:var_salary from s_emp where id=:id; printf(%s:%lfn,var_name,var_salary); exec sql commit work release; 如何把proc程序 改成 proc+程序? #include using namespace std; exec sql include sqlca; int main() exec sql begin declare secti
6、on; char userpwd30=openlab/open123; char var_name25; double var_salary; int id=2; exec sql end declare section; exec sql connect:userpwd; exec sql select first_name,salary into :var_name,:var_salary from s_emp where id=:id; coutvar_name:var_salary0 截斷賦值 盡量避免指示變量只能是 short類型select first_name into :var
7、_name indicator:indname from s_emp wher id=1;select first_name into :var_name :indname from s_emp wher id=1; #include exec sql include sqlca;int main() exec sql begin declare section; char userpwd30=openlab/open123; /*定義一個指示器 指示manager_id的賦值狀態(tài)*/ short indmid=0; int mid=10000;exec sql end declare sec
8、tion;exec sql connect:userpwd; exec sql select manager_id into :mid:indmid from s_emp where id=1; printf(mid=%d,indmid=%hdn,mid,indmid);exec sql commit work release;-【數(shù)組變量:】 1.只支持一維數(shù)組(字符除外) 2.不支持數(shù)組指針 3.數(shù)量受限制 在select語句中 使用數(shù)組變量 只需要給出 :數(shù)組名 不能給下標.s_emp表中所有manager_id和first_name分別放入數(shù)組中并且指示manager_id的賦值狀態(tài)
9、int mids50; char names5030; short indmids50; short indnames50; #include exec sql include sqlca; int main() exec sql begin declare section; char userpwd30=openlab/open123; int mids50; short indmids50;names的復(fù)制狀態(tài)mids的復(fù)制狀態(tài) char names5030; short indnames50; exec sql end declare section; exec sql connect:
10、userpwd; exec sql select manager_id,first_name into :mids:indmids,:names:indnames from s_emp; int i=0; for(i=0;i0 異常發(fā)生 0 系統(tǒng)錯誤 或者 網(wǎng)絡(luò)錯誤 sqlca.sqlerrm.sqlerrmc 當sql執(zhí)行出錯 可以得到錯誤的消息內(nèi)容其它字段 系統(tǒng)保留(0,1,3,5)(2和4有用)sqlca 是每個事務(wù)中維護的一個結(jié)構(gòu)體,同一事務(wù)中的sql 執(zhí)行完以后要立即使用sqlca中的字段狀態(tài) 否則會被下一條sql的狀態(tài)覆蓋掉.#include exec sql include sq
11、lca;int main() exec sql begin declare section; char userpwd30=openlab/open123; int mids50;short indmids50; char names5030; short indnames50;exec sql end declare section;exec sql connect:userpwd;if(sqlca.sqlcode=0) printf(connect db success!n); exec sql select manager_id,first_name into :mids:indmids
12、,:names:indnames from s_emp;if(sqlca.sqlcode=0) printf(select db successn); else printf(%sn,sqlca.sqlerrm.sqlerrmc); int i=0; for(i=0;isqlca.sqlerrd2;i+) printf(%d:%hd,%s:%hdn, midsi,indmidsi,namesi,indnamesi); exec sql commit work release;-【oraca】 也是一個通信區(qū) 是對sqlca信息的補充. 可以從oraca得到執(zhí)行的sql語句 oraca 非常消耗
13、系統(tǒng)資源 默認是關(guān)閉的1.如何包含oraca exec sql include oraca;2.打開oraca exec oracle option(oraca=yes);3.設(shè)置sql的保存標志 oraca.orastxtf = 0 默認的不保存sql 1 當sql出錯時保存 2 當出現(xiàn)警告 或者出錯時保存 3 都保存sql4.如何得到sql文本 oraca.orastxt.orastxtc #include exec sql include sqlca; exec sql include oraca; exec oracle option(oraca=yes); int main() or
14、aca.orastxtf=3; exec sql begin declare section; char userpwd30=openlab/open123; char var_name30; int var_id=2; exec sql end declare section; exec sql connect:userpwd; exec sql select first_name into :var_name from s_emp where id=:var_id; printf(%sn,oraca.orastxt.orastxtc); exec sql commit work relea
15、se; -proc 最簡單 最重要 proc中如何嵌入sql 1.嵌入 select 語句 exec sql select id,first_name into :var_id,:var_name from s_emp where id=1; 2.dml tcl ddl 在前面加exec sql 即可 ddl 中不能有宿主變量 3.proc 中如何嵌入plsql#include exec sql include sqlca;int main() exec sql begin declare section; char userpwd30=openlab/open123; int id=1;ch
16、ar name30=openlab;exec sql end declare section;exec sql connect:userpwd; /* ddl(不能用宿主變量) */ exec sql create table cmhtt(id number primary key, name varchar2(30); /* dml */ exec sql insert into cmhtt values( :id , :name); /* tcl */ exec sql commit; exec sql commit work release;復(fù)習(xí)一下如何寫一個proc程序 1.編寫pc源
17、代碼 vi *.pc 2.把pc 變成 c 文件 proc *.pc 3.編譯鏈接 gcc *.c -lclntsh 4.執(zhí)行 ./a.out如何寫proc+ 程序 proc 的預(yù)編譯選項 include iname oname *.cpp parse none code cpp 宿主變量放入申明區(qū) exec sql begin declare section; /*變量申明*/ exec sql end declare section; proc *.pc oname=*.cpp parse=none code=cpp g+ *.cpp -lclntsh宿主變量: 既能在sql 語句中使用
18、又能在宿主變量中使用 宿主變量的類型: char char varn 定長 short int long float double varchar varn 變長變長字符串的處理 1.varchar varchar var_namen=0; 在sql語句中正常使用 var_name.arr; 2.char_map =charz 默認 定長 0 空格補齊 charf|varchar2 定長 空格補齊 string 變長 0結(jié)尾宿主變量注意事項: 1.推薦把宿主變量放入申明區(qū) 2.可以使用指針 3.ddl 中不能有宿主變量-指示變量:反映數(shù)據(jù)庫中的字段值賦值給宿主變量時賦值的狀態(tài)可以通過指示變量顯
19、示出來 =0 正常 =-1 NULL 0 截斷賦值 /應(yīng)該避免指示變量必須是short select 字段 into :宿主變量:指示變量-數(shù)組變量: (指示變量數(shù)組) 1.支持一維數(shù)組 字符除外 2.不支持數(shù)組指針 3.最大個數(shù) 32767select 語句中只需要給出數(shù)組名 不能給下標-遍歷數(shù)組 sqlca.sqlerrd2通信區(qū) sqlca.sqlcodesqlca.sqlerrm.sqlerrmc-oraca 通信區(qū) 1.包含 oraca exec sql include oraca; 2.打開oraca exec oracle option(oraca=yes); 3.設(shè)置sql保存
20、標志 oraca.orastxtf 0 1 2 3 4.得到sql oraca.orastxt.orastxtc (占位符)開始新知識了-proc 中如何嵌入sql語句 1.select exec sql select 字段 into :宿主變量 from 表 where 條件; 2.ddl dml tcl 前面加 exec sql 即可 ddl 不能有宿主變量 dml 可以使用宿主變量 3.proc 中如何嵌入plsql sqlcheck=semantics userid=用戶/密碼 c 中嵌入存儲過程 exec sql execute begin /*這里可以使用宿主變量調(diào)用存儲
21、過程*/ (這里的宿主變量要加:,因為這里的代碼更偏向plsql) end; end-exec; 寫一個存儲過程 準備調(diào)用 存儲過程中傳入兩個整數(shù)參數(shù) 把兩個參數(shù)的和 放入第二個參數(shù)中 然后在proc 中調(diào)用這個存儲過程 驗證存儲過程的功能. create or replace procedure getsum(var_x in number,var_y in out number) is begin var_y:=var_y+var_x; end;#include exec sql include sqlca;int main() exec sql begin declare section
22、; char userpasswd30=openlab/open123;int var_y=10000; exec sql end declare section; exec sql connect:userpasswd;exec sql execute調(diào)用存儲過程,宿主變量使用最好加上冒號 begin getsum(2000,:var_y); end; end-exec; printf(var_y=%dn,var_y);exec sql commit work release;proc *.pc sqlcheck=semantics userid=openlab/open123-寫一個函數(shù)
23、傳入兩個整數(shù)參數(shù) 返回兩個整數(shù)參數(shù)的最大值 并且把兩個參數(shù)的和 放入第二個參數(shù)中。寫一個proc程序驗證這個函數(shù)的功能。exec sql execute begin end;end-exec;create or replace function getMaxAndSum(var_x in number,var_y in out number)return number is var_temp number;begin var_temp:=var_y; var_y:=var_x+var_y; if var_tempvar_x then return var_x; end if; return v
24、ar_temp;end;#include exec sql include sqlca;int main() exec sql begin declare section; char userpasswd30=openlab/open123; int var_x=1;int var_y=10000; int var_res=0; exec sql end declare section; exec sql connect:userpasswd;exec sql execute begin :var_res:=getMaxAndSum(:var_x,:var_y); end; end-exec;
25、 printf(var_y=%dn,var_y);printf(var_max=%dn,var_res);exec sql commit work release;-數(shù)據(jù)庫的連接 exec sql connect:userpasswd; exec sql connect:username identified by userpasswd; 本地連接.【數(shù)據(jù)庫的遠程連接:】1.數(shù)據(jù)庫鏈的方式 遠程數(shù)據(jù)庫連接 都和 $ORACLE_HOME/network/admin/tnsnames.ora CAH_6 = (DESCRIPTION = (ADDRESS_LIST = (A
26、DDRESS = (PROTOCOL = TCP)(HOST = 6)(PORT = 1521) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = tarena) ) )SERVICE_NAME 如何得到服務(wù)名echo $ORACLE_SID在6 建立和23的橋create database link my23linkconnect to openlab identified by open123using (DESCRIPTION = (ADDRESS_LIST = (ADDRESS =
27、(PROTOCOL = TCP)(HOST = 3)(PORT = 1521) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = tarena10g) ) ) ; windows 下 開發(fā)proc程序 1.編寫proc代碼 2.預(yù)編譯 proc mremotedb.pc 3.編譯鏈接 gcc mremotedb.c -lorasql10 -LE:oracleproduct10.1.0Db_1BIN 4. a.exe 必須在數(shù)據(jù)庫中建立好 數(shù)據(jù)庫鏈接 然后在做數(shù)據(jù)庫操作時 要求先連接數(shù)據(jù)庫 才能使用鏈接 2.第二種
28、連接遠程數(shù)據(jù)庫 using 區(qū)分不同的數(shù)據(jù)庫描述 區(qū)分數(shù)據(jù)庫的連接 -at (貼標簽) exec sql connect:userpasswd; exec sql connect:userpasswd using :rdb1; exec sql connect:userpasswd using :rdb2; 為了區(qū)分數(shù)據(jù)庫的連接 at exec sql connect:userpasswd at :lab1; exec sql connect:userpasswd at :lab2 using :rdb1; exec sql connect:userpasswd at :lab3 using
29、:rdb2; exec sql at:lab2 select .; exec sql at:lab1 update .; exec sql at:lab3 delete .; exec sql at:lab2 commit; exec sql at:lab1 commit work release; exec sql at:lab2 commit work release; exec sql at:lab3 commit work release;#include exec sql include sqlca;int main() exec sql begin declare section;
30、 char userpasswd30=openlab/open123;char localuserpass30=openlab/open123;char rdb20=CAH_6;char var_name30;double salary;exec sql end declare section;exec sql connect:userpasswd using :rdb; /直接和遠程數(shù)據(jù)庫連接 exec sql select first_name,salary into:var_name,:salary from s_emp where id=1; printf(rdb
31、 var_name=%s,salary=%lf, var_name,salary); exec sql commit work release;-#include exec sql include sqlca;int main() exec sql begin declare section; char userpasswd30=openlab/open123;char localuserpass30=openlab/open123;char rdb20=CAH_6;char var_name30;char locallab20=db23;char rdblab20=db
32、26;double salary;用at來區(qū)分數(shù)據(jù)庫的連接exec sql end declare section;exec sql connect:userpasswd at :rdblab using :rdb;exec sql connect:localuserpass at :locallab; exec sql at:rdblab select first_name,salary into :var_name,:salary from s_emp where id=1; printf(rdb var_name=%s,salary=%lfn,var_name,salary); exec
33、 sql at:locallab select first_name,salary into :var_name,:salary from s_emp where id=1; printf(localdb var_name=%s,salary=%lfn, var_name,salary); exec sql at:locallab commit work release;exec sql at:rdblab commit work release;-proc 中的錯誤處理 exec sql whenever 條件 動作; 條件:sqlerror notfound sqlwarning 動作:
34、do 錯誤處理函數(shù)(自己寫的); do break; continue; goto stop #include exec sql include sqlca;void processError()exec sql whenever sqlerror continue; printf(%sn,sqlca.sqlerrm.sqlerrmc);void processNotFound() printf(%sn,sqlca.sqlerrm.sqlerrmc);int main() exec sql begin declare section; char userpasswd30=openlab/ope
35、n123; char var_name30;exec sql end declare section; exec sql whenever notfound do processNotFound();exec sql whenever sqlerror do processError();exec sql connect:userpasswd;exec sql select first_name into :var_name from s_emp where id=-1; exec sql drop table s_emp; printf(app continue!n);exec sql co
36、mmit work release;-數(shù)據(jù)的存取與更新 1.使用單個變量 操作單行單列exec sql select first_name into :var_name from s_emp where id=1; 2.使用多個變量 操作單行 多列exec sql select first_name,salary into :var_name,:salary from s_emp where id=1; 3.把多個變量包裝成結(jié)構(gòu)體 proc 中可以在任何位置定義結(jié)構(gòu)體proc+ 結(jié)構(gòu)體的定義必須放在申明區(qū) #include exec sql include sqlca;int main() e
37、xec sql begin declare section; char userpasswd30=openlab/open123; struct int id;char first_name30;double salary;emp;exec sql end declare section; exec sql connect:userpasswd; exec sql select id,first_name,salary into :emp from s_emp where id=1; printf(%d:%s:%lfn,emp.id, emp.first_name,emp.salary); e
38、xec sql commit work release; 4.數(shù)組變量 操作多行多列把s_emp 表所有的id first_name salary 放入一個結(jié)構(gòu)體數(shù)組中. 如果數(shù)組中的數(shù)組是滿的 全部都要進入數(shù)據(jù)庫 exec sql insert into tablename values(:數(shù)組名); 當數(shù)組數(shù)據(jù)不滿時 int countloop=sqlca.sqlerrd2; int i=0; for(i=0;icountloop;i+) exec sql insert into testemp values(:datasi); exec sql commit;#include exec sql include sqlca;int main() exec sql begin declare section; char userpasswd30=openlab/open123; struct emp int id;char first_name30;double salary; struct emp datas50;exec sql end declare section; exec sql connect:userpasswd; exec sql select id,first_name,s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 知到智慧樹網(wǎng)課《中國傳統(tǒng)文化專題選講》章節(jié)測試滿分答案
- 2024版專用:加氣站CNG運輸安全合同3篇
- 2024版物保擔(dān)保合同范本
- 2024正規(guī)軌道交通設(shè)備轉(zhuǎn)讓及維修服務(wù)協(xié)議書3篇
- 2025年度股權(quán)投資與經(jīng)營權(quán)轉(zhuǎn)讓合同3篇
- 2024銅門制安工程知識產(chǎn)權(quán)保護合同
- 2025年度消防安全應(yīng)急物資儲備與配送消防勞務(wù)合同集錦3篇
- 2024年貨物運輸協(xié)議條款集錦版
- 2025年度私人二手商鋪買賣合同模板(含裝修移交)3篇
- 2024年飯店業(yè)務(wù)運營權(quán)承包合同書版B版
- 工作總結(jié)中的不足之處
- 城市軌道交通安全防范系統(tǒng)技術(shù)要求
- 電科院:儲能構(gòu)網(wǎng)控制及并網(wǎng)測試
- 廣東省初級中學(xué)學(xué)生學(xué)籍表
- 生鮮超市供貨超市供貨服務(wù)方案
- 銀行營銷拆遷戶活動方案
- 25道長江存儲固件工程師崗位常見面試問題含HR常問問題考察點及參考回答
- 《交通規(guī)劃原理》課件
- 警察急救能力培訓(xùn)課件模板
- 倍加福-KFU8-UFC-信號隔離或轉(zhuǎn)換模塊中文操作指導(dǎo)
- 2024年意識形態(tài)工作專題會議記錄【6篇】
評論
0/150
提交評論