想要弄一個觸發器,發現表欄位太多了,我想對插入的資料進行備份,又不想書寫那么多欄位,所以想通過系統表查詢出欄位來進行拼裝,然后發現這個觸發器不能正常作業,這是為什么呢?是不是":new.xxx"這種形式是不是在字串中以后,執行的時候就出錯了?一直提示不是所有變數都已系結,不是很理解,請問有什么辦法能夠實作題目所說的這種自動拼接(:new.xxx)的方法么?
create or replace trigger "inspect_tasks"
before delete or insert on tasks
for each row
declare
v_sql varchar2(2000);
v_str varchar2(2000);
begin
if deleting then
v_sql :='select ''insert into tasks_cache ('' || wm_concat(t.column_name) || '') values ('' || wm_concat(''decode(:old.'' || t.column_name || '',null,'''''''',:old.'' || t.column_name || '')'') || '');'' from user_tab_columns t where t.table_name = upper(''tasks'')';
elsif :new.task_id is not null then
v_sql :='select ''insert into tasks_cache ('' || wm_concat(t.column_name) || '') values ('' || wm_concat(''decode(:new.'' || t.column_name || '',null,'''''''',:new.'' || t.column_name || '')'') || '');'' from user_tab_columns t where t.table_name = upper(''tasks'')';
end if;
dbms_output.put_line(v_sql);
execute immediate v_sql into v_str;
dbms_output.put_line(v_str);
execute immediate v_str;
exception when others then
dbms_output.put_line(sqlerrm);
dbms_output.put_line(v_str);
end;
uj5u.com熱心網友回復:
你的動態拼接好像有問題;你單獨出來執行,
declare vv_sql varchar2(1000);就發現了。
begin
vv_sql :='select ''insert into tasks_cache ('' || wm_concat(t.column_name) || '') values ('' || wm_concat(''decode(:new.'' || t.column_name || '',null,'''''''',:new.'' || t.column_name || '')'') || '');'' from user_tab_columns t where t.table_name = upper(''tasks'')';
dbms_output.put_line(vv_sql);
end;
uj5u.com熱心網友回復:
在備份表中,按列一對一的存盤,不更好嗎?轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/103451.html
標籤:基礎和管理
