Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mengubah kueri Oracle menjadi tipe yang ditentukan pengguna di pl/sql

(ini dari salah satu posting saya yang lain hari ini) ini adalah panduan untuk memulai:http://www.Oracle.com/technology/obe/hol08/dotnet/udt/udt_otn.htm

sementara ini sedikit lebih detail:http://download.Oracle.com /docs/html/E10927_01/featUDTs.htm

tetapi daging &kentang asli sudah terinstal di komputer Anda setelah Anda menginstal ODP di direktori Samples:%ORA_HOME%\product\11.1.0\client_1\odp.net\samples\2.x\UDT

tapi dari sisi pl/sql:

Pertama buat singleton udt untuk menangani satu baris pada satu waktu

 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 ;

ikuti petunjuk di tautan di atas untuk mendapatkan sisi .net yang tidak sinkron

SEKARANG UNTUK KOLEKSI:

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;

kemudian di sisi .net hal ini secara efektif akan menjadi nilai TESTTYPE()

Sekarang untuk menghemat waktu Anda, Anda dapat menggunakan klausa RETURNING pada INSERT/UPDATE/DELETESas seperti

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

sayangnya sepertinya Anda tidak dapat melakukan

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

jadi alih-alih menghafal SITUS INI, ITU MEMBERITAHU TENTANG "PENGELOLAAN" UNTUK MENDAPATKAN BULK COLLECT UNTUK BEKERJA DALAM PERNYATAAN INSERThttp://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. tabel pivot Oracle - cara mengubah item baris menjadi kolom

  2. Mendapatkan detik antara dua Oracle Timestamps

  3. Membuang bidang CLOB ke dalam file?

  4. gabungkan tiga tabel untuk hasil tertentu

  5. Cara mengekstrak nomor bulan dari tanggal di Oracle