Преобразование oracle-запроса в пользовательские типы в pl / sql - PullRequest
1 голос
/ 30 июня 2010

У меня есть запрос на выборку для реляционной таблицы в процедуре plsql.

Я хочу преобразовать результаты этого запроса в объект определенного пользователем типа для возврата через odp.net.

Как бы я поступил так?

1 Ответ

5 голосов
/ 30 июня 2010

(это из одного моего другого поста сегодня) это пошаговое руководство по началу работы: 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

...