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 ;
如果沒看懂的或者有疑問的歡迎留言。如果有錯誤也歡迎指出,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章