2017-01-17 21 views
0

顧客が指定した予約をプリントするSQL関数を作成しようとしています。顧客名はCLIENTS.FNAME CLIENTS.MNAME CLIENTS.LNAMEというテーブルにあり、id-foreignキーで検索された予約は です。「多すぎる値」エラーを表示する関数のコードがあります。ループか何かによって行わPL/SQL:ORA-00913:値が多すぎます

create or replace FUNCTION cl_reserv(clName VARCHAR2) 

RETURN RESERVATIONS%ROWTYPE 

IS 
resRecord RESERVATIONS%ROWTYPE; 

BEGIN 
    SELECT RESID,STARTDATE,ENDDATE,ADDINFO INTO resRecord 
      FROM RESERVATIONS INNER JOIN CLIENTS ON RESERVATIONS.CLIENTID=CLIENTS.CLIENTID 
      WHERE clName IN (FNAME,MNAME,LNAME); 
RETURN resRecord; 
END; 
+1

selectが複数のレコードを返す場合、レコードのリストを1つの変数に挿入しようとします。サーバは例外を発生させます。 – are

+1

この記事の "コレクションフォームを返す方法/ SQL関数" http://stackoverflow.com/質問/ 7888990/return-collection-from-select-use-select-for-select – are

答えて

1

あなたのSELECT句があなたに選択しようとしているレコードと一致していない。このようにコードを変更します?。

CREATE OR REPLACE FUNCTION cl_reserv(clName VARCHAR2) 
    RETURN RESERVATIONS%ROWTYPE 
IS 
    resRecord RESERVATIONS%ROWTYPE; 

BEGIN 
    SELECT r.* INTO resRecord 
      FROM RESERVATIONS r INNER JOIN CLIENTS c ON r.CLIENTID=c.CLIENTID 
      WHERE clName IN (FNAME,MNAME,LNAME); 
    RETURN resRecord; 
END cl_reserv; 

r.*を使用することにより、選択しましたレコードタイプに必要な列の数、型および順序を正確に指定します。

+2

または、返されるレコードフィールドを指定することができます。 'RESID、STARTDATE、ENDDATE、ADDINFOをresRecord.resid、resRecord.startdate、resRecord.enddate、resRecord.addinfoから選択してください。 ' – Boneist

+0

ありがとうございました。私は関数を呼び出すときに私はまだ結果に関するエラーが表示されます。私はresRecordからの情報を持つ行を取得しようとしています。 'code' DECLARE res RESERVATIONS%ROWTYPE; BEGIN cName:= cl_reserv( 'Ivan'); DBMS_OUTPUT.PUT_LINE(res); END; 'コード' –

関連する問題