(это из одного моего другого поста сегодня)
это пошаговое руководство по началу работы: http://www.oracle.com/technology/obe/hol08/dotnet/udt/udt_otn.htm
, хотя это немного более подробно: http://download.oracle.com/docs/html/E10927_01/featUDTs.htm
но настоящее мясо и картофель уже установлены на вашем компьютере после установки ODP в каталоге Samples:% 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 ;
следуйте инструкциям в приведенных выше ссылках, чтобы получить insynch на стороне .net
СЕЙЧАС ДЛЯ КОЛЛЕКЦИИ:
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 ()
Теперь, чтобы сэкономить ваше время, вы можете использовать предложение RETURNING для INSERT / UPDATE / DELETES.
как таковой
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