Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chuyển đổi truy vấn tiên tri thành các loại do người dùng xác định trong pl / sql

(đây là từ một trong những bài đăng khác của tôi hôm nay) đây là hướng dẫn cách bắt đầu:http://www.oracle.com/technology/obe/hol08/dotnet/udt/udt_otn.htm

trong khi điều này chi tiết hơn một chút: http://download.oracle.com /docs/html/E10927_01/featUDTs.htm

nhưng thịt và khoai tây thật đã được cài đặt trên máy tính của bạn sau khi bạn cài đặt ODP trong thư mục Mẫu:% ORA_HOME% \ product \ 11.1.0 \ client_1 \ odp.net \ samples \ 2.x \ UDT

nhưng mặt pl / sql của mọi thứ:

Đầu tiên tạo udt singleton để xử lý từng hàng một

 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 ;

làm theo các hướng dẫn trong các liên kết ở trên để nhận thông tin chi tiết về phía .net

NGAY CHO BỘ SƯU TẬP:

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;

thì ở phía .net của mọi thứ, đây thực sự sẽ là một giá trị của TESTTYPE ()

Bây giờ để tiết kiệm thời gian, bạn có thể sử dụng mệnh đề RETURNING trên INSERT / UPDATE / DELETES như vậy

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

rất tiếc, có vẻ như bạn không thể làm một

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

vì vậy, thay vì sao chép vẹt TỪ TRANG WEB NÀY, NÓ NÓI VỀ MỘT "công việc" ĐỂ CÓ ĐƯỢC SỐ LƯỢNG LỚN ĐỂ LÀM VIỆC TRONG MỘT BÁO CÁO CHÈN http://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. Đây là sự cố của Microsoft hay Oracle?

  2. Trong Oracle 11g làm thế nào để bạn tính thời gian cho dữ liệu trung bình hàng giờ giữa hai ngày?

  3. JdbcTemplate - Chèn hoặc cập nhật Oracle BLOB bằng SQL MERGE

  4. Viết chế độ xem oracle DB dựa trên sự khác biệt về dấu thời gian cột khác nhau

  5. 2 cách chuyển đổi sang chữ hoa trong Oracle