欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

c oracle導出excel

陳怡靜2年前7瀏覽0評論

今天我們來聊一下關于C語言和Oracle如何導出Excel的問題。

通常在業務中需要向用戶提供數據,一種常見的方式就是將數據庫表格的數據,以一定的格式寫到硬盤上的Excel文件中。而對于C語言和Oracle環境,我們可以使用PL/SQL來處理這個問題。

下面我們來看一個實例,假設我們需要導出Oracle中表格“MY_TABLE”中的數據到一個Excel文件中。我們可以使用以下的PL/SQL代碼:

SET feedback OFF; 
SET heading OFF; 
SET pagesize 0; 
SET linesize 32767; 
SET colsep ","; 
SET tab OFF; 
SPOOL /my_file_path/my_file_name.csv; 
SELECT COL_1, COL_2, COL_3 
FROM MY_TABLE; 
SPOOL OFF;

在上面的代碼中,“SET”語句用于設置命令行工具(SQL Plus)的行為方式,而“SPOOL”語句會將輸出結果寫到一個.csv文件中。在我們的例子中,我們可以將這個.csv文件轉換成Excel文件即可。

對于這種方式導出的Excel文件,我們也可以使用C語言來實現,只需要使用system函數來執行上面的PL/SQL代碼,然后再通過使用C語言庫中的相關API,將.csv文件轉換為Excel文件即可。

在C語言中,我們可以使用以下的代碼來執行上面的PL/SQL命令:

char sql[512] = "sqlplus -S user/password@DB< script.sql"; 
system(sql);

在以上的代碼中,“sqlplus”是Oracle的一個客戶端工具,而“-S”參數用于設置靜默模式,避免在輸出結果中出現一些額外的信息。最后,我們再來一段代碼,將.csv文件轉成Excel文件:

#include#include#include#include#includevoid csvToExcel(char* csv_file_name, char* excel_file_name) {
CoInitialize(NULL);
IUnknown* pIUnknown = NULL;
HRESULT result = CoCreateInstance(&CLSID_Application, NULL, CLSCTX_SERVER, &IID_Application, &pIUnknown);
if(!result && pIUnknown) {
IDispatch* pDispatch = NULL;
result = pIUnknown->QueryInterface(IID_Dispatch, (void**)&pDispatch);
if(!result && pDispatch) {
VARIANT varxlFilename;
VariantInit(&varxlFilename);
varxlFilename.vt = VT_BSTR;
char* excelFileName[512];
sprintf(excelFileName, "%s", excel_file_name);
BSTR bstrxlFilename = SysAllocString((OLECHAR*)excelFileName);
varxlFilename.bstrVal = bstrxlFilename;
VARIANT rvt;
VariantInit(&rvt);
VARIANT arg;
VariantInit(&arg);
DISPID dispid;
DISPPARAMS dispParams;
LPOLESTR ptrName;
BSTR bstrText = SysAllocString(L"ConvertTextToColumns");
ptrName = (LPOLESTR)objText;
result = pDispatch->GetIDsOfNames(IID_NULL, &ptrName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(!result) {
dispParams.rgdispidNamedArgs = NULL;
dispParams.cArgs = 2;
VARIANT argv1;
VariantInit(&argv1);
argv1.vt = VT_DISPATCH | VT_BYREF;
argv1.pdispVal = pDispatch;
dispParams.rgvarg[1] = argv1;
VARIANT argv2;
VariantInit(&argv2);
argv2.vt = VT_I4 | VT_BYREF;
dispParams.rgvarg[0] = argv2;
dispParams.rgvarg[0].plVal = (long*)&arg.pdispVal;
dispParams.rgvarg[0].vt=VT_I4 | VT_BYREF;
VARIANTARG args[2];
args[0].vt=VT_BSTR; 
args[0].bstrVal=bstrText;
args[1].vt=VT_I4|VT_BYREF;
args[1].plVal=&lidx;
ptrName = (LPOLESTR)L"CommandText";
result = pDispatch->GetIDsOfNames(IID_NULL, &ptrName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(!result) {
dispParams.rgdispidNamedArgs = NULL;
dispParams.cArgs = 1;
dispParams.rgvarg[0] = args[0];
result = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dispParams, NULL, NULL, NULL);
}
ptrName = (LPOLESTR)L"RecordsAffected";
result = pDispatch->GetIDsOfNames(IID_NULL,&ptrName,1, LOCALE_SYSTEM_DEFAULT,&dispid);
result = pDispatch->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYGET,&dispParams,&rvt,NULL,NULL);
ptrName = (LPOLESTR)L"Execute";
result = pDispatch->GetIDsOfNames(IID_NULL, &ptrName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(!result) {
dispParams.rgdispidNamedArgs = NULL;
dispParams.cArgs = 0;
result = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams, NULL, NULL, NULL);
}
int xlDone = 0;
while (!xlDone) {
ptrName = (LPOLESTR)L"Ready";
result = pDispatch->GetIDsOfNames(IID_NULL, &ptrName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(!result) {
dispParams.rgdispidNamedArgs = NULL;
dispParams.cArgs = 0;
result = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams, NULL, NULL, NULL);
VariantClear(&argv1);
VariantClear(&rvt);
VariantClear(&arg);
VariantClear(&argv2);
}
}
}
pDispatch->Release();
pIUnknown->Release();
}
}
CoUninitialize();
}

至此,我們便完成了從Oracle中導出數據到Excel的過程,相信有了以上的代碼,讀者們也可以按照自己的需求,來實現類似的功能。

下一篇as在oracle