2017-11-03 9 views
0

基本的には、オラクルのビジネスレポート(クエリ)を作成して、FREQUENT_FLYERテーブルから情報を抽出しました。マイルの残高が10000以上20000未満で、MileageExpDateがPL/SQLエラーORA-01403:データが見つかりません。予期しない結果を受け取っていません

SELECT F.FPASSENGERID, P.First, P.Last, F.FREQFLYERNUM, F.FREQFLYERMILEAGE, 
F.MILEAGEBALANCE, F.MILEAGEEXPDATE 
FROM FREQUENT_FLYER F 
INNER JOIN PASSENGER P 
ON F.FPassengerID = P.PassengerID 
WHERE MileageBalance >= 10000 AND F.MILEAGEBALANCE <= 20000 
AND MileageExpDate > '01/OCT/2017'; 

ここでは、そのクエリの結果を示します。それはただ一つの記録を返すべきです。 enter image description here

私は、ストアドプロシージャの周りしようとしている、と私はその一つのレコードに基づいて情報を返すために店の手続きを期待していストア手順

--First Stored Procedure-- 
CREATE OR REPLACE PROCEDURE sp_GetMileageBalance 
IS --Code declaration section-- 
    --variables to store column values returned from select into 
    fPassengerID  VARCHAR2(10); 
    pFirst    VARCHAR2(20); 
    pLast    VARCHAR2(20); 
    fFreqflyernum  NUMBER (10); 
    fFreqflyerMileage NUMBER (7); 
    fMileagebalance  NUMBER (7); 
    fMileageExpDate  DATE; 
    MileageExpDate  DATE; 
    MileageStart  NUMBER (7); 
    MileageEnd   NUMBER (7); 
    MileageBalance  NUMBER (7); 

BEGIN --Code execution section 
       --executing select into Query assign to variable 
       MileageExpDate := '01/OCT/2017'; 
       MileageStart := 10000; 
       MileageEnd := 20000; 
SELECT F.FPASSENGERID, P.First, P.Last, F.FREQFLYERNUM, F.FREQFLYERMILEAGE, 
F.MILEAGEBALANCE, F.MILEAGEEXPDATE 
INTO fPassengerID, 
pFirst,pLast,fFreqflyernum,fFreqflyerMileage,fMileagebalance,fMileageExpDate 
FROM FREQUENT_FLYER F 
INNER JOIN PASSENGER P 
ON F.FPassengerID = P.PassengerID 
WHERE MileageBalance >= MileageStart AND F.MILEAGEBALANCE <= MileageEnd 
AND MileageExpDate > MileageExpDate; 

--Displaying the results 
DBMS_OUTPUT.PUT_LINE ('CUSTOMER INFORMATION: '); 
DBMS_OUTPUT.PUT_LINE ('The Frequent Flyer PassengerID is: ' ||fPassengerID); 
DBMS_OUTPUT.PUT_LINE ('First Name of passenger is: ' ||pFirst); 
DBMS_OUTPUT.PUT_LINE ('Last Name of passenger is: ' ||pLast); 
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer number of passenger is: ' ||fFreqflyernum); 
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer Mileage of Passenger is: ' ||fFreqflyerMileage); 
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer Balance of passenger is: ' ||MileageBalance); 
DBMS_OUTPUT.PUT_LINE ('Mileage expiration date of passenger is: ' ||MileageExpDate); 

END sp_GetMileageBalance; 

にそのクエリを変換することを決めました。 代わりに、これは私が得るものです。

Procedure SP_GETMILEAGEBALANCE compiled 


Error starting at line : 57 in command - 
BEGIN sp_GetMileageBalance; END; 
Error report - 
ORA-01403: no data found 
ORA-06512: at "SYSTEM.SP_GETMILEAGEBALANCE", line 29 
ORA-06512: at line 1 
01403. 00000 - "no data found" 
*Cause: No data was found from the objects. 
*Action: There was no data from the objects which may be due to end of fetch 

なぜ私はこの結果を得ているのか分かりません。私がクエリを実行したのと同じ情報が得られるはずです。

+1

ことの一つは、PROCであなたのMileageStartが整数であるということです、そして、あなたのSQLには文字です。 –

答えて

0

これが問題になる可能性がある:

drop table test_table; 
create table test_table (charcol varchar2(10), numcol integer); 
insert into test_table select ' 15000',15000 from dual; 

select * from test_table where charcol>'10000'; --no record 
select * from test_table where charcol>10000; --1 record 
+0

あなたの声明は正しいが、まったく問題ではなかった。 –

0

明確にするために、MileageStartは、ストアドプロシージャ内で作成された変数でした。これはSQLクエリ内には表示されません(スクロールして見てください)。また、私が作成したSQLクエリーでは、この場合に指定されている値を文字と呼びます。何らかの理由で

WHERE MileageBalance >= '10000' 

、私は二重引用符でその「文字」を持っている場合でも、Oracleはまだ私にも同じ結果が得られます。

SELECT F.FPASSENGERID, P.First, P.Last, F.FREQFLYERNUM, F.FREQFLYERMILEAGE, 
F.MILEAGEBALANCE, F.MILEAGEEXPDATE 
FROM FREQUENT_FLYER F 
INNER JOIN PASSENGER P 
ON F.FPassengerID = P.PassengerID 
WHERE F.MileageBalance >= '10000' AND F.MILEAGEBALANCE <= 20000 
AND MileageExpDate > '01/OCT/2017'; 

結果:Second Query

は今、店に戻っ手順になって、私たちが行う必要があります。 First Query

同じクエリが、文字の引用符で

