0

次の列を持つテーブル、USERS があります: user_id、user_name、user_uname、user_pass

user_name が存在するかどうかを確認して -2 を返し、user_uname が存在する場合は -3 を返す必要があります。それ以外の場合は、新しい行に挿入された ID を挿入して返します。

クエリでそれを行うにはどうすればよいですか? 関数を使用する場合、関数にクエリをパラメーターとして渡す必要がありますか?

関数を暗号化する方法はありますか?

4

3 に答える 3

1

なぜ関数を暗号化する必要があるのでしょうか? アプリケーション ユーザーは、データベース レイヤーに直接アクセスできないようにする必要があります。その場合は、これを変更する必要があります。

まず、ユーザー名にUNIQUE CONSTRAINTを作成する必要があります。個人的には、複数の同一のユーザー名が存在することを許可しますが、それはあなたの呼び出しです:

alter table your_table 
  add constraint ui_your_table_username 
      unique (username);

これにより、重複を挿入しようとするとエラーが発生することが保証されます。

次に、データを挿入する関数を作成する必要があります。挿入する新しい ID を取得するために、INSERT ステートメントからRETURNING INTO構文を使用できます。現時点では、ユーザー名が既に存在する場合は -2 と -3 の両方を返すよう求めています。両方はあり得ないので、どちらか一方のみを選択します。

create or replace function insert_new_user ( 
    Pusername in varchar2
  , Pother_value in varchar2 
    ) return number is

   l_user_id users.id%type;

begin

   insert into users (id, username, other_column)
   values (user_id_seq.nextval, Pusername, Pother_column)
   returning id into l_user_id;

   return l_user_id;

-- An exception is raised if the unique index is violated.
-- Catch this and use it to return the default error value.
exception when dup_val_on_index then
   return -2;

end;
/

私は次のことを想定しています(あなたはそれほど多くの情報を提供していません):

  1. ユーザー ID 列は数字です。
  2. シーケンスが用意されています。
  3. users テーブルは USERS と呼ばれます
于 2013-04-12T12:06:16.393 に答える
0

U は、wrap ユーティリティを使用して関数をラップできます。http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/wrap.htm

ただし、コードを関数に動的に渡すため、コードをラップする必要はありません

于 2013-04-12T12:28:04.880 に答える