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编译的过程,谢谢

解决方案 »

  1.   

     问题很简单
       不能把test01和test02或test01和test03 的查询结果放到一个变量中啊!
       你只声明一个v_sTest01。应该使用2个变量接收v_sTest01,v_sTest02.
      

  2.   

    我的
    case               when v_sTmp = 'Tmp' then    --这里报错了错误如下图 
                      v_sTest02 
                  else 
                      v_sTest03 
              end 
    这一段代码就是申明第二个接收值的变量呀
    我的原意是
    根据第一个case查询的字段的值
    插入与第二个case判断出来的变量中
      

  3.   

    create table test
    (
        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怎么判断,我下面就怎么判断.
      

  4.   

    DECLARE 
        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
      

  5.   

    谢谢6楼,但是into这个地方,我也想动态一点,就像我主贴上面的例子一样.
      

  6.   

    做个无脑的:
    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; 一句的等去公司做。
      

  7.   

    试试这个,一句的。没测试。
    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; 
      

  8.   

    我又来了~
    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
      

  9.   

    我先结贴给分吧
    可能8楼说到点子上了
    into只能带变量,不能有动态语句
    11楼虽然实现的方式比较多,但是最终还是在into 的那一环节使用了变量而不的动态的 .
    总之辛苦了,谢谢