oracle的存储过程中新建表后,怎么往表里面插入数据。

我们如果想在oracle存储过程中新建表后往表里插入数据,可能会这样写。其中i为前面定义的number变量。可以看到我想在新建的表的第一列插入其他的表的字段的数据user_id。然后在第二列插入-1这个值。

--yidongming@20160706 
select count(*) into i from user_tables where table_name='CERT_USERS_IN_SYSTYPE';
if i=0 then
execute immediate
'create table CERT_USERS_IN_SYSTYPE(
USER_ID NUMBER(6,0) NOT NULL,
SYS_TYPE NUMBER(6,0) NOT NULL,
constraint PK_US primary key (USER_ID,SYS_TYPE)
)';
COMMIT;
END IF;

--yidongming@20160720 初始化CERT_USERS_IN_SYSTYPE表
select count(*) into i from CERT_USERS_IN_SYSTYPE;
if i=0 then
INSERT INTO cert_users_in_sysType
SELECT cui.user_id,'-1' FROM cert_user_info cui WHERE cui.deleted=0;
COMMIT;
END IF;

当他们分开执行时,先执行第一个,再第二个,是没有问题的,如果将插入表的语句直接写在创建表之后,都放在一个存储过程中,执行脚本会报错,提示说该表不存在。原因就是insert这个语句在执行时会检查分析,这时候的表还没有创建。所以报错了。所以将insert语句用execute immediate的方式执行可以避开检查。执行结果也是成功的。下面是修改过的语句。
declare
i number;
begin
--yidongming@20160829 
select count(*) into i from user_tables where table_name='CERT_USERS_IN_SYSTYPE';
if i=0 then
execute immediate
'create table CERT_USERS_IN_SYSTYPE(
USER_ID NUMBER(6,0) NOT NULL,
SYS_TYPE NUMBER(6,0) NOT NULL,
constraint PK_US primary key (USER_ID,SYS_TYPE)
)';
execute immediate'
INSERT INTO cert_users_in_sysType (user_id,sys_type)
SELECT cui.user_id,''-1'' FROM cert_user_info cui WHERE cui.deleted=0';
commit;
end if;

commit;
end ;
如果没看懂的或者有疑问的欢迎留言。如果有错误也欢迎指出,谢谢!

猜你喜欢

转载自blog.csdn.net/u010102390/article/details/52355067