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 请大家看看要怎么改?
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 请大家看看要怎么改?
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作变量.
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
新发现的问题
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楼的我试了一下 不行耶
where class='09'
就OK
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表跟着月份变化,如果有其它的办法,请指教!
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;
where class=09
的错误,楼猪就是不去试试!create table tab_a as select id,name from '||v_tab1||' where class=09 and rownum <10;
你把这个rownum<10去掉看看,会不会也出错的?
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错误
PLS-00103:ENCONTERED THE SYMBOL"09" WHEN EXPECTING ON OF THE FLLOWING...BALABALA
execute immediatly sql; 自已拼的单引号,要2个啊!看我上面的代码,09变成''09''
晕死,要有调试问题的方法。在执行不会报错的时候,desc tab_a,看看动态创建表的结构,是否与预期的一样