ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » 急!OCCI 调用嵌套表参数的存储过程。

标题: 急!OCCI 调用嵌套表参数的存储过程。
离线 driftice
仗剑折花


精华贴数 0
个人空间 0
技术积分 190 (9996)
社区积分 0 (916737)
注册日期 2007-1-22
论坛徽章:0
      
      

发表于 2008-9-18 11:56 
急!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 编辑 ]


__________________
浪子无宿随风去,仗剑折花伴雨行。
只看该作者    顶部
离线 driftice
仗剑折花


精华贴数 0
个人空间 0
技术积分 190 (9996)
社区积分 0 (916737)
注册日期 2007-1-22
论坛徽章:0
      
      

发表于 2008-9-18 13:05 
回复 #1 driftice 的帖子

已解决:create or replace type i_tabe as table of integer;
但是奇怪为什么在包类定义的类型在OCCI不能用。

[ 本帖最后由 driftice 于 2008-9-18 14:52 编辑 ]


__________________
浪子无宿随风去,仗剑折花伴雨行。
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问