SELECT F.FPASSENGERID, P.First, P.Last, F.FREQFLYERNUM, 
    F.FREQFLYERMILEAGE, F.MILEAGEBALANCE, F.MILEAGEEXPDATE 
    FROM FREQUENT_FLYER F 
    INNER JOIN PASSENGER P 
    ON F.FPassengerID = P.PassengerID 
    WHERE F.MileageBalance >= 10000 AND F.MILEAGEBALANCE <= 20000 
    AND MileageExpDate > '01/OCT/2017'; 

結果を削除一つの事を理解する。作成されたこれらの変数が宣言されている理由/:データベース内に作成されたテーブル(キャプテン明白な)から抽出されたどんな値を格納するプレースホルダがあるので

fPassengerID  VARCHAR2(10); 
pFirst    VARCHAR2(20); 
pLast    VARCHAR2(20); 
fFreqflyernum  NUMBER (10); 
fFreqflyerMileage NUMBER (7); 
fMileagebalance  NUMBER (7); 
fMileageExpDate  DATE; 
MileageExpDate  DATE; 
MileageStart  NUMBER (7); 
MileageEnd   NUMBER (7); 
MileageBalance  NUMBER (7); 

です。

これは、宣言された変数が

SELECT F.FPASSENGERID, P.First, P.Last, F.FREQFLYERNUM, F.FREQFLYERMILEAGE, 
F.MILEAGEBALANCE, F.MILEAGEEXPDATE 
INTO fPassengerID, 
pFirst,pLast,fFreqflyernum,fFreqflyerMileage,fMileagebalance,fMileageExpDate 

...にこれらの変数が作成さと比較されているものです。これらの変数(宣言しているが)があるので、

   MileageExpDate := '01/OCT/2017'; 
       MileageStart := 10000; 
       MileageEnd := 20000; 

は、利用することができませんでした作成されたテーブルのいずれの属性でも参照されません。 MileageStart & MileageEndは何と比較されません。このように質問を残して、問題をほぼ解決しました。

--First Stored Procedure-- 
CREATE OR REPLACE PROCEDURE sp_GetMileageBalance 
IS --Code declaration section-- 
    --variables to store column values returned from select into 
    fPassengerID  VARCHAR2(10); 
    pFirst    VARCHAR2(20); 
    pLast    VARCHAR2(20); 
    fFreqflyernum  NUMBER (10); 
    fFreqflyerMileage NUMBER (7); 
    fMileagebalance  NUMBER (7); 
    fMileageExpDate  DATE; 
    MileageExpDate  DATE; 
    MileageStart  NUMBER (7); 
    MileageEnd   NUMBER (7); 
    MileageBalance  NUMBER (7); 

     BEGIN --Code execution section 
      --executing select into Query assign to variable 
      --MileageExpDate := '01/OCT/2017';-- 
      --MileageStart := 10000;-- 
      --MileageEnd := 20000;-- 
     SELECT F.FPASSENGERID, P.First, P.Last, F.FREQFLYERNUM, 
     F.FREQFLYERMILEAGE, F.MILEAGEBALANCE, F.MILEAGEEXPDATE 
     INTO fPassengerID, 
pFirst,pLast,fFreqflyernum,fFreqflyerMileage,fMileagebalance,fMileageExpDate 
FROM FREQUENT_FLYER F 
INNER JOIN PASSENGER P 
ON F.FPassengerID = P.PassengerID 
WHERE F.MileageBalance >= 10000 AND F.MILEAGEBALANCE <= 20000 
AND MileageExpDate > '01/OCT/2017'; 

--Displaying the results 
DBMS_OUTPUT.PUT_LINE ('CUSTOMER INFORMATION: '); 
DBMS_OUTPUT.PUT_LINE ('The Frequent Flyer PassengerID is: ' ||fPassengerID); 
DBMS_OUTPUT.PUT_LINE ('First Name of passenger is: ' ||pFirst); 
DBMS_OUTPUT.PUT_LINE ('Last Name of passenger is: ' ||pLast); 
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer number of passenger is: ' ||fFreqflyernum); 
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer Mileage of Passenger is: ' ||fFreqflyerMileage); 
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer Balance of passenger is: ' ||fMileageBalance); 
DBMS_OUTPUT.PUT_LINE ('Mileage expiration date of passenger is: ' ||fMileageExpDate); 

END sp_GetMileageBalance; 

結果:あなたのPROCから

CUSTOMER INFORMATION: 
The Frequent Flyer PassengerID is: KL87DF34DS 
First Name of passenger is: Michelle 
Last Name of passenger is: Mullington 
Frequent Flyer number of passenger is: 9374392018 
Frequent Flyer Mileage of Passenger is: 400 
Frequent Flyer Balance of passenger is: 15000 
Mileage expiration date of passenger is: 19-DEC-20 


PL/SQL procedure successfully completed. 
0


とMileageExpDate> MileageExpDate。

あなたはそれを見ますか?

変数名を変更して列名と区別し、変数名にプロシージャ名を付加します。以下のような何か:

MileageExpDate> sp_GetMileageBalance.MileageExpDate

ここに詳細説明:Link

+0

私は問題が何かを理解しました。私はエラーの背後にある推論がこのページの下にあると説明しました。私のエラーがあいまいな識別子の問題に関連していた場合、私の推測では、コンパイラのために変数名を区別することは問題(私が正しい場合)を回避することしかできません。私はfMileageExpDateがその特定の日付(01-OCT-17)と等しいと宣言しておきます。これは、fMileageExpDateを属性 "F.MILEAGEEXPDATE"と比較することができ、目的のテーブルから正しい情報を抽出できるため、機能します。 –

関連する問題