-1

次の列を持つ BANKCUSTOMER というテーブルがあります。

 USERNAME                                  NOT NULL VARCHAR2(11)
 FAMILY_NAME                               NOT NULL VARCHAR2(25)
 NAME                                      NOT NULL VARCHAR2(25)
 PASSWD                                    NOT NULL VARCHAR2(6)

ユーザーの USERNAME と PASSWORD がデータベース内のデータと一致するかどうかをデータベースでチェックする関数を作成したいと考えています。ログインが成功すると、「ログイン成功!」と出力されます。それ以外の場合は、「ユーザー名またはパスワードが間違っています!」

私は pl/sql チュートリアル サイトにアクセスし、データベースで動作するように少し変更した次のコードを見つけましたが、理解できないものz numberbegin select 1 into zあります。誰かが私のためにそれを説明してもらえますか.

create or replace function log_in(x in varchar2, y in varchar2)   
return varchar2  
as  
  z number;  
begin  
  select 1  
    into z   
    from bankcustomer   
    where username=x   
    and passwd=y;  
  dbms_output.put_line('Login successful!');  
exception  
when no_data_found then  
  dbms_output.put_line('Wrong username or password!'); 
end; 

SELECT log_in() FROM dual;動作するかどうかを書いてテストしたいと思います。書くSELECT log_in() FROM dual;と、次のようなエラーメッセージが表示されます。

コマンドの 1 行目から始まるエラー: SELECT log_in() FROM dual コマンド ラインのエラー: 1 列: 7 エラー レポート: SQL エラー: ORA-06553: PLS-306: 'LOG_IN' 06553 の呼び出しで引数の数またはタイプが間違っています. 00000 - "PLS-%s: %s" *原因:
*アクション:

これはどのように解決できますか?

4

3 に答える 3

2

関数を定義しましたが、関数から値を返しません。関数を「選択」するという事実を考えると、dbms_outputを使用する必要はありません。

create or replace function log_in(x in varchar2, y in varchar2)
return varchar2
as
  match_count number;
begin
  select count(*)
    into match_count
    from bankcustomer
    where username=x
    and passwd=y;
  if match_count = 0 then
    return 'Wrong username or password!';
  elsif match_count = 1 then
    return 'Login successful!';
  else
    return 'Too many matches, this should never happen!';
  end if;
end;
/

さらに、関数の呼び出しではユーザー名とパスワードのパラメーターが提供されないため、エラーメッセージが表示されます。実際に何かを返すように関数を変更したとすると、次を使用する必要があります。

SELECT log_in('username', 'secretpassword') FROM dual;
于 2012-02-18T08:54:28.103 に答える
1

log_in実際に関数に引数を渡しましたか?そして、何logga_in()ですか?後者はあなたの側のタイプミスですか?

とにかく、select 1 into z一致するものが見つからない場合にのみ、例外を強制します。これ以上何もない。

つまり、コードを使用せずに、たとえばコードを使用してコードを記述し、適切なアクションselect count(*) into authenticated ...を確認して実行することができます。if authenticated != 0私はOracleインスタンスを持っていないので、このコードは盲目的に書かれています。テストする必要があります。

create or replace function log_in(x in varchar2, y in varchar2)
return varchar2
as
  match_count number;
begin
  select count(*)
    into match_count
    from bankcustomer
    where username=x
    and passwd=y;
  if match_count = 0 then
    dbms_output.put_line('Wrong username or password!');
  elsif match_count = 1 then
    dbms_output.put_line('Login successful!');
  else
    dbms_output.put_line('Too many matches, this should never happen!');
end;
于 2012-02-18T02:27:13.617 に答える
0

すでに提供されているものにさらに情報を追加するために、BEGINキーワードは実行ブロックの開始を示します。その上にあるのは、関数ヘッダーと宣言ステートメントです。

ステートメントのz 番号。zという名前でデータ型numberの変数を宣言する変数宣言文です。このステートメントは、ユーザー名が最初のパラメーターで関数に渡されたものと一致し、パスワードが 2 番目のパラメーターで関数に渡されたものと一致する行をテーブルでSELECT 1 INTO z WHERE...チェックしています。BANKCUSTOMER

ユーザー名とパスワードが関数に渡されたものと一致する行がある場合、変数 z には数値 1 が含まれます。そうでない場合、ステートメントは常に1 つの行のみOracle NO_ROWS_FOUND exceptionを選択する必要があるため、 が発生します。そうしないと、例外が発生します (行がない場合、および行が複数の場合)。SELECT...INTONO_ROWS_FOUND exceptionTOO_MANY_ROWS exception

お役に立てば幸いです。他にご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-02-18T04:51:51.627 に答える