5

私は 1 つのテーブル性別を持っています。このテーブルには、「男性」と「女性」の 2 つのエントリのみが存在し、これら 2 つのエントリのみが含まれます。ここで、これら 2 つの値を置き換える手順を書きたいと思います。出力は次のようになります。

Input           Output

sex             sex
------------------------
male            female
female          male
female          male
male            female

エラーが発生するプロシージャを作成しています。カーソルを使用して複数の行をフェッチしています。update文一つでできるのはわかっているのですが、こんな風にやってみたいと思います。

declare
  v_gen gender%rowtype;
  cursor cur_gender is
    select * from gender;
begin
  open cur_gender;
  loop
    fetch cur_gender into v_gen;
    select * from gender;
    if v_gen='male'
    then
      update gender set sex='female';
    else
      update gender set sex='male';
    end if;
    exit when v_gen%notfound;
  end loop;
  close cur_gender;
end;
4

13 に答える 13

19
update Table1 set "col" = (case "col" when 'male' then 'female'
else 'male' end);

フィドル

于 2013-07-31T11:31:12.017 に答える
4
ID   Username   Email              Gender
1    sanjay     sanjay@gmail.com   Male
2    nikky      nikky@gmail.com    Male
11   raj        raj@gmail.com      Female
12   Rahul      rahul@gmail.com    Female
update users set gender = (case when gender = 'Male' then 'Female' else 'Male' end);
于 2016-02-02T04:38:38.173 に答える
3

あなたが持っているものには多くの問題があります。PLS-00324 の直接の原因はv_genレコードであるため、レコード全体ではなく、そのレコードのフィールドを固定値と比較する必要があります。

if v_gen='male'

になる

if v_gen.sex = 'male'

次に、事故のように見えるスプリアスselect * from genderがあり、完全に削除する必要があります。

最後%notfoundに、カーソルではなくレコードに適用しています。

exit when v_gen%notfound;

になる

exit when cur_gender%notfound;

他の人が指摘しているように、更新ステートメントのそれぞれがテーブル内のすべての行を更新しているため、最後に処理する行に応じてmaleすべてが終了します。female更新する特定の行を識別する必要があります。1 つの方法は、カーソルの一部としてクエリを実行するrowidことですが、より簡単な組み込みの方法があります。

declare
  cursor cur_gender is
    select * from gender
    for update;
begin
  for v_gen in cur_gender
  loop
    if v_gen.sex='male' 
    then
      update gender set sex = 'female'
      where current of cur_gender;
    else
      update gender set sex = 'male'
      where current of cur_gender;
    end if;
  end loop;
end; 
/

SQLフィドル

caseまたは、代わりに を使用して、少し単純化できますif

declare
  cursor cur_gender is
    select * from gender
    for update;
begin
  for v_gen in cur_gender
  loop
    update gender
    set sex = case v_gen.sex when 'male' then 'female' else 'male' end
    where current of cur_gender;
  end loop;
end; 
/

...これは、すでに知っている単一の更新ステートメントのアプローチにかなり近づいています。そのバージョンのSQL Fiddle 。

for updateとの詳細についてwhere current of は、ドキュメントを参照してください。

于 2013-07-31T14:03:27.943 に答える
1

これを進めるための SQL クエリ:

UPDATE table SET gender =
(CASE  WHEN  gender ='male' THEN 'female' else 'male' END)
于 2020-02-12T04:51:10.603 に答える
0

簡単にテーブルを作成します。それをpeopleにします:

create table people(gender varchar2(10));

insert into people values('&gender');

入力が男性、女性、女性、男性であるとします。

select * from people;
GENDER
    male
    female
    female
    male

select decode(gender, 'male', 'female', 'female', 'male') sex from people;
SEX
    female
    male
    male
    female
于 2016-05-09T07:26:05.833 に答える
0
/*Logic*/

SELECT Name, CASE
  WHEN Gender = 'Male' THEN 'Female'
  ELSE 'Male'
  END
AS "NewGender"
FROM NameGender ;

/*Here NameGender is the name of the Table*/
于 2016-06-04T06:11:43.847 に答える