Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Konwersja zapytania oracle na typy zdefiniowane przez użytkownika w pl/sql

(to jest z jednego z moich innych dzisiejszych postów) to jest przewodnik, jak zacząć:http://www.oracle.com/technology/obe/hol08/dotnet/udt/udt_otn.htm

chociaż jest to nieco bardziej szczegółowe:http://download.oracle.com /docs/html/E10927_01/featUDTs.htm

ale prawdziwe mięso i ziemniaki są już zainstalowane na twoim komputerze po zainstalowaniu ODP w katalogu Samples:%ORA_HOME%\product\11.1.0\client_1\odp.net\samples\2.x\UDT

ale strona pl/sql:

Najpierw utwórz pojedynczy udt do obsługi jednego wiersza naraz

 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 ;

postępuj zgodnie ze wskazówkami w powyższych linkach, aby uzyskać synchronizację po stronie .net

TERAZ DO KOLEKCJI:

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;

wtedy po stronie .net będzie to faktycznie wartość TESTTYPE()

Teraz, aby zaoszczędzić trochę czasu, możesz użyć klauzuli RETURNING na INSERT/UPDATE/DELETEtakie jak

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 ; 
/

niestety wydaje się, że nie możesz zrobić

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

więc zamiast na pamięć KOPIOWANIE Z TEJ STRONY, MÓWI O „OBEJŚCIU”, ABY ZBIERAĆ BULK COLLECT DO PRACY W OŚWIADCZENIU WKŁADKIhttp://www.oracle-developer.net/display.php?id=413




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. upłynął limit czasu. wszystkie połączenia w puli były używane i osiągnięto maksymalny rozmiar puli

  2. Odczytaj ARRAY ze STRUCT zwróconego przez procedurę składowaną

  3. Oracle JDBC prefetch:jak uniknąć wyczerpania pamięci RAM/jak przyspieszyć działanie Oracle z dużymi opóźnieniami

  4. używanie wartości oddzielonych przecinkami wewnątrz klauzuli IN dla kolumny NUMBER

  5. Strategia dotycząca stronicowania Oracle