str2 varchar2(100);
begin
  str2:='CLTX';--表名
  if cltxpro%isopen =false then
    open cltxpro for select HPHM,HPYS from ||str2;
    fetch cltxpro into hphms,hpyss;
  end if;
......
end;
表名作为变量,为什么编译出错?怎么样把str2作为表名加上去

解决方案 »

  1.   

    open cltxpro for select HPHM,HPYS from ||str2;
    错了,
    应该是
    open cltxpro for 'select HPHM,HPYS from' ||str2;
      

  2.   

    open cltxpro for select HPHM,HPYS from ||str2;
    改为
    open cltxpro for 'select HPHM,HPYS from '||str2;
      

  3.   

    谢谢,类似的
     sql_where := ' JGSJ between to_date('||vcBeginTime||',yyyy-mm-dd hh24:mi:ss) and to_date('||vcEndTime||',yyyy-mm-dd hh24:mi:ss)';
     为什么总是报缺少右括号?missing right parenthesis.是格式化要加单引号转义吗,怎么加?
      

  4.   

    因为少了引号sql_where := ' JGSJ between to_date('''||vcBeginTime||''',yyyy-mm-dd hh24:mi:ss) and to_date('''||vcEndTime||''',yyyy-mm-dd hh24:mi:ss)';
      

  5.   

    you should use binding variable
      

  6.   

    open cltxpro for select HPHM,HPYS from :tb using str2 ;
      

  7.   

    error,schema object can not using binding vaidable
      

  8.   


    字符串的拼接,两个单引号表示一个单引号你SQL里需要用到单引号在时间格式的设定上,即yyyy-mm-dd hh24:mi:ss
    sql_where := ' JGSJ between to_date('||vcBeginTime||','||'''yyyy-mm-dd hh24:mi:ss'''||') and to_date('||vcEndTime||','||'''yyyy-mm-dd hh24:mi:ss'''||')';
      

  9.   

    你的错误在哪暂且不论,你的写法是很不好的,如果你用绑定变量,还有这些什么缺少括号的问题吗?编写动态sql也简单多了,最重要的是常量是很不好的,导致sql不可共享,绑定变量的好处和缺点就不说了,asdeclare
     v_sql varchar2(1000):='select count(*) from product where product_date between :1 and :2';
     v_cnt number;
     begin
      execute immediate v_sql into v_cnt
      using to_date('201005','yyyymm'),to_date('20100601','yyyymmdd');
      dbms_output.put_line(v_cnt);
     end;
      

  10.   

    如果你非要用常量,关于引号的问题,我很不喜欢字符串中两引号表示一引号,如果拼凑很复杂,那引号就很乱,另外10g的q-quote我也用的不多,我比较喜欢chr(39),请看:
    declare
     v_sql varchar2(1000):='select count(*) from product';
     v_cnt number;
     v_start varchar2(10):='201005';
     v_end varchar2(10):='201006';
     v_whr varchar2(1000):=' where product_date between to_date('||v_start||','
                                               ||chr(39)||'yyyymm'||chr(39)||') and to_date(' ||v_end||','
                                               ||chr(39)||'yyyymm'||chr(39)||')';
     begin
     execute immediate v_sql||v_whr into v_cnt;
      dbms_output.put_line(v_cnt);
     end;