我有這樣的程式:
create or replace procedure tst
begin
execute immediate 'create table tb1 select 1 col from dual';
execute immediate 'create table tb2 select 1 col from dual';
insert into tb3 select 1 from dual;
execute immediate 'truncate table tb3';
--未指定的錯誤表。
execute immediate 'create table tb4 select 1 col from ';
execute immediate 'truncate table tb4';
end;
我需要創建一個表并在其中輸入所有在程序中執行的操作。類似于這樣的內容:
"txt" "dt" "name procedure"
程式開始 20.09.2021 15:12:11 tst
table tb1 created 20.09. 2021 15:12:11 tst
table tb2 created 20.09. 2021 15:12:12 tst
insert into tb3 20.09。 2021 15:12:14 tst
truncate tab3 20.09. 2021 15:12:16 tst
錯誤 table not specified 20. 09.2021 15:12:16 tst
謝謝!
uj5u.com熱心網友回復:
你可以創建這樣一個表
CREATE TABLE log_ops( txt VARCHAR2(400)。dt DATE, proc_name VARCHAR2(40))。)
和存盤程序有一個嵌套的存盤程序,以便記錄相關的步驟,如
CREATE OR REPLACE PROCEDURE tst AS
v_ddl VARCHAR2(150)。
v_prc VARCHAR2(40) := $$PLSQL_UNIT;
PROCEDURE pr_ins(i_txt VARCHAR2) IS
pragma autonomous_transaction;
BEGIN
INSERT INTO log_ops VALUES(i_txt,SYSDATE,v_prc)。
COMMIT;
END。
BEGIN; BEGIN
pr_ins('程序開始')。
v_ddl := 'CREATE TABLE tb1 SELECT 1 col FROM dual';
EXECUTE IMMEDIATE v_ddl;
pr_ins('table tb1 created')。
v_ddl := 'CREATE TABLE tb2 SELECT 1 col FROM dual' ;
EXECUTE IMMEDIATE v_ddl;
pr_ins('table tb2 created')。
INSERT INTO tb3 SELECT 1 FROM dual。
pr_ins('insert into tb3')。
v_ddl := 'TRUNCATE TABLE tb3'。
EXECUTE IMMEDIATE v_ddl;
pr_ins('truncate tab3')。
v_ddl := 'CREATE TABLE tb4 SELECT 1 col FROM...' ;
EXECUTE IMMEDIATE v_ddl;
pr_ins('error table not specified')。
v_ddl := 'TRUNCATE TABLE tb4'。
EXECUTE IMMEDIATE v_ddl;
pr_ins('truncate tab4')。
EXCEPTION WHEN others THEN pr_ins('error : '||sqlerrm) 。
END。
uj5u.com熱心網友回復:
這是你可以做的一種方法:
在編譯tst之前,tb3需要存在,否則程式tst將永遠無法編譯。
create table tb3 as select 1 col from dual。
創建 表 tb_log
( id NUMBERATED ALWAYS AS IDENTITY PRIMARY KEY
, txt VARCHAR2(100)
, proc VARCHAR2(100)
,create_date DATE。
);
現在創建一個存盤程序tst。注意,每個可能出錯的陳述句都必須放在自己的塊中,并且需要捕獲例外。否則,它將在第一個錯誤后停止執行。
創建 或替換程式 tst
as
procedure logit(txt_i tb_log.txt%TYPE)
IS
BEGIN
INSERT INTO tb_log(txt, proc, create_date)
VALUES (txt_i, $$plsql_unit, sysdate);
END logit;
begin
logit('process started')。
BEGIN
execute immediate 'create table tb1 as select 1 col from dual';
logit('table tb1 created')。
例外 WHEN OTHERS THEN
logit('table tb1 created ERROR: '||SQLERRM)。
END;
BEGIN; BEGIN?
execute immediate 'create table tb2 as select 1 col from dual';
logit('table tb2 created')。
例外 WHEN OTHERS THEN
logit('table tb2 created ERROR: '||SQLERRM)。
END。
--這將會失敗,如果
insert into tb3 select 1 from dual;
logit('insert into tb3 select 1 from dual')。
execute immediate 'truncate table tb3';
logit('truncate tb3')。
--未指定錯誤表。
BEGIN
execute immediate 'execute immediate create table tb4 as select 1 col from'/span>;
logit('table tb4 created')。
例外 WHEN OTHERS THEN
logit('table tb4 created ERROR: '||SQLERRM)。
END。
BEGIN; BEGIN?
execute immediate 'truncate table tb4';
logit('truncate table tb4')。
例外 WHEN OTHERS THEN
logit('truncate table tb4 ERROR: '||SQLERRM) 。
END。
end;
/
運行它并檢查結果:
BEGIN
tst;
END;
/
select * from tb_log;
1 procedure started TST 20-SEP-2021
2 table tb1 created TST 20-SEP-2021
3 table tb2創建了TST 20- SEP-2021
4 insert into tb3 select 1 from dual TST 20- SEP-2021
5 truncate tb3 TST 20- SEP-2021
6 table tb4 created ERROR: ORA-00900: invalid SQL陳述句 TST 20-SEP-2021
7 truncate table tb4 ERROR: ORA-00942。table or view does not存在TST 20-SEP-2021
注意你代碼中的語法錯誤。CREATE TABLE tb1 SELECT 1 col1 FROM DUAL將引發例外ORA-00922: missing or invalid option。正確的語法是CREATE TABLE tb1 AS SELECT 1 col1 FROM DUAL(注意關鍵字AS)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324991.html
標籤:
上一篇:用特殊的排序號進行排序
下一篇:當值發生變化時,增量為1
