sql:='create table tab_a as select id,name from '||v_tab1||' where class=09 and rownum<10';
execute immediatly sql;
这样可以执行,不会报错
sql:='create table tab_a as select id,name,count(*) cla from '||v_tab1||' where class=09 group by id,name';
execute immediatly sql;
不能执行,数值错误关键是表是一个变量,所以采用动态SQL 请大家看看要怎么改?

解决方案 »

  1.   

    declare
    v_sql varchar2(60);
    begin
    v_sql := 'create table test2 as select id,count(*) c from test group by id';
    execute immediate v_sql;
    end;execute immediatly你写错了.
    报数值错误,估计是你的变量sql长度不够,把它加大点.
    还有,不能把关键字sql作变量.
      

  2.   

    create or replace procedure app(tname in varchar2) is
      mysql varchar2(2000);
    begin
        mysql := 'create table abc as select a,count(*) cnt from '||tname||' group by a';   
        execute immediate mysql;
    end app;exec app('ab');ORA-01031: insufficient privileges
    ORA-06512: at "EOS.APP", line 9
    ORA-06512: at line 1grant create table to eos; select count(*) from abc;select count(*) from abcORA-00942: table or view does not existSQL> exec app('ab');PL/SQL procedure successfully completedSQL> select count(*) from abc;  COUNT(*)
    ----------
             3
      

  3.   

    3楼都告诉你了。赋个create权限OK了。
      

  4.   

    不是权限问题count(*) 查出来是单组分组函数只有一个结果而其他的查询字段是非单组函数是一行一行的
      

  5.   

    不是权限问题 我有权create table ,v_sql都定义成varchar2(10000)还是出同样的错
    新发现的问题 
    v_sql:='create table tab_a as select id,name from '||v_tab1||' where class=09 and rownum <10'; 
    execute immediate v_sql; 
    这样可以执行,不会报错,可是十行以上就是invaild number错误
    如果 class=08 rownum<13 ok,但是十三行以上就是invaild number错误; class=01 rownum<2 ok,但两行以上就是invaild number错误; 都是一列的,怎么会有这种区别?其实这是不是个问题都不太关键,关键是我需要的
    v_sql:='create table tab_a as select id,name,count(*) cla from '||v_tab1||' where class=09 group by id,name'; 
    execute immediate v_sql; tab_a没有什么结构(我不知道需要有什么结构),就只是create table ,class在表中的类型是VARCHAR(4),我没有用过程,3楼的我试了一下 不行耶
      

  6.   

    -->class在表中的类型是VARCHAR(4)-->where class=09这就是问题所在。我猜:
    where class='09'
    就OK
      

  7.   

    count(*) 是聚合函数,其他列为单值,一起使用必须用Group By 进行分组。
      

  8.   

    再补充全面一点
    declare 
     v_month varchar2(4);
     v_str varchar2(800);
     v_cn varchar2(4);
     begin
     if to_char(sysdate,'mm')>'07' then
       v_month:=to_char(sysdate,'mm')-'07';
     elsif to_char(sysdate,'mm')='01' then
       v_month:='6';
     else 
       v_month:=to_char(sysdate,'mm')-'01';
       end if;
       v_str:='create table tab_book as
    select id,class,count(*) sn
    from tab_sm'||v_month||
    ' where class=09
    group by id,class';
       execute immediate v_str;
     end;  错误 ORA-01722: INVAILD NUMBER
         ORA-06512: AT LINE 18PLSQL Developer中F8运行
    id的类型VARCHAR2(11),class的类型VARCHAR2(2)--(不好意思之前搞错了),tab_sm(×)表里还有number类型字段(不会因为这个吧)其实我就是想实现tab_sm表跟着月份变化,如果有其它的办法,请指教! 
      

  9.   

    -- TRY IT ..
    DECLARE
      V_MONTH VARCHAR2(4);
      V_STR   VARCHAR2(800);
      V_CN    VARCHAR2(4);
    BEGIN
      IF TO_NUMBER(TO_CHAR(SYSDATE, 'MM')) > 7 THEN
        V_MONTH := TO_NUMBER(TO_CHAR(SYSDATE, 'MM')) - 7;
      ELSIF TO_CHAR(SYSDATE, 'MM') = '01' THEN
        V_MONTH := 6;
      ELSE
        V_MONTH := TO_NUMBER(TO_CHAR(SYSDATE, 'MM')) - 1;
      END IF;
      V_STR := 'CREATE TABLE TAB_BOOK AS SELECT ID,CLASS,COUNT(*) SN FROM TAB_SM' || V_MONTH || ' WHERE CLASS='09' GROUP BY ID,CLASS';
      EXECUTE IMMEDIATE V_STR;
    END;
      

  10.   

    我看是
    where class=09 
    的错误,楼猪就是不去试试!create table tab_a as select id,name from '||v_tab1||' where class=09 and rownum <10;
    你把这个rownum<10去掉看看,会不会也出错的?
      

  11.   

    class是varchar(2)的,而你写成where class=09,相当于 where to_number(class)=09如果class有不是数字的记录,就会出错。
      

  12.   

    我要崩溃了 不对 还是不对 
    11楼
    去掉rownum 不管class=09 01 05 08 ...都出错 就是invaild number 加上rownum<不同的安全值(好像是在保护class的不出错)就可以执行重复一下:
    新发现的问题 
    v_sql:='create table tab_a as select id,name from '||v_tab1||' where class=09 and rownum <10'; 
    execute immediate v_sql; 
    这样可以执行,不会报错,(这是不是说明class=09 是可以这样的,而且整句)可是十行以上就是invaild number错误 
    如果 class=08 rownum <13 ok,但是十三行以上就是invaild number错误; class=01 rownum <2 ok,但两行以上就是invaild number错误
      

  13.   

    不能 用CLASS='09' 会报错
      

  14.   

    不能 用CLASS='09' 会报错 错误是ORA-06550:LINE113, CLUNM123
    PLS-00103:ENCONTERED THE SYMBOL"09" WHEN EXPECTING ON OF THE FLLOWING...BALABALA
      

  15.   

    sql:='create table tab_a as select id,name,count(*) cla from '||v_tab1||' where class=''09'' group by id,name'; 
    execute immediatly sql; 自已拼的单引号,要2个啊!看我上面的代码,09变成''09''
      

  16.   


    晕死,要有调试问题的方法。在执行不会报错的时候,desc tab_a,看看动态创建表的结构,是否与预期的一样 
      

  17.   

    你用了count(*)聚合函数,在select后面的字段要不就加在group by后面,,要不也要使用聚合函数