将oracle查询转换为pl / sql中的用户定义类型

时间:2010-06-30 14:19:44

标签: oracle plsql odp.net

我在plsql过程中对关系表有一个select查询。

我想将此查询的结果转换为用户定义的类型对象,以通过odp.net返回。

我将如何做到这一点?

1 个答案:

答案 0 :(得分:5)

(这是我今天发表的另一篇文章) 这是一个关于入门的演练:http://www.oracle.com/technology/obe/hol08/dotnet/udt/udt_otn.htm

虽然这稍微详细一点:http://download.oracle.com/docs/html/E10927_01/featUDTs.htm

但真正的肉类和在Samples目录中安装ODP后,您的计算机上已经安装了土豆:%ORA_HOME%\ product \ 11.1.0 \ client_1 \ odp.net \ samples \ 2.x \ UDT

但pl / sql方面的东西:

首先创建单例udt以一次处理一行

 CREATE TYPE TESTTYPE IS OBJECT(COLA VARCHAR2(50) , COLB NUMBER(10) );
 create or replace procedure GetTestType(lTestType OUT NOCOPY TESTTYPE)
 IS
  BEGIN
     SELECT TESTTYPE('ValA',123) 
       INTO LTESTTYPE
       FROM DUAL ;
  END GetTestType ;

按照上述链接中的说明获取.net端insynch

现在收集:

CREATE TYPE TESTTYPETABLE IS TABLE OF TESTTYPE ;

CREATE OR REPLACE PROCEDURE GETTESTTYPETABLE(lTestTypeTable OUT NOCOPY TestTypeTable)
 IS
  BEGIN
     SELECT TESTTYPE(COLA,COLB)
               bulk collect INTO lTestTypeTable
         FROM (
             SELECT 'ValA' COLA ,123 COLB
               FROM DUAL
               UNION
             SELECT 'ValB' COLA ,234 COLB
               FROM DUAL
               UNION
             SELECT 'Valc' COLA ,456 COLB
               FROM DUAL
         ) ;

END GETTESTTYPETABLe;

然后在.net方面,这将有效地成为TESTTYPE()

的值

现在为了省时间你可以在INSERT / UPDATE / DELETES上使用RETURNING子句 就这样

create table testTable (colA varchar2(50) , colB number(10) );
CREATE SEQUENCE TESTSEQ START WITH 1 NOCACHE;

DECLARE
lTestTypeTable TestTypeTable ; 
BEGIN
    UPDATE TESTTABLE
      SET
      COLA = '1' ,
      COLB = 'a'
    WHERE COLA IS NULL
     RETURNING TESTTYPE(COLA,COLB)  --NOTE IF YOU HAVE ONE ROW YOU MAY DROP THE BULK COLLECT AND PUT IT INTO THE SINGLE ROW TYPE
     BULK COLLECT INTO
     lTestTypeTable
     ;
END ; 
/



DECLARE
lTestType TestType; 
BEGIN
    INSERT INTO TESTTABLE(COLA, COLB)
    VALUES ('BBB' , testSeq.NEXTVAL )  
     RETURNING TESTTYPE(COLA,COLB)
     INTO
     lTestType
     ;

     DBMS_OUTPUT.PUT_LINE('MY NEW SEQUENCE # IS SET TO ' || lTestType.COLB) ;
END ; 
/

不幸的是,你似乎无法做到

insert into TT ... SELECT * from .. RETURNING Type(x,y) BULK COLLECT INTO lVariable;

所以没有死记硬背而是从这个网站上回复,它是一个“解决方案”来获取大量收集工作的插入声明 http://www.oracle-developer.net/display.php?id=413