SQL> drop edition ed02;
次のコマンドの開始中にエラーが発生しました : 行 1 -
drop edition ed02
エラー・レポート -
ORA-38811: need CASCADE option to drop edition that has actual objects
SQL>
SQL> select owner, object_type, object_name from dba_objects_ae where edition_name = 'ED02';
OWNER OBJECT_TYPE OBJECT_NAME
__________ ______________ ______________
APEXDEV VIEW EMP
SQL>
SQL> alter session set edition = ed02;
Sessionが変更されました。
SQL> drop view apexdev.emp;
View APEXDEV.EMPが削除されました。
SQL> alter session set edition = ora$base;
Sessionが変更されました。
SQL> drop edition ed02;
Edition ED02が削除されました。
SQL>
SQL> create edition ed02 as child of ed01;
Edition ED02は作成されました。
SQL> grant use on edition ed02 to apexdev;
Grantが正常に実行されました。
SQL>
SQL> alter table emp_b add (first_name varchar2(80));
Table EMP_Bが変更されました。
SQL> alter table emp_b add (last_name varchar2(80));
Table EMP_Bが変更されました。
SQL>
SQL> alter session set edition = ed02;
Sessionが変更されました。
SQL> create or replace editioning view emp
2 as
3 select empno, first_name, last_name, job, mgr, hiredate, sal, comm, deptno from emp_b;
View EMPは作成されました。
SQL>
SQL> alter session set edition = ora$base;
Sessionが変更されました。
SQL> drop view emp;
View EMPが削除されました。
SQL> create view emp
2 as
3 select empno, first_name, last_name, job, mgr, hiredate, sal, comm, deptno from emp_b;
View EMPは作成されました。
SQL>
select last_name || ' ' || first_name d,
empno r
from emp
create or replace editionable trigger ename_to_first_last
before insert or update
on emp_b
for each row
forward crossedition
disable
begin
:new.first_name := substr(:new.ename,instr(:new.ename,' ')+1);
:new.last_name := substr(:new.ename,1,instr(:new.ename,' ')-1);
end;
/
SQL> alter session set edition = ed02;
Sessionが変更されました。
SQL> create or replace editionable trigger ename_to_first_last
2 before insert or update
3 on emp_b
4 for each row
5 forward crossedition
6 disable
7 begin
8 :new.first_name := substr(:new.ename,instr(:new.ename,' ')+1);
9 :new.last_name := substr(:new.ename,1,instr(:new.ename,' ')-1);
10 end;
11 /
Trigger ENAME_TO_FIRST_LASTがコンパイルされました
SQL> alter trigger ename_to_first_last enable;
Trigger ENAME_TO_FIRST_LASTが変更されました。
SQL>
create or replace editionable trigger first_last_to_ename
before insert or update
on emp_b
for each row
reverse crossedition
disable
begin
:new.ename := :new.last_name || ' ' || :new.first_name;
end;
/
SQL> alter session set edition = ed02;
Sessionが変更されました。
SQL> create or replace editionable trigger first_last_to_ename
2 before insert or update
3 on emp_b
4 for each row
5 reverse crossedition
6 disable
7 begin
8 :new.ename := :new.last_name || ' ' || :new.first_name;
9 end;
10 /
Trigger FIRST_LAST_TO_ENAMEがコンパイルされました
SQL> alter trigger first_last_to_ename enable;
Trigger FIRST_LAST_TO_ENAMEが変更されました。
SQL>
SQL> select trigger_name, trigger_type, status,edition_name, crossedition from user_triggers_ae;
TRIGGER_NAME TRIGGER_TYPE STATUS EDITION_NAME CROSSEDITION
______________________ __________________ __________ _______________ _______________
DEPT_TRG1 BEFORE EACH ROW ENABLED NO
EMP_TRG1 BEFORE EACH ROW ENABLED NO
ENAME_TO_FIRST_LAST BEFORE EACH ROW ENABLED ED02 FORWARD
FIRST_LAST_TO_ENAME BEFORE EACH ROW ENABLED ED02 REVERSE
SQL>
declare
out_scn number := null;
begin
if not dbms_utility.wait_on_pending_dml('EMP_B', 2, out_scn) then
raise_application_error(-20105, 'Wait on Pending DML timed out due to transactions started before ' || out_scn);
end if;
end;
/
declare
c number := dbms_sql.open_cursor();
retval number;
begin
dbms_sql.parse(
c => c,
statement => 'update emp_b set empno = empno',
language_flag => dbms_sql.native,
edition => null,
apply_crossedition_trigger => 'ENAME_TO_FIRST_LAST',
fire_apply_trigger => TRUE
);
retval := dbms_sql.execute(c);
dbms_sql.close_cursor(c);
commit;
end;
/
SQL> alter session set edition = ed02;
Sessionが変更されました。
SQL> declare
2 c number := dbms_sql.open_cursor();
3 retval number;
4 begin
5 dbms_sql.parse(
6 c => c,
7 statement => 'update emp_b set empno = empno',
8 language_flag => dbms_sql.native,
9 edition => null,
10 apply_crossedition_trigger => 'ENAME_TO_FIRST_LAST',
11 fire_apply_trigger => TRUE
12 );
13 retval := dbms_sql.execute(c);
14 dbms_sql.close_cursor(c);
15 commit;
16 end;
17 /
PL/SQLプロシージャが正常に完了しました。
SQL>
DECLARE
l_sql_stmt VARCHAR2(512);
l_try NUMBER := 0;
l_status NUMBER;
BEGIN
dbms_parallel_execute.create_task('EMPEBR');
dbms_parallel_execute.create_chunks_by_rowid(
task_name => 'EMPEBR',
table_owner => 'APEXDEV',
table_name => 'EMP_B',
by_row => TRUE,
chunk_size => 100000
);
l_sql_stmt := 'UPDATE apexdev.emp_b SET empno = empno WHERE rowid BETWEEN :start_id AND :end_id';
dbms_parallel_execute.run_task(
task_name => 'EMPEBR',
sql_stmt => l_sql_stmt,
language_flag => dbms_sql.native,
edition => null,
apply_crossedition_trigger => 'ENAME_TO_FIRST_LAST',
fire_apply_trigger => TRUE,
parallel_level => 1
);
l_status := dbms_parallel_execute.task_status('EMPEBR');
WHILE(l_try < 2 and l_status != dbms_parallel_execute.finished) LOOP
l_try := l_try + 1;
dbms_parallel_execute.resume_task('EMPEBR');
l_status := dbms_parallel_execute.task_status('EMPEBR');
END LOOP;
dbms_parallel_execute.drop_task('EMPEBR');
END;
/
SQL> alter session set edition = ed02;
Sessionが変更されました。
SQL> begin
2 dbms_editions_utilities.set_editioning_views_read_only(
3 table_name => 'EMP_B',
4 owner => 'APEXDEV',
5 read_only => TRUE
6 );
7 end;
8 /
PL/SQLプロシージャが正常に完了しました。
SQL> insert into emp(empno) values(100);
次のコマンド行の開始中にエラーが発生しました : 1 -
insert into emp(empno) values(100)
コマンド行 : 1 列 : 13 でのエラー
エラー・レポート -
SQLエラー: ORA-42399: cannot perform a DML operation on a read-only view
42399.0000 - "cannot perform a DML operation on a read-only view"
SQL> begin
2 dbms_editions_utilities.set_editioning_views_read_only(
3 table_name => 'EMP_B',
4 owner => 'APEXDEV',
5 read_only => FALSE
6 );
7 end;
8 /
PL/SQLプロシージャが正常に完了しました。
SQL> insert into emp(empno) values(100);
1行挿入しました。
SQL> commit;
コミットが完了しました。
SQL>