下面这个方法的返回值mytabletype在那里定义啊?
create   or   replace   function   testrerecordnotabname   (tableid   in   number)   
           return   mytabletype
定义就是下面的,这个定义放哪里啊?放在方法的头上吗???
create   or   replace   type   myobjectype   as   object   (x   int,y   date,z   varchar2(50));    
create   or   replace   type   mytabletype   as   table   of   myobjectype   
还有我有一个过程想接受这个方法返回的type类型,并且传递到客户端
create or replace procedure proc1(   
tablenn OUT type)   
)as  
begin
tablenn :=testrerecordnotabname(2);
end;
这个代码好像不行,请高手指教!

解决方案 »

  1.   

    自定义类型也是oracle的数据库对象,函数可以直接select 你可以在过程中先定义个该类型的变量temp,然后
    select testrerecordnotabname(2) into temp from dual;
      

  2.   

    下面这个方法的返回值mytabletype在那里定义啊? 
    create  or  replace  function  testrerecordnotabname  (tableid  in  number)  
              return  mytabletype 
    定义就是下面的,这个定义放哪里啊?放在方法的头上吗??? 
    create  or  replace  type  myobjectype  as  object  (x  int,y  date,z  varchar2(50));    
    create  or  replace  type  mytabletype  as  table  of  myobjectype  定义的类型myobjectype和mytabletype放在你自定义的包中。create or replace package my_package is
    create  or  replace  type  myobjectype  as  object  (x  int,y  date,z  varchar2(50)); 
    create  or  replace  type  mytabletype  as  table  of  myobjectype
    end;
    还有我有一个过程想接受这个方法返回的type类型,并且传递到客户端 
    create or replace procedure proc1(  
    tablenn OUT type)  
    )as  
    begin 
    tablenn :=testrerecordnotabname(2); --因为你的testrerecordnotabname返回的是一个包含myobjectype对象的一个表,所以你可以在这里输出该表中的所有字段值。
    for i in 1..tablenn.count loop
    dbms_output.put_line(tablenn(i).x);
    dbms_output.put_line(tablenn(i).y);
    dbms_output.put_line(tablenn(i).z);
    end loop;
    end; 
    你说的tablenn这个传递到客户端是怎么回事?你指的是在java或c中获取这个自定义的表中的所有object吗?
      

  3.   


    SQL> create  or  replace  type  myobjectype  as  object  (x  int,y  date,z  varchar2(50));
      2  /类型已创建。SQL> create  or  replace  type  mytabletype  as  table  of  myobjectype;
      2  /类型已创建。SQL> create  or  replace  function  testrerecordnotabname  (tableid  in  number)
      2            return  mytabletype
      3  is
      4  v_mt mytabletype;
      5  begin
      6       v_mt := mytabletype();
      7       v_mt.extend;
      8       v_mt(1) :=myobjectype(tableid,sysdate,'100');
      9       return v_mt;
     10  end;
     11  /函数已创建。SQL>
    SQL> create or replace procedure proc1(
      2  tablenn OUT mytabletype
      3  )as
      4  begin
      5  tablenn :=testrerecordnotabname(2);
      6  end;
      7  /过程已创建。SQL>
    SQL> declare t mytabletype;
      2  begin
      3     proc1(t);
      4     DBMS_OUTPUT.PUT_LINE(t(1).x);
      5     DBMS_OUTPUT.PUT_LINE(t(1).y);
      6     DBMS_OUTPUT.PUT_LINE(t(1).z);
      7  end;
      8  /
    2
    24-1月 -10
    100PL/SQL 过程已成功完成。SQL>
      

  4.   


    类型定义应该放到方法得外边。先定义后使用。接收返回值得形式就和你写得一样。记得tablenn 得类型要和testrerecordnotabname函数返回得类型一致。
      

  5.   

    这个过程最终是在vbs里面调的!!
    OraDataBase.Parameters("P_CURSOR").ServerType = 102
        Set OraSqlStmt = OraDatabase.CreateSQL("Begin proc1(:P_CURSOR); end;",2)
        Set OraDynaset = OraDatabase.Parameters("P_CURSOR").value
    这里的ServerType =102是指游标,如果是自定义类型是多少啊?
      

  6.   

    create or replace procedure proc1(  
    tablenn OUT mytabletype)  
      

  7.   

    这个要看VBS是否支持了。你可以去看
     OraDataBase.Parameters("P_CURSOR").ServerType
    里面是否有自定义类型的对应值。
      

  8.   

    返回值mytabletype:定义在参数,并标志为out。
    游标定义在begin前