急!OCCI 调用嵌套表参数的存储过程。
参照的例子:
CREATE OR REPLACE PROCEDURE Sample_proc(
strTblTitle VARCHAR2_TABLE,
strTblContent VARCHAR2_TABLE) AS
BEGIN
FORALL i IN strTblTitle.FIRST..strTblTitle.LAST SAVE EXCEPTIONS
INSERT INTO Sample_Table(
title,
content)
VALUES(
strTblTitle(i),
strTblContent(i));
-- No "LOOP" or "END LOOP"
-- if you want to commit here
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Number of errors : '||SQL%BULK_EXCEPTIONS.COUNT);
FOR i IN 1..SQL%BULK_EXCEPTIONS.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('Error ' || i || ' occurred during '|| 'iteration ' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);
DBMS_OUTPUT.PUT_LINE('Oracle error is ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
END LOOP;
END Sample_proc;
/
For the C++ side, you would do something like :
vector<string> strArrTitle;
strArrTitle.push_back("1st title");
strArrTitle.push_back("2nd title");
strArrTitle.push_back("3rd title");
vector<string> strArrContent;
strArrContent.push_back("1st content");
strArrContent.push_back("2nd content");
strArrContent.push_back("3rd content");
stmt = conn->createStatement("BEGIN Sample_proc(:1, :2); END;");
setVector(stmt,1,strArrTitle,"VARCHAR2_TABLE");
setVector(stmt,2,strArrContent,"VARCHAR2_TABLE");
// PLSQL procedures must be called via an executeUpdate()
stmt->executeUpdate();
create or replace package pkg_test_bulk_insert is
type i_table is table of integer;
type v_table is table of varchar2(400);
type date_table is table of date;
procedure SP_BULK_INSERT(p_tablename varchar2,
co1 i_table);
end pkg_test_bulk_insert;
create or replace package body pkg_test_bulk_insert is
procedure SP_BULK_INSERT(p_tablename varchar2,
co1 i_table) is
i integer;
begin
forall i in 1 .. co1.count execute immediate
'insert /*+ APPEND */ into ' || p_tablename ||
' values (:co1)' using
co1(i);
exception
when others then
dbms_output.put_line(sqlerrm);
end;
end pkg_test_bulk_insert;
For the C++:
vector<string> strArrTitle;
strArrTitle.push_back("1st title");
strArrTitle.push_back("2nd title");
strArrTitle.push_back("3rd title");
stmt = conn->createStatement("BEGIN pkg_test_bulk_insert.sp_bulk_insert('testtable', :1); END;");
setVector(stmt,1,strArrTitle,"I_TABLE");
// PLSQL procedures must be called via an executeUpdate()
stmt->executeUpdate();
为何提示总找不到i_table 这个类型,看过官方文档说这里是&sqltype,不理解这里应该如何处理呢?
sqlerrm:OCI-22303: type "I_TABLE"
[ 本帖最后由 driftice 于 2008-9-18 12:03 编辑 ]
|