初学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;
但是要求数据是一条一条取出来,取一条删一条,这样的话是不是一定要用游标实现,还是有什么更简便的办法?请高手帮助,谢谢!
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;
但是要求数据是一条一条取出来,取一条删一条,这样的话是不是一定要用游标实现,还是有什么更简便的办法?请高手帮助,谢谢!
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
DELETE FROM tabsrc WHERE id=v_id AND sname=v_sname;
END IF;这个里面的SQL%是代表什么?rowcount 还有上面的rownum是怎么来的?
最上面定义的那个表赋值'P'是在那里定义P的值的?还有最后两段是操作结果吧?为什么是pSn%@~8?
P这里指任意字符,这句是随机生成20笔资料,这个造资料是个人用随机函数乱整的,不用在意。
后两段分别是执行的命令和命令的输出结果,pSn%@~8只是上面随机函数造出来的一个sname,最后一句只是用来验证一下是否成功删除。
ORA-00955:名称已由现有对象使用
ORA-06512:在“TEST.P001”,line5就是execute IMMEDIATE 'create table aaa'||p_tablename||'(id number(5),sname varchar2(50))';
这行不知道是什么问题呀?
有人说是因为表已经存在了,我查看了下,确实是执行了建表,但是数据没有完全转移过去。我想可能是一些细节操作问题不对,不知道您知道我哪里存在问题吗
commit;
END p001;
比如
insert into aaa'||p_tablename||' select 字段 from tabsrc where 条件'然后delete from tabsrc where 条件..
这样,可以全部插入了,就是后面的删除出现了问题。然后原表都没删
IF SQL%ROWCOUNT>=1 THEN
DELETE FROM tabsrc;
END IF;