次の列を持つテーブル、USERS があります: user_id、user_name、user_uname、user_pass
user_name が存在するかどうかを確認して -2 を返し、user_uname が存在する場合は -3 を返す必要があります。それ以外の場合は、新しい行に挿入された ID を挿入して返します。
クエリでそれを行うにはどうすればよいですか? 関数を使用する場合、関数にクエリをパラメーターとして渡す必要がありますか?
関数を暗号化する方法はありますか?
なぜ関数を暗号化する必要があるのでしょうか? アプリケーション ユーザーは、データベース レイヤーに直接アクセスできないようにする必要があります。その場合は、これを変更する必要があります。
まず、ユーザー名に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;
/
私は次のことを想定しています(あなたはそれほど多くの情報を提供していません):
U は、wrap ユーティリティを使用して関数をラップできます。http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/wrap.htm
ただし、コードを関数に動的に渡すため、コードをラップする必要はありません