declare
select_stat varchar2(100):='select * from emp where lower(ename)=lower(''&ename'')';
emp_record emp%ROWTYPE;
begin
execute immediate select_stat  INTO emp_record;
dbms_output.put_line(emp_record.ename||' '||emp_record.empno);
end;
/
注意了,其中的lower函数中一共是4的单引号啊!!!!
为什么这麽写呢??我换了其它形式都不行!!!

解决方案 »

  1.   

    转义字符,因为&name要求输入的是字符,应该为'&name',但是在字符串里,就要转移单引号,
    因此前面都有一个转义字符:单引号
      

  2.   


    嗯,你的意思我明白,相当于C中的"\\",但我直接输入值,为什么也错误???declare
    select_stat varchar2(100):='select * from emp where lower(ename)=lower('SMITH')';
    emp_record emp%ROWTYPE;
    begin
    execute immediate select_stat  INTO emp_record;
    dbms_output.put_line(emp_record.ename||' '||emp_record.empno);
    end;
    /
      2    3    4    5    6    7    8  select_stat varchar2(100):='select * from emp where lower(ename)=lower('SMITH')';
                                                                            *
    ERROR at line 2:
    ORA-06550: line 2, column 73:
    PLS-00103: Encountered the symbol "SMITH" when expecting one of the following:
    * & = - + ; < / > at in is mod remainder not rem
    <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_
    LIKE4_ LIKEC_ between || multiset member SUBMULTISET_
    The symbol "* was inserted before "SMITH" to continue.而这样就对:declare
    select_stat varchar2(100):='select * from emp where lower(ename)=lower(''SMITH'')';
    emp_record emp%ROWTYPE;
    begin
    execute immediate select_stat  INTO emp_record;
    dbms_output.put_line(emp_record.ename||' '||emp_record.empno);
    end;
    /
      2    3    4    5    6    7    8  SMITH 7369PL/SQL procedure successfully completed.

      

  3.   

    select_stat varchar2(100):='select * from emp where lower(ename)=lower('SMITH')';
    SMITH用在这应该用单引号引起来,而这个值又是嵌套在字符串里面单引号应该转译,所以应该是两个单引号才能发挥单引号的作用
      

  4.   

    'select * from emp where lower(ename)=lower(''SMITH'')'
    明白了,可以把这句分成3个字符串看,用java理解
    String temp="";
    temp="select * from emp where lower(ename)=lower("+"SMITH"+")"
    谢谢各位了!!!!!!!!!!!