sql >> Database teknologi >  >> RDS >> Oracle

Konvertering af oracle-forespørgsler til brugerdefinerede typer i pl/sql

(dette er fra et af mine andre indlæg i dag) dette er en gennemgang til at komme i gang:http://www.oracle.com/technology/obe/hol08/dotnet/udt/udt_otn.htm

mens dette er lidt mere detaljeret:http://download.oracle.com /docs/html/E10927_01/featUDTs.htm

men det rigtige kød og kartofler er allerede installeret på din computer, efter du har installeret ODP i prøvebiblioteket:%ORA_HOME%\product\11.1.0\client_1\odp.net\samples\2.x\UDT

men pl/sql-siden af ​​tingene:

Opret først singleton udt for at håndtere en række ad gangen

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 ;

følg anvisningerne i ovenstående links for at få .net side-insynch

NU TIL EN SAMLING:

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;
 

så i .net-siden af ​​tingene vil dette effektivt være en værdi af TESTTYPE()

For nu at spare tid kan du bruge RETURNING-sætningen på INSERT/UPDATE/DELETES som sådan

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

desværre ser det ud til, at du ikke kan gøre en

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

så i stedet for uden at KOMME FRA DENNE SIDE, BEREDDER DET OM EN "work-around" AT FÅ BULK COLLECT TIL AT ARBEJDE I EN INDSÆTNINGSERKLÆRINGhttp://www.oracle-developer.net/display.php?id=413




  1. Sådan tilføjes Computed Column i SQL Server Table - SQL Server / T-SQL vejledning del 47

  2. Problemer med at kontrollere, om en tabel findes eller ej i db

  3. Udfør en lagret procedure i en anden lagret procedure i SQL server

  4. heltal uden for rækkevidde og resterende diskplads for lille til at konvertere id til bigint og andre løsninger