2016-05-07 13 views
0

私は、このPL/SQLの機能があります。戻り値より

exact fetch returns more than requested number of rows 

サブクエリを持つacctIdを見つけようとします:私は上記のコードを実行すると

Create Or Replace Function mostMealOrders 
Return varchar 
Is 

name_phone varchar(200) := ' '; 

Cursor c1 Is 
     Select acctid 
     From MealOrder Natural Join Customer 
     Group By acctid 
     Having Count(*) >= All (Select Count(*) 
           From MealOrder 
           Group By acctid); 

Begin 
     For acctNum in c1 
     Loop 
       Select (name || ' ' || phone || ', ') 
       Into name_phone 
       From Customer 
       Where acctid = acctNum.acctid; 
     End Loop 
     Return name_phone; 
End; 
/
Show Errors; 

が、私はこのエラーが発生したがOrderTableからのほとんどの注文。

サブクエリが複数のacctidを返しているため、エラーが発生していると考えられます。誰も私が外側のクエリでやろうとしているようにサブクエリから返されたすべてのacctid'sの名前と電話を取得する方法を知っていますか?

+1

[カーソル](http://www.techonthenet.com/oracle/loops/cursor_for.php)を使用することができます。しかし、それは常に最適な解決策ではありません。それぞれの値に基づいて更新を実行することを目的としている場合は、大量の 'update'ステートメントで行うことができます。 – trincot

+0

私はすべてのacctidをカーソルに入れてからループして、顧客名と電話機をすべてBeginの内部の文字列に連結しますか? – LP496

+0

私はあなたの質問からあなたがそれぞれの価値について何をしているのか分かりません。ただ1つの値に連結する目的はありますか?コードの一部を表示することもできますか? – trincot

答えて

2

あなたはこのように、カーソルを使用することができます。

Select LISTAGG (name || ' ' || phone, ',') 
     WITHIN GROUP (ORDER BY name, phone) 
Into name_phone 
From Customer 
Where acctid in (Select acctid  
       From OrderTable Natural Join Customer 
       Group By acctid 
       Having Count(*) >= All (
          Select Count(*) 
          From OrderTable 
          Group By acctid)) 

FOR rec in (
    Select (name || ' ' || phone || ',') AS name_phone 
    From Customer 
    Where acctid in (Select acctid  
        From OrderTable Natural Join Customer 
        Group By acctid 
        Having Count(*) >= All (
           Select Count(*) 
           From OrderTable 
           Group By acctid)) 
) LOOP 
    -- do something with rec.name_phone 
    dbms_output.put_line(rec.name_phone); 
END LOOP; 

、あなたが1つの長い文字列を取得したすべての文字列を連結ループを探しているが場合は、LISTAGG機能を使用します

+0

LISTAGGはbeginブロックに入り、カーソルを使用しませんか? – LP496

+1

2番目のクエリで問題が解決された場合は、カーソルは必要ありません。この問合せの出力結果に応じて、PL/SQLにPL/SQLを含める必要がある場合もありますが、最後にPL/SQLは必要なく、単一のSQL文としても実行できます。それはあなたが何をする必要があるかによって異なります。 – trincot

+0

はい、2番目のクエリが機能しました!ありがとうございました!グループ内ステートメントを説明していただけますか? – LP496