2014-01-08 10 views
0

我從來沒有與Oracle合作過,而且我通常只使用標準的SQL功能。如何從Oracle存儲過程使用C++函數

我有一個C++共享庫,我用GCC 4.2.4編譯,我需要從Oracle存儲過程中調用它的功能。

我可以直接使用共享庫嗎?或者我必須使用某些特殊標籤來構建它?

我是否必須在oracle中創建一個函數或特殊的東西來實際調用C++代碼?

如何映射類型?我需要做一些編組嗎?

+1

是的,可以做到。自從我與甲骨文合作多年以來,我認爲vershov提供了正確的鏈接。有一件事要注意的是,如果你打算一遍又一遍地調用這個例程,由於調用外部代碼所涉及的開銷,整體可能會非常慢。有時候這是必要的,儘管如此。 – Matt

回答

1

長話短說。 Oracle不允許你訪問它的地址空間。 C存儲過程與MySQL和PostgreSQL中的不同。你必須:

  • 創建一個共享庫,Oracle客戶端庫鏈接,並使用CREATE LIBRARY
  • 配置監聽器註冊。 Oracle監聽器將產生稱爲extproc(或extproc32)的特殊進程。該過程將加載您的共享庫,並通過IPC與其餘的Oracle進行通信。
  • 每次打補丁甲骨文上一次你也應該開始重新鏈接共享庫

最好的地方是Oracle服務器的安裝,含有C OCI樣本。在那裏你會找到一個這樣的共享庫的骨架,還有一個將編譯它的Makefile

+0

當你說把它與Oracle鏈接起來時,你的意思是我必須使用CC構建它並在我的代碼中添加一些Oracle庫嗎?另外我有一個C++ SharedLibrary,而不是C,它的工作原理是否相同? – Dzyann

+0

恐怕你已經爲你的C++庫創建了一個C包裝庫,並將這個庫鏈接到OCI庫。您還需要此OCI庫進行數據類型轉換(int <=> OCINumber,std :: string <=> VARVHAR2) – ibre5041