declare
type t_cur is ref cursor;
c_sign_stat t_cur;
strSQL VARCHAR2(100);
namemp varchar2(100):='ALLEN';
tmp_sql varchar2(100):='deptno=''10'' and ename='||namemp||' or JOB=''SALESMAN''';rec_gd_sign_in_tab    emp%rowtype;begin
strSQL:='SELECT * FROM emp WHERE sal IS NOT NULl and ' || tmp_sql;
open c_sign_stat for strSQL;
loop
fetch  c_sign_stat into rec_gd_sign_in_tab ;
exit when  c_sign_stat %notfound;
/*写要取游标中的一条一条数据的代码*/
dbms_output.put_line(rec_gd_sign_in_tab.empno);
end loop;
close c_sign_stat;
end;为什么老是报 标识符无效的错误,到底怎么拼接成字符串啊。特别是打几个单引号,比如:变量,常量的时候,混用的时候。

解决方案 »

  1.   

    declare
    type t_cur is ref cursor;
    c_sign_stat t_cur;
    strSQL VARCHAR2(100);
    namemp varchar2(100):='ALLEN';
    --tmp_sql varchar2(100):='deptno=''10'' and ename='||namemp||' or JOB=''SALESMAN'''
    --上面是你的 就是在namemp这里少了两个引号,这样你的语句就是ename=ALLEN,而不是ename='ALLEN'
    --建议你如果不清楚你的拼接语句,你可以用dbms_output.put_line()打印出来
    tmp_sql varchar2(100):='deptno=''10'' and ename='''||namemp||''' or JOB=''SALESMAN''';
    rec_gd_sign_in_tab    emp%rowtype;
    begin
    strSQL:='SELECT * FROM emp WHERE sal IS NOT NULl and ' || tmp_sql;
    open c_sign_stat for strSQL;
    loop
    fetch  c_sign_stat into rec_gd_sign_in_tab ;
    exit when  c_sign_stat %notfound;
    /*写要取游标中的一条一条数据的代码*/
    dbms_output.put_line(rec_gd_sign_in_tab.empno);
    end loop;
    close c_sign_stat;
    end;
      

  2.   


    declare
    type t_cur is ref cursor;
    c_sign_stat t_cur;
    strSQL VARCHAR2(100);
    namemp varchar2(100):='ALLEN';
    tmp_sql varchar2(100):='deptno=''10'' and ename='''||namemp||''' or JOB=''SALESMAN''';  --这里ename字串拼接错了,要加单引号rec_gd_sign_in_tab    emp%rowtype;begin
    strSQL:='SELECT * FROM emp WHERE sal IS NOT NULl and ' || tmp_sql;
    open c_sign_stat for strSQL;
    loop
    fetch  c_sign_stat into rec_gd_sign_in_tab ;
    exit when  c_sign_stat %notfound;
    /*写要取游标中的一条一条数据的代码*/
    dbms_output.put_line(rec_gd_sign_in_tab.empno);
    end loop;
    close c_sign_stat;
    end;  PL/SQL block, executed in 0.078 sec.
       7499                                
       7521                                
       7654                                
       7844                                
       7955                                
       Total execution time 0.094 sec.     
      

  3.   

    建議用綁定變量的方法declare
    type t_cur is ref cursor;
    c_sign_stat t_cur;
    strSQL VARCHAR2(100);
    namemp varchar2(100):='ALLEN';
    v_deptno varchar2(10) := '10';
    v_jobno varchar2(20) := 'SALESMAN';
    tmp_sql varchar2(100):='deptno=:dn and ename=:en or JOB=:jb';rec_gd_sign_in_tab    emp%rowtype;begin
    strSQL:='SELECT * FROM emp WHERE sal IS NOT NULl and ' || tmp_sql;
    open c_sign_stat for strSQL using v_deptno,namemp,v_jobno;
    loop
    fetch  c_sign_stat into rec_gd_sign_in_tab ;
    exit when  c_sign_stat %notfound;
    /*写要取游标中的一条一条数据的代码*/
    dbms_output.put_line(rec_gd_sign_in_tab.empno);
    end loop;
    close c_sign_stat;
    end;
      

  4.   


    tmp_sql varchar2(100):='deptno=''10'' and ename='||namemp||' or JOB=''SALESMAN''';改成tmp_sql varchar2(100):='deptno=''10'' and ename='''||namemp||''' or JOB=''SALESMAN''';
    namemp varchar2(100):='ALLEN'; 这个拼接进去的是allen 
      

  5.   

    再问一个问题 , 用   with  as  ()和动态SQL 效果一样吗?
      

  6.   

    'deptno=:dn and ename=:en or JOB=:jb'  这个里面的 dn,en,jb 随便取名字吗?
      

  7.   

    再问一个问题 , 用 with as ()和动态SQL 效果一样吗?   执行速度上 谁快点?
      

  8.   

    with as 快些 
    动态的要多了软分析的时间 
      

  9.   


    如果我参数很多,而且有很多重复的,怎么处理啊。 对应着一个一个传 很麻烦啊。能不能用参数指代?
    随便举个例子  using dn:=v_deptno,en:=namemp,v_jobno;