2017-02-05 4 views
-1

特定の基準を満たすデータベース内のすべての書籍を出力するpl SQLプロシージャが必要です。私はそれを実行し、正しい値を出力しているが、常に1セットの値を残す。たとえば、10冊の本を返す特定の制約をかけて実行すると、手順には9件しか表示されません。そして、常にリストの最下部にあったはずの本です。どんな助けもありがとうございます。PL/SQLカーソルのループ回数が1回少なすぎる

create or replace procedure which_titles(quant_limit number, price_limit number) as 
begin 
    for next_title in (select * 
         from title) 
    loop 
     IF next_title.qty_on_hand <= quant_limit 
     and next_title.title_price <= price_limit THEN 
     dbms_output.put_line(next_title.title_name || ' - ' || next_title.qty_on_hand || ' - ' || next_title.title_price); 
     END IF; 
    end loop; 
end; 
/
show errors 
+3

「IF」文は必要ありません。 'select * from title where qty_on_hand <= quant_limitとtitle_price <= price_limit'を使用して、返す行の数を確認してください – GurV

+2

なぜカーソルクエリ内でフィルタリングを行っていませんか?より効率的ですが、同じクエリをスタンドアロンで実行して、それがあなたが期待していることをしていない理由を理解することも簡単になります。あなたは9行だけ戻ってくるのを見るでしょう。ループにはループがありませんが、 'if'がそれを除外している可能性があります。データとパラメータがなければ、あなたの間違いがどこにあるのかはわかりません。 –

+0

このループには、このような「オフ・バイ・ワン」エラーの原因となるものはありません。したがって、私はこの問題の原因となっているデータに何かがあると思われます。質問を編集して、関連するすべてのフィールド(QTY_ONHAND、TITLE_PRICE、TITLE_NAME)を含むデータのサンプルを含めてください。ありがとう。 –

答えて

1

掲載されているコードに従って。それは大丈夫と思われる。修正されたコード内のいくつかの冗長性のみを示します。また、秘密は主にSELECTクエリにあります。そのため、プロシージャの外にある実際の入力でselectクエリを実行します。あなたは間違いなくあなたの質問を解決するでしょう。

これが役に立ちます。

CREATE OR REPLACE 
procedure which_titles(
    quant_limit IN NUMBER, 
    price_limit IN NUMBER) 
AS 
BEGIN 
    FOR next_title IN 
    (SELECT   * 
    FROM title 
    WHERE title.qty_on_hand <= quant_limit 
    AND title.title_price <= price_limit 
) 
    LOOP 
    dbms_output.put_line(next_title.title_name || ' - ' || next_title.qty_on_hand || ' - ' || next_title.title_price); 
    END LOOP; 
END; 
/
関連する問題