C 使用ocilib訪問oracle的函式

2021-07-11 09:16:30 字數 4781 閱讀 6940

1、oracle中處理

建型別和函式

--建型別

/*這些用於結構操作:

乙個data_table_type資料列表有多條data_type資料,

一條data_type資料有fileinfo_type檔案資訊和seriesinfo_table_type分析項列表資訊

乙個fileinfo_type檔案資訊有num列號,devicename品名,lotid,batchnum批次,enddate測試日期,total總數,pass通過數,binit是否初測等

乙個seriesinfo_table_type分析項列表資訊有多個seriesinfo_type分析項資訊

乙個seriesinfo_type分析項資訊有seriesname分析項,passnum這個分析項的通過數

*/create or replace type seriesinfo_type as object (seriesname varchar2(50),passnum number(10));

--object型別:seriesinfo_type,含有兩個變數seriesname和passnum

/create or replace type seriesinfo_table_type as table of seriesinfo_type;

--table型別:seriesinfo_table_type,是seriesinfo_type的集合

/create or replace type fileinfo_type as object(

num number(10), devicename varchar2(100),

lotid varchar2(100), batchnum varchar2(100),

enddate varchar2(20), total number(10),

pass number(10), binit varchar2(10));

--object型別:fileinfo_type,含有num,devicename,。。。,binit

/create or replace type data_type as object(filedata fileinfo_type,series_array seriesinfo_table_type);

--object型別:data_type,含有fileinfo_type和seriesinfo_table_type

/create or replace type data_table_type as table of data_type;

--table型別:data_type,是data_type的集合

/--建函式

create or replace function select_data return data_table_type as

--選擇資料,返回值是乙個結構體的集合,每個結構體含有fileinfo的一條記錄和這個num對應的seriesinfo表的多條記錄

--定義的自定義型別

v_seriesinfo seriesinfo_type;

v_seriesinfo_table seriesinfo_table_type;

v_fileinfo fileinfo_type;

v_data data_type;

v_data_table data_table_type;--返回值

--定義seriesinfo游標

type seriesinfo_cursor_type is ref cursor;

seriesinfo_cursor seriesinfo_cursor_type;

--定義fileinfo游標

type fileinfo_cursor_type is ref cursor;

fileinfo_cursor fileinfo_cursor_type;

--拼接的seriesinfo sql語句

v_seriesinfo_sql varchar2(200);

begin

v_data_table := data_table_type();

v_data := data_type(null,null);

v_fileinfo := fileinfo_type(null,null,null,null,null,null,null,null);

--建立遍歷fileinfo的游標

open fileinfo_cursor for

select num,devicename,lotid,batchnum,enddate,total,pass,binit from fileinfo order by devicename,lotid,batchnum,enddate;

loop fetch fileinfo_cursor into v_fileinfo.num,v_fileinfo.devicename,v_fileinfo.lotid,

v_fileinfo.batchnum,v_fileinfo.enddate,v_fileinfo.total,v_fileinfo.pass,v_fileinfo.binit;

exit when fileinfo_cursor%notfound;

--dbms_output.put_line('num:'||v_fileinfo.num);

--對於每個num號,建立一條執行seriesinfo的sql語句

v_seriesinfo_sql:='select seriesname,passnum from seriesinfo_'||v_fileinfo.num;

v_seriesinfo_table := seriesinfo_table_type(); --seriesinfo_table_type

v_seriesinfo := seriesinfo_type(null,null);

--建立遍歷這個seriesinfo的游標

open seriesinfo_cursor for v_seriesinfo_sql;

loop fetch seriesinfo_cursor into v_seriesinfo.seriesname,v_seriesinfo.passnum;

exit when seriesinfo_cursor%notfound;

v_seriesinfo_table.extend;

v_seriesinfo_table(v_seriesinfo_table.count) := seriesinfo_type(v_seriesinfo.seriesname,v_seriesinfo.passnum);

--dbms_output.put_line('----seriesname:'||v_seriesinfo.seriesname||',passnum:'||v_seriesinfo.passnum);

end loop;

close seriesinfo_cursor;

v_data_table.extend;

v_data_table(v_data_table.count) := data_type(v_fileinfo,v_seriesinfo_table);

--exit;--暫時只需執行一次

end loop;

close fileinfo_cursor;

return v_data_table;

end;

/

2、c++中處理

c++中資料型別

struct descinfo //檔案的具體描述資訊, 是檔案資訊的乙個子集

};using measurelist = std::vector;//乙個批次裡面的多次測量列表

using batchmap = std::map;//批次map

using lotmap = std::map;//lot的map

using devicemap = std::map;//品名的map

呼叫oracle函式

devicemap readhistoryinfo(const ocilib::connection &con)

); }

////處理資料

/**演算法描述:對於按照devicename,lotid,batchnum,enddate排好序的資料記錄來講

*如果上一次的品名和這次的品名一樣

* 如果上一次的lot號和這次的lot號一樣

* 如果上一次的批次和這次的批次一樣

* 在這次的批次上插入測試列表

* 否則,新增這個批次(含測試列表)

* 否則,新增這個lot號(含批次)

*否則,新增這個品名(含lot號)

*注意結合predevicename、prelotid、prebatch這幾個變數來處理,

*這幾個變數的修改也要注意)

*///構建臨時的容器

measurelist tmpmeasurelist();

batchmap tmpbatchmap; tmpbatchmap.insert();

lotmap tmplotmap; tmplotmap.insert();

//判斷上一次是不是這個品名

if (predevicename == tmpdevicename)//上一次也是這個品名

else//上一次不是這個批次

} else//上一次不是這個lotid

}else//上一次不是這個品名

}} catch (std::exception &ex)

return currdevicemap;

}

C 使用 OCILIB 連線 Oracle

include include ocilib.h 錯誤處理 void err handler oci error err int main int argc,char argv doprintf server major version i n oci getservermajorversion c...

在windows下使用ocilib

1.編譯客戶程式時,用法,詳見原始碼中readme文件。add ocilib include folder to your compiler includes path add ocilib lib folder to your linker library path for mingw only,...

sql server 儲存過程內訪問Oracle

1.sp addlinkedserver 建立鏈結伺服器 http msdn.microsoft.com zh cn library ms190479.aspx exec sp addlinkedserver server servername or server ip,srvproduct ora...