2017-10-28 19 views
0

私はSQLプロジェクトで作業しています。私はテーブルを返すSQL * Plus関数を作成したいと思います。 私はこのようなものを作りましたが、それは動作しません、なぜ私にはわからない:PL/SQL関数のテーブルを返す

CREATE OR REPLACE FUNCTION changeNbPersonnes(recette IN int, nbPersonne IN int) 
RETURN table_res TABLE 
(
    idIngredient int NOT NULL, 
    nomIngredient varchar(255) NOT NULL, 
    quantite int NOT NULL 
) 
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 row_ingredient IS 
    INSERT INTO res(idIngredient,nomIngredient,quantite) 
    VALUES(
     row_ingredient.idingredient, 
     row_ingredient.Nom, 
     row_ingredient.quantite 
    ); 
    END FOR; 
    RETURN res; 
END; 
/

は、あなたが私を助けることができますか? "RETURN table_res TABLE"に何か問題があります

+4

えっ?これは有効なpl/sql styntax/codeのようには見えません。 – OldProgrammer

+0

実際、結果のリストを返したいのですが、私が見つけた唯一の方法はこのような新しいテーブルを作成することでした。 –

+1

あなたはただのビューを使うべきです。 – itsLex

答えて

1

Oracleでサポートされていない構文を使用してください。PLSQL。オラクル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あたりなどを、それは以下のように考えられます。

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

結果のサイズに応じて、パイプライン関数がより良い選択になる可能性があります。 –

+0

@a_horse_with_no_name True。 'sys_refcursor'を直接使うこともできます。テーブルを返す必要は絶対にありませんが、OPの必要性が分かりません。 – XING

+0

ありがとう、それはパイプラインでうまく動作します。 –

関連する問題