DECLARE
v_sTest01 varchar2(32) := 'default01';
v_sTest02 varchar2(32) := 'default02';
v_sTest03 varchar2(32) := 'default03';
v_sTmp varchar2(32) := 'Tmp';
BEGIN
select test01,
case
when v_sTmp = 'Tmp' then
test02
else
test03
end
into v_sTest01,
case when v_sTmp = 'Tmp' then --这里报错了错误如下图
v_sTest02
else
v_sTest03
end
from test
where test01 = '1'
and test02 = '2'
and test03 = '3';
dbms_output.put_line('v_sTest01:' || v_sTest01);
dbms_output.put_line('v_sTest02:' || v_sTest02);
dbms_output.put_line('v_sTest03:' || v_sTest03);
END;
我想肯定是编译时不支持这种语法,但是请说清楚为什么不支持,最好能说1个这个SQL编译的过程,谢谢
v_sTest01 varchar2(32) := 'default01';
v_sTest02 varchar2(32) := 'default02';
v_sTest03 varchar2(32) := 'default03';
v_sTmp varchar2(32) := 'Tmp';
BEGIN
select test01,
case
when v_sTmp = 'Tmp' then
test02
else
test03
end
into v_sTest01,
case when v_sTmp = 'Tmp' then --这里报错了错误如下图
v_sTest02
else
v_sTest03
end
from test
where test01 = '1'
and test02 = '2'
and test03 = '3';
dbms_output.put_line('v_sTest01:' || v_sTest01);
dbms_output.put_line('v_sTest02:' || v_sTest02);
dbms_output.put_line('v_sTest03:' || v_sTest03);
END;
我想肯定是编译时不支持这种语法,但是请说清楚为什么不支持,最好能说1个这个SQL编译的过程,谢谢
不能把test01和test02或test01和test03 的查询结果放到一个变量中啊!
你只声明一个v_sTest01。应该使用2个变量接收v_sTest01,v_sTest02.
case when v_sTmp = 'Tmp' then --这里报错了错误如下图
v_sTest02
else
v_sTest03
end
这一段代码就是申明第二个接收值的变量呀
我的原意是
根据第一个case查询的字段的值
插入与第二个case判断出来的变量中
(
test01 varchar2(30),
test02 varchar2(30),
test03 varchar2(30)
);
insert into test values('1','2','3');
表结构
数据就一条
想要的结果是
如果 v_sTmp 为'Tmp'
那么test02的数据插到v_sTest02
如果 v_sTmp 不为'Tmp'
那么test03的数据插到v_sTest03PS:上面2个case里面的判断我会一直保持一致 也就是上面一个case怎么判断,我下面就怎么判断.
v_sTest01 varchar2(32) := 'default01';
v_sTest02 varchar2(32) := 'default02';
v_sTest03 varchar2(32) := 'default03';
v_sTmp varchar2(32) := 'Tmp';
BEGIN
select test01, decode(v_sTmp,'Tmp',test02,null),decode(v_sTmp,'Tmp',null,test03)
into v_sTest01,v_sTest02,v_sTest03
from test
where test01 = '1' and test02 = '2' and test03 = '3' ;
dbms_output.put_line('v_sTest01:' || v_sTest01);
dbms_output.put_line('v_sTest02:' || v_sTest02);
dbms_output.put_line('v_sTest03:' || v_sTest03);
END;
SQL> set serveroutput on
SQL>
SQL> DECLARE
2 v_sTest01 varchar2(32) := 'default01';
3 v_sTest02 varchar2(32) := 'default02';
4 v_sTest03 varchar2(32) := 'default03';
5 v_sTmp varchar2(32) := 'Tmp';
6 BEGIN
7 select test01, decode(v_sTmp,'Tmp',test02,null),decode(v_sTmp,'Tmp',null,test03)
8 into v_sTest01,v_sTest02,v_sTest03
9 from test
10 where test01 = '1' and test02 = '2' and test03 = '3' ;
11
12 dbms_output.put_line('v_sTest01:' || v_sTest01);
13 dbms_output.put_line('v_sTest02:' || v_sTest02);
14 dbms_output.put_line('v_sTest03:' || v_sTest03);
15 END;
16 /v_sTest01:1
v_sTest02:2
v_sTest03:PL/SQL procedure successfully completed
DECLARE
v_sTest01 varchar2(32) := 'default01';
v_sTest02 varchar2(32) := 'default02';
v_sTest03 varchar2(32) := 'default03';
v_sTmp varchar2(32) := 'Tmp';
BEGIN
select test01 into v_sTest01 from test
where test01 = '1'
and test02 = '2'
and test03 = '3';
if v_sTmp = 'Tmp'
then
select test02 into v_sTest02 from test
where test01 = '1'
and test02 = '2'
and test03 = '3';
end if;
if v_sTmp <> 'Tmp'
then
select test03 into v_sTest03 from test
where test01 = '1'
and test02 = '2'
and test03 = '3';
end if;
dbms_output.put_line('v_sTest01:' || v_sTest01);
dbms_output.put_line('v_sTest02:' || v_sTest02);
dbms_output.put_line('v_sTest03:' || v_sTest03);
END; 一句的等去公司做。
DECLARE
v_sTest01 varchar2(32) := 'default01';
v_sTest02 varchar2(32) := 'default02';
v_sTest03 varchar2(32) := 'default03';
v_sTmp varchar2(32) := 'Tmp';
BEGIN
select test01,
case
when v_sTmp = 'Tmp' then
test02
else
'default02'
end
into v_sTest02,
case when v_sTmp = 'Tmp' then
'default03'
else
v_sTest03
end
into v_sTest03
from test
where test01 = '1'
and test02 = '2'
and test03 = '3';
dbms_output.put_line('v_sTest01:' || v_sTest01);
dbms_output.put_line('v_sTest02:' || v_sTest02);
dbms_output.put_line('v_sTest03:' || v_sTest03);
END;
SQL> DECLARE
2 v_sTest01 varchar2(32) := 'default01';
3 v_sTest02 varchar2(32) := 'default02';
4 v_sTest03 varchar2(32) := 'default03';
5 v_sTmp varchar2(32) := 'Tmp';
6 BEGIN
7 select test01,
8 case
9 when v_sTmp = 'Tmp' then
10 test02
11 else
12 'default02'
13 end ,
14 case when v_sTmp = 'Tmp' then
15 'default03'
16 else
17 v_sTest03
18 end
19 into v_sTest01,v_sTest02,v_sTest03
20 from test
21 where test01 = '1'
22 and test02 = '2'
23 and test03 = '3';
24
25 dbms_output.put_line('v_sTest01:' || v_sTest01);
26 dbms_output.put_line('v_sTest02:' || v_sTest02);
27 dbms_output.put_line('v_sTest03:' || v_sTest03);
28 END;
29
30 /v_sTest01:1
v_sTest02:2
v_sTest03:default03PL/SQL procedure successfully completed
可能8楼说到点子上了
into只能带变量,不能有动态语句
11楼虽然实现的方式比较多,但是最终还是在into 的那一环节使用了变量而不的动态的 .
总之辛苦了,谢谢