select *from emp
where
job=decode(3,2,'MANAGER','SALESMAN');
=======================================================
这条语句本来是当(3==2)为真时 :job=‘MANAGER’,为假时:job='SALESMAN'
现在想为假时 选出所有job  该怎么修改?不用动态语句

解决方案 »

  1.   

    select decode(3,2,'MANAGER','SALESMAN')  from emp
     其实你按你的要求,就是取所有语句,然后把3==2的替换掉,所以
      

  2.   

    select case  when (3==2) then 'MANAGER' else job end job from emp
    刚才错了
      

  3.   


    --根据意思应是这样子
    select * from emp
    where (3=2 and job='MANAGER') or (3<>2 and job='SALESMAN');
    --但是3=2不可能成立,因此也可以写为这样子
    select * from emp where job='SALESMAN';
    --所以你的3=2因该换成其他有意义的条件才合时
      

  4.   

    可能我没把目的说清楚,我再补充下
    ====================================================================
    create or replace procedure var_select(
    name in varchar2)
    is
        emp_rec emp%rowtype;
    begin
        select *from emp into empo_rec
        where
        job=decode(name,'test1','MANAGER','SALESMAN');
    end;
    =====================================================================
    目的就是根据传入的name选择不同的数据,即选择条件不同
    补充:job不是抽出字段,而是选择条件
     
      

  5.   

    create or replace procedure var_select(
    name in varchar2)
    is
      emp_rec emp%rowtype;
    begin
      select * into emp_rec from emp 
      where
      job=decode(name,'test1','MANAGER','SALESMAN');
    end;
      

  6.   

    create or replace procedure var_select(
    name in varchar2)
    is
      emp_rec emp%rowtype;
    begin
      select * into emp_rec from emp  
      where
      job=decode(name,'test1','MANAGER','');
    end; 只要job is not null 就可以这样
      

  7.   

    6楼你能负责任一点吗,起码你自己跑一遍吧?
    ==================================================================================
    代码:
    create or replace procedure var_select(
    name in varchar2)
    is
      type emp_rec_type is table of emp%rowtype;
      emp_rec emp_rec_type;
      cursor v_emp is
             select *  from emp 
             where
             job=decode(name,'test1','MANAGER','');
    begin
      open v_emp;
      fetch v_emp bulk collect into emp_rec;
      for i in 1..emp_rec.count loop
          dbms_output.put_line(emp_rec(i).deptno);
      end loop; 
      close v_emp;
      commit;
    end;
    ===========================================================================
    你自己跑跑看看
      

  8.   


    SQL> create or replace procedure var_select(
      2  p_name in varchar2)
      3  is
      4   emp_rec emp%rowtype;
      5   cursor cur is select * from emp
      6   where job=decode(p_name,'test1','MANAGER','SALESMAN');
      7  begin
      8      open cur;
      9      loop
     10   fetch cur into emp_rec;
     11   exit when cur%notfound;
     12   dbms_output.put_line('empno:'||emp_rec.empno);
     13   end loop;
     14   close cur;
     15  end;
     16  /过程已创建。SQL> exec var_select('test1');
    empno:7566                                                                      
    empno:7698                                                                      
    empno:7782                                                                      PL/SQL 过程已成功完成。SQL> exec var_select('test2');
    empno:7499                                                                      
    empno:7521                                                                      
    empno:7654                                                                      
    empno:7844                                                                      PL/SQL 过程已成功完成。
      

  9.   

    8 l 代码都是我的吧, 你只不过把我想让6 l自己验证的填上了而已你们写代码着这么粗心吗?
    我的问题我自己已经解决了,整理一下希望对有相同要求的童鞋有所帮助
    ================================================================================
    码:
    create or replace procedure var_select(
    name in varchar2)
    is
      type emp_rec_type is table of emp%rowtype;
      emp_rec emp_rec_type;
      cursor v_emp is
      select * from emp  
      where
      job like decode(name,'test1','MANAGER','%');
    begin
      open v_emp;
      fetch v_emp bulk collect into emp_rec;
      for i in 1..emp_rec.count loop
      dbms_output.put_line(emp_rec(i).deptno);
      end loop;  
      close v_emp;
      commit;
    end;
    =================================================================================
    目的:
    这条语句本来是当(name='test1')为真时 ,抽出条件job=‘MANAGER’;
                                     为假时, 抽出条件:所有job 
    ==================================================================================
    运行结果:连接到: 
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining optionsSQL> set serveroutput on;
    SQL> exec var_select('test1');
    20
    30
    10PL/SQL 过程已成功完成。SQL> exec var_select('test2');
    20
    30
    30
    20
    30
    30
    10
    20
    10
    30
    20
    30
    20
    10PL/SQL 过程已成功完成。SQL> 
    ===============================================================================
    我希望大家回答问题时认真一点。知道你们都很忙,能看我的问题已经不错。不过答非所问让我很不舒服