sql >> データベース >  >> RDS >> Oracle

pl/sqlでOracleクエリをユーザー定義型に変換する

    (これは今日の他の投稿の1つからです)これは開始のウォークスルーです: http://www.oracle.com/technology/obe/hol08/dotnet/udt/udt_otn.htm

    これはもう少し詳細ですが、 http://download.oracle.com /docs/html/E10927_01/featUDTs.htm

    ただし、サンプルディレクトリにODPをインストールした後、実際の肉とジャガイモはすでにコンピュータにインストールされています:%ORA_HOME%\ product \ 11.1.0 \ client_1 \ odp.net \ samples \ 2.x \ UDT

    しかし、物事のpl / sql側:

    まず、一度に1行を処理するシングルトン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 ;
    

    上記のリンクの指示に従って、.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()

    の値になります。

    これで時間を節約するために、INSERT / UPDATE/DELETESasなどでRETURNING句を使用できます

    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




    1. Oracle 11g:PL / SQLで、MERGE DMLステートメントの後に挿入および更新された行に関する情報を取得する方法はありますか?

    2. Androidルーム+ウィンドウ関数

    3. $wpdb->updateまたは$wpdb->insertの結果、引用符の前にスラッシュが追加されます

    4. cPanelAPIを使用してMySQLデータベースを作成する方法