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

PL/SQL関数で表を返します

    使用する構文は、確かにOracle PLSQLではサポートされていないものです。 。 OracleのPLSQL 次のようなことをする必要があります:

    -- Create Object of your table
    CREATE TYPE TABLE_RES_OBJ AS OBJECT (
         IDINGREDIENT                  INT ,
         NOMINGREDIENT                 VARCHAR (255) ,
         QUANTITE                      INT 
    );
    
    --Create a type of your object 
    CREATE TYPE TABLE_RES AS TABLE OF TABLE_RES_OBJ;
    /
    
    --Function Use the type created as Return Type
    CREATE OR REPLACE FUNCTION CHANGENBPERSONNES (
         RECETTE      IN   INT,
         NBPERSONNE   IN   INT)
         RETURN TABLE_RES
    AS
         CURSOR CURSEUR_ETAPE
         IS
              SELECT  TABLE_RES_OBJ (IR.*)
                FROM INGREDIENTRECETTE IR 
                JOIN RECETTE R ON IR.IDRECETTE =R.IDRECETTE
                     JOIN INGREDIENT I ON IR.IDINGREDIENT = I.IDINGREDIENT
               WHERE R.IDRECETTE = RECETTE;
    
         VAR       TABLE_RES:= TABLE_RES();
    BEGIN
         OPEN CURSEUR_ETAPE;
    
         LOOP
              FETCH CURSEUR_ETAPE
              BULK COLLECT INTO VAR LIMIT 100;
    
              EXIT WHEN CURSEUR_ETAPE%NOTFOUND;
         END LOOP;
    
         CLOSE CURSEUR_ETAPE;
    
         RETURN VAR;
    END;
    /
    

    または、@ a_horse_with_no_nameのように、PipeLine関数を使用すると、次のようになります。

    CREATE OR REPLACE FUNCTION CHANGENBPERSONNES (RECETTE      IN INT,
                                                  NBPERSONNE   IN INT)
       RETURN TABLE_RES
       PIPELINED
    AS
       CURSOR CURSEUR_ETAPE
       IS
          SELECT *
            FROM INGREDIENTRECETTE IR
                 JOIN RECETTE R ON IR.IDRECETTE = R.IDRECETTE
                 JOIN INGREDIENT I ON IR.IDINGREDIENT = I.IDINGREDIENT
           WHERE R.IDRECETTE = RECETTE;
    BEGIN
       FOR i IN CURSEUR_ETAPE
       LOOP
          PIPE ROW (TABLE_RES_OBJ (i.idingredient, i.Nom, i.quantite));
          EXIT WHEN CURSEUR_ETAPE%NOTFOUND;
       END LOOP;
    
       RETURN;
    END;
    /
    



    1. MYSQLリクエスト|日ごとのグループ

    2. OracleOCI関数OCIPasswordChangeは送信されたパスワードを暗号化しますか

    3. OracleのClob列を更新します

    4. Spring JPA+postgresqlのスキーマ間でデータソースを動的に切り替えます