1. 程式人生 > >C++完畢Oracle存儲過程批量插入(二)

C++完畢Oracle存儲過程批量插入(二)

con 地址 tco ref path ava nload 能夠 table

上篇文章簡單的介紹了一下oracle參數是Object類型的數據庫存儲過程,以及JAVA使用JDBC去調用該類的存儲過程的方法。

可是我須要的是C++下的方案。使用Poco庫未發現不論什麽能夠調用該類型存儲過程的方法,可是功能還是須要實現的,後來發現Oracle支持XML的解析,於是有了以下的方案。即存儲過程的參數為CLOB類型,C++依照傳入XML格式字符串的方式調用存儲過程,在存儲過程中解析xml後。將數據插入數據庫中。

(有了上述的方案後,我猜想JDBC的處理方式可能也是往Oracle數據庫中傳入XML格式的字符串,Oracle內部能夠實現XML到Object對象的轉換,最後往存儲過程中傳入該Object參數)

以下為該方案的主要代碼:

1)Oracle存儲過程

create or replace procedure POCO_TEST_XML_CLOB_PRO(v_xml in CLOB) is
begin
  INSERT INTO POCO_TEST(ID,name,code)
  SELECT * FROM XMLTABLE(‘$B/Parment/PocoTest‘ PASSING
    XMLTYPE(v_xml) AS B
    COLUMNS ID VARCHAR2(50) PATH
    ‘/PocoTest/ID‘,
    NAME VARCHAR2(50) PATH
    ‘/PocoTest/Name‘,
    CODE VARCHAR2(50) PATH
    ‘/PocoTest/Code‘);
end POCO_TEST_XML_CLOB_PRO;

2)C++代碼的調用

	std::string str;
	ODBCObject::getCollectionXmlStr(str,arr);
	Poco::Data::CLOB clob(str.c_str(),str.size());
	session << "{call POCO_TEST_XML_CLOB_PRO(?)}", Poco::Data::Keywords::in(clob),  Poco::Data::Keywords::now;


這裏是完整project代碼的下載地址。



C++完畢Oracle存儲過程批量插入(二)