Sql 将列值从“男性”替换为“女性”,将“女性”替换为“男性”
我有一个表gender,其中只有两个条目,只有这两个条目的行数为“男”和“女”。现在我想写一个程序来替换这两个值,输出如下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行..
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);