日期:2014-05-17  浏览次数:20876 次

oracle存储过程创建一个表名由程序输入的表
初学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;
但是要求数据是一条一条取出来,取一条删一条,这样的话是不是一定要用游标实现,还是有什么更简便的办法?

请高手帮助,谢谢!

------解决方案--------------------
这样OK?
SQL code
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

------解决方案--------------------
探讨
引用:

引用:

引用:

这样OK?
SQL code
CREATE TABLE tabsrc(id NUMBER(5),sname VARCHAR2(50));
INSERT INTO tabsrc SELECT LEVEL,dbms_random.string('P',8 ) FROM dual CONNECT BY LEV……

------解决方案--------------------
探讨

引用:

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

然后delete from tabsrc where 条件..

‘insert into aaa'||p_tablename||' select ……