我正在尝试使用ORACLE版本11更新具有多个varchar列的表:
UPDATE EXAMPLE_TABLE SET PARAMS =
'{ '
||'params:{p1: {'
||'p2:\"' || P2 ||'\",'
||'p3:\"' || P3 ||'\",'
||'p4:\"' || P4 ||'\",'
||'p5: [\"' || PROBLEM_HERE ||'\"],'
||'}}}'
WHERE P6='1';
在“ PROBLEM_HERE”变量中,我需要放置一个字符串,例如“ F1”,“ F2”,“ F3”,“ F4”或“ F1”或“ F3”,甚至是“” ...
所以我做了一个IF语句来构建该字符串:
IF P7 != 0 THEN
pvalues := '\"'|| op1 ||'\"';
IF P8 != 0 THEN
pvalues := pvalues || ',\"'|| op2 ||'\"';
IF AG_PERM_MOVER_RESELLER != 0 THEN
pvalues := pvalues || ',\"'|| op3 ||'\"';
IF AG_PERMI_AUTO_EDIT != 0 THEN
pvalues := pvalues || ',\"'|| op4 ||'\"';
END IF;
END IF;
END IF;
END IF;
有什么主意,如果将其放在更新中怎么办? 仅光标?
答案 0 :(得分:1)
我不太了解“ PROBLEM_HERE”变量是什么,但是假设您的IF可以执行您想要的操作,则可以嵌套CASE条件,如下所示:
Excel.Worksheet.getRanges()
只需将其PROBLEM_HERE替换为更新中的嵌套案例,就像这样:
with example_table_set (p7, p8, ag_perm_mover_reseller, ag_permi_auto_edit, op1, op2, op3, op4) as (
select 1, 2, 3, 4, 'A', 'B', 'C', 'D'from dual union all
select 1, 2, 0, 4, 'A', 'B', 'C', 'D'from dual union all
select 0, 2, 3, 4, 'L', 'M', 'N', 'O' from dual
) --
select case when p7 != 0
then '\"'|| op1 ||'\"' ||
case when p8 != 0
then ',\"'|| op2 ||'\"' ||
case when ag_perm_mover_reseller != 0
then ',\"'|| op3 ||'\"' ||
case when ag_permi_auto_edit != 0
then ',\"'|| op4 ||'\"'
end
end
end
end
from example_table_set;
答案 1 :(得分:1)
declare
pvalues varchar2(4000);
p7 number;
p8 number;
op1 varchar2(40);
op2 varchar2(40);
op3 varchar2(40);
op4 varchar2(40);
ag_perm_mover_reseller number;
ag_permi_auto_edit number;
begin
-- do you if here
if p7 != 0
then
pvalues := '\"'|| op1 ||'\"';
if p8 != 0
then
pvalues := pvalues || ',\"'|| op2 ||'\"';
if ag_perm_mover_reseller != 0
then
pvalues := pvalues || ',\"'|| op3 ||'\"';
if ag_permi_auto_edit != 0
then
pvalues := pvalues || ',\"'|| op4 ||'\"';
end if;
end if;
end if;
end if;
-- do your update here
UPDATE example_table
SET params = '{ '
||'params:{p1: {'
||'p2:\"' || p2 ||'\",'
||'p3:\"' || p3 ||'\",'
||'p4:\"' || p4 ||'\",'
||'p5: [\"' || pvalues ||'\"],'
||'}}}'
WHERE p6='1';
commit;
exception
when others then
rollback;
-- do something about the error
end;
/
答案 2 :(得分:0)
您不必。创建一个Pl / SQL匿名块,例如:
declare
pvalues VARHCAR2(4000);
begin
-- do you if here
-- do your UPDATE here
UPDATE EXAMPLE_TABLE
SET PARAMS = pvalues
WHERE P6='1';
COMMIT;
exception
when others then
rollback;
-- do something about the error
end;
/