初学oracle,要创建一个表,表名是在程序中由用户输入参数决定(如输入001),在程序中调用此存储过程,创建一个表,名为aaa001(aaa是固定的).然后向表中插入数据,加入一行数据,同时删除源数据表中对应的一行数据。目前只会创建表如下:
create or replace procedure pro_create is
begin
  execute immediate 'create table pflsjl201102     //这里想要做到表名后面的日期是通过程序输入可控的
  (
  cpdxdm int,
  cpdxmc varchar2(50),
  cprydm int,
  cpryxm varchar2(30),
  kkrwh int,
  bprydm int,
  bprymc varchar2(30),
  pjzbdm int,
  pjzbmc varchar2(200),
  pfdj number(12),
  pfsj date
  )';
end pro_create;另外一个问题就是,从别的表中选出数据插入新建的表,如 
insert into pflsjl201102 (cpdxdm,cpdxmc)
select dm,mc from cpdx;
但是要求数据是一条一条取出来,取一条删一条,这样的话是不是一定要用游标实现,还是有什么更简便的办法?请高手帮助,谢谢!

解决方案 »

  1.   

    这样OK?
    CREATE TABLE tabsrc(id NUMBER(5),sname VARCHAR2(50));
    INSERT INTO tabsrc SELECT LEVEL,dbms_random.string('P',8 ) FROM dual CONNECT BY LEVEL<=20;CREATE OR REPLACE PROCEDURE p001(p_tablename IN VARCHAR2) AS 
    v_id  tabsrc.id%TYPE;
    v_sname tabsrc.sname%TYPE;
    BEGIN
      execute IMMEDIATE 'create table aaa'||p_tablename||'(id number(5),sname varchar2(50))';  BEGIN 
        select id,sname INTO v_id,v_sname from tabsrc where rownum=1;
        EXCEPTION WHEN No_Data_Found THEN 
        raise_application_error(-20102,'** Thats no data in tabsrc now! **');
      END;
      Dbms_Output.put_line('value:'||v_id||v_sname);  execute IMMEDIATE 'insert into aaa'||p_tablename||' values ('''||v_id||''','''||v_sname||''')';
      IF SQL%ROWCOUNT=1 THEN 
        DELETE FROM tabsrc WHERE id=v_id AND sname=v_sname;
      END IF;
    END p001;EXEC p001('001');
    Line Pos Text
    23 PL/SQL block, executed in 0.047 sec.
    value:1|pSn%@~8
    Total execution time 0.047 sec.SELECT * FROM aaa001;
    ID SNAME
    1 |pSn%@~8
    SELECT Count(*) FROM tabsrc WHERE id=1 AND sname='pSn%@~8';
    COUNT(*)
    0
      

  2.   

    IF SQL%ROWCOUNT=1 THEN 
        DELETE FROM tabsrc WHERE id=v_id AND sname=v_sname;
      END IF;这个里面的SQL%是代表什么?rowcount 还有上面的rownum是怎么来的?
    最上面定义的那个表赋值'P'是在那里定义P的值的?还有最后两段是操作结果吧?为什么是pSn%@~8?
      

  3.   

    SQL%ROWCOUNT是返回上一条insert语句插入的记录数,只是用来判断下是否成功insert了..INSERT INTO tabsrc SELECT LEVEL,dbms_random.string('P',8 ) FROM dual CONNECT BY LEVEL<=20;
    P这里指任意字符,这句是随机生成20笔资料,这个造资料是个人用随机函数乱整的,不用在意。
    后两段分别是执行的命令和命令的输出结果,pSn%@~8只是上面随机函数造出来的一个sname,最后一句只是用来验证一下是否成功删除。
      

  4.   

    先完全按照你的建了表和存储过程。然后运行时报错
    ORA-00955:名称已由现有对象使用
    ORA-06512:在“TEST.P001”,line5就是execute IMMEDIATE 'create table aaa'||p_tablename||'(id number(5),sname varchar2(50))';
    这行不知道是什么问题呀?
    有人说是因为表已经存在了,我查看了下,确实是执行了建表,但是数据没有完全转移过去。我想可能是一些细节操作问题不对,不知道您知道我哪里存在问题吗
      

  5.   

    这样加一个commit..然后把之前生成的表全删了,再试一次
    commit;
    END p001;
      

  6.   

    这只是一个简单的原型,你要insert多条数据,可以改变条件就是
    比如
    insert into aaa'||p_tablename||' select 字段 from tabsrc where 条件'然后delete from tabsrc where 条件..
      

  7.   

    ‘insert into aaa'||p_tablename||' select id,sname from tabsrc';
    这样,可以全部插入了,就是后面的删除出现了问题。然后原表都没删
      

  8.   

    因为变成了插入多行,有个条件判断要改一下..
    IF SQL%ROWCOUNT>=1 THEN 
        DELETE FROM tabsrc;
      END IF;