Sql 将列值从“男性”替换为“女性”,将“女性”替换为“男性”

Sql 将列值从“男性”替换为“女性”,将“女性”替换为“男性”,sql,oracle,plsql,oracle10g,Sql,Oracle,Plsql,Oracle10g,我有一个表gender,其中只有两个条目,只有这两个条目的行数为“男”和“女”。现在我想写一个程序来替换这两个值,输出如下 i/p o/p sex sex ------------------------ male female female male female male male female 我正在创建一个过程,这给了我一个错误,我正在使用游标获取超过1行..

我有一个表gender,其中只有两个条目,只有这两个条目的行数为“男”和“女”。现在我想写一个程序来替换这两个值,输出如下

i/p             o/p 

sex             sex
------------------------
male           female
female          male
female          male
male           female
我正在创建一个过程,这给了我一个错误,我正在使用游标获取超过1行..我知道我们可以通过只使用1个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; 

在您的情况下,我建议使用记录而不是获取:

CREATE OR REPLACE PROCEDURE swap ()
IS
    CURSOR cur_gender IS   
        SELECT * FROM gender;
     rec_gender cur_gender%ROWTYPE;

BEGIN
       FOR rec_gender IN cur_gender
    LOOP
       IF cur_gender%FOUND THEN    
            IF rec_gender.sex = 'male' THEN
                UPDATE gender set sex='female' 
                WHERE idgender = rec_gender.idgender;
            ELSE
                UPDATE gender set sex = 'male' 
                WHERE idgender = rec_gender.idgender;  
            END IF;
            -- COMMIT; --MAYBE?             
       END IF;
    END LOOP;
END swap;
/

你所拥有的东西有很多问题。PLS-00324的直接原因是v_gen是一条记录,因此您需要将该记录的字段与您的固定值进行比较,而不是将整个记录进行比较:

if v_gen='male'
变成

if v_gen.sex = 'male'
exit when cur_gender%notfound;
然后你有一个虚假的性别选择,看起来像是一个意外,需要完全删除

最后,您将%notfound应用于记录而不是光标:

exit when v_gen%notfound;
变成

if v_gen.sex = 'male'
exit when cur_gender%notfound;
好的,不是最后一个,因为正如其他人所注意到的,您的每个update语句都在更新表中的所有行,因此您最终将得到所有内容,无论是男性还是女性,这取决于它最后处理的是哪一行。您需要确定要更新的特定行。一种方法是将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; 
/

或者,您可以使用case而不是if来简化它:

。。。这与您已经知道的单更新语句方法非常接近。对于那个版本


您可以阅读更多有关更新和当前位置的信息。

甚至有一种简单的方法可以做到这一点。您可以在Oracle数据库中使用DECODE来执行此操作

UPDATE GENDER SET SEX = DECODE(SEX,'MALE','FEMALE','FEMALE','MALE');

上述查询将男性的性别更改为女性,女性的性别更改为男性

简单创建一个表,让它成为人

创建表peoplegender varchar210

在员工价值观中插入“&性别”; 假设i/p是男性,女性,女性,男性

从人物中选择*; 性别 男性的 女的 女的 男性的 从人群中选择性别、‘男性’、‘女性’、‘女性’、‘男性’性别; 性别 女的 男性的 男性的 女性

下面的查询在AWS红移中运行良好


Sql查询以继续此操作

UPDATE table SET gender =
(CASE  WHEN  gender ='male' THEN 'female' else 'male' END)

请使用此查询将男性更新为女性,将女性更新为男性。 参考图像

语法

    UPDATE <TABLE_NAME> set <COL_NAME> = (CASE <COL_NAME> WHEN '<DATA>' THEN'<DATA>' ELSE '<DATA>' END);

@parado PLS-00306调用“=”PLS-00324游标属性中的错误数字或参数类型可能不会应用于非游标“v_gen”不知道解决方案,但我会非常小心地更新所有行,因为您正在使用该语句。我假设这不是目的:更新性别集sex='femal'。顺便说一句,不要使用sms语言您要做的是:您只使用FETCH查看第一行。。然后更新所有行。我怀疑这是有意的…OP说我知道我们可以只使用1个更新状态来完成它。你使用光标到底是为了什么?声明v_gen gen gender.sex%type;光标cur_性别是从性别中选择性别;开始开放curu__;将cur_性别循环到v_gen中;如果v|gen='male',那么-dbms_output.put_line'It'is'| | v|gen;更新性别设置sex='female';elsif v|u gen='femal'然后-dbms_output.put|u line'It'is'| | v|gen;更新性别设置sex='male';如果结束;未找到当前性别%时退出;端环;封闭性;终止在这里,它可以工作,但如果第一行是男性,那么它会将男性设置为所有行,反之亦然,这是错误的:虽然此代码可能会回答问题,但提供有关此代码为什么和/或如何回答问题的附加上下文可以提高其长期价值。我建议您检查SO以及来自的全面信息。
/*Logic*/

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

/*Here NameGender is the name of the Table*/
update Employee
set Gender= case Gender when 'Male' then 'Female' when 'Female' then 'Male'
else 
Gender
end
update Table1 set gender = 
(
select case when gender = 'male' then 'female'
            when gender = 'female' then 'male' end
)
UPDATE table 
SET    gender = CASE gender 
                  WHEN 'Male' THEN 'Female' 
                  WHEN 'Female' THEN 'Male' 
                  ELSE gender 
                END; 
UPDATE table SET gender =
(CASE  WHEN  gender ='male' THEN 'female' else 'male' END)
    UPDATE <TABLE_NAME> set <COL_NAME> = (CASE <COL_NAME> WHEN '<DATA>' THEN'<DATA>' ELSE '<DATA>' END);
UPDATE users SET gender = (CASE gender WHEN 'Male' THEN 'Female' ELSE'Male' END);