ODCITableDescribe not picking up parameters
Date: Tue, 3 Apr 2012 15:01:09 -0700 (PDT)
Message-ID: <10232227.2576.1333490469304.JavaMail.geo-discussion-forums_at_yncd8>
I'm attempting to implement the ODCITable interface to build a interfaced pipeline function. When I go to call my code from a query, the parameters I am passing the pipelined function are all being passed into the ODCITable* functions as null values.
Essentially, what I am trying to do is be able to do this:
select *
from table(some_package.show(id1 = 12, id2 = 1234));
and have it return the resultset back as an abstract table. I have the code to make parse the query and build it, but my parameters are being pass as nulls.
I've attached a simpele type_test object to try and illustrate what I'm doing. Any help would be appreciated.
create or replace type type_test as object (
- Author : MATT_MACARI
- Created : 4/3/2012 12:26:29 PM
- Purpose : Tests the ODCI Interface
l_param number,
rtype sys.anytype,
rows_requested number,
static function ODCITableDescribe(rtype out anytype,
l_param in number default 1, row_param in number default 12) return number, static function ODCITableStart(sctx in out type_test, l_param in number, row_param in number) return number, member function ODCITableFetch(self in out type_test, nrows in number, rws out anydataset) return number,
member function ODCITableClose(self in type_test) return number,
static function ODCITablePrepare(sctx out type_test,
tf_info sys.odcitabfuncinfo, l_param in number, row_param in number) return number,
static function show(l_param in number default 12, row_param in number default 123) return anydataset pipelined using type_test
)/
create or replace type body type_test is
static function ODCITableDescribe(rtype out anytype,
l_param in number := 1, row_param in number := 12) return number is v_rtype sys.anytype; v_param number;begin
v_param := l_param; anytype.BeginCreate(typecode => dbms_types.typecode_object, atype => v_rtype); if v_param is not null or row_param is not null then v_rtype.AddAttr('type_test_success_' || v_param, dbms_types.typecode_varchar2, null, null, 50, null, null); dbms_output.put_line('success'); else v_rtype.AddAttr('type_test_failure', dbms_types.typecode_varchar2, null, null, 50, null, null); dbms_output.put_line('failure' || ' ' || l_param || ' ' || v_param); end if; v_rtype.endcreate; anytype.begincreate(dbms_types.typecode_table, rtype); rtype.setinfo(null, null, null, null, null, v_rtype, dbms_types.typecode_object, 0); rtype.endcreate(); return odciconst.success;
end;
static function ODCITablePrepare(sctx out type_test,
tf_info sys.odcitabfuncinfo, l_param in number, row_param in number) return number is elem_type sys.anytype; prec pls_integer; scale pls_integer; len pls_integer; csid pls_integer; csfrm pls_integer; tc pls_integer; aname varchar2(30); begin tc := tf_info.rettype.GetAttrElemInfo(1, prec, scale, len, csid, csfrm, elem_type, aname); sctx := type_test(l_param, elem_type, row_param); return odciconst.success;
end;
static function ODCITableStart(sctx in out type_test,
l_param in number, row_param in number) return number is begin return odciconst.success;end;
member function ODCITableFetch(self in out type_test,
nrows in number, rws out anydataset) return number is begin anydataset.begincreate(dbms_types.typecode_object, self.rtype, rws); for i in 1 .. nvl(self.rows_requested, 23) loop rws.addinstance; rws.piecewise(); if l_param is not null then rws.setvarchar2(to_char(i) || ' ' || l_param); else rws.setvarchar2(to_char(i) || ' Failure.'); end if; end loop; self.rows_requested := 0; rws.endcreate; return odciconst.success;
end;
member function ODCITableClose(self in type_test) return number is
t_id number;
begin
return odciconst.success;
select object_id
into t_id
from user_objects
where object_name = 'TYPE_TEST'
and object_type = 'TYPE BODY';
dbms_utility.invalidate(t_id);
end;
end;
/
Received on Tue Apr 03 2012 - 17:01:09 CDT