问题描述
嗨,汤姆,
我有一个表DAVE_ELOF设置为行存档 (alter table dave_elof行存档;)。
我希望用户可以通过包设置行可见性
过程setStudyVisibleYN(aStudyId编号,aVisible_YN varchar2)。
代码片段:
检查它是否有效。这是:
这是表的结果:
我希望只看到ora_archive_state = '0' 的记录。
如果我在SQLdeveloper中执行相同的操作,则可以正常工作。应该是。
整个想法是用户通过Java web应用程序调用包或存储过程以使记录可见或不可见。
在打包过程中,可以做些什么来归档记录。这种变化直接反映在表中?
亲切的问候
伊万·亨德里克斯
我有一个表DAVE_ELOF设置为行存档 (alter table dave_elof行存档;)。
我希望用户可以通过包设置行可见性
过程setStudyVisibleYN(aStudyId编号,aVisible_YN varchar2)。
代码片段:
-- make sure that we can update the wanted records
EXECUTE IMMEDIATE 'ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL';
-- commit;
update dave_elof
set ora_archive_state = dbms_ilm.archivestatename(1)
where studyid=aStudyId;
v_tot := SQL%ROWCOUNT;
commit;检查它是否有效。这是:
-- to be sure that the archived rows are no longer visible
EXECUTE IMMEDIATE 'ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE';
-- count the visible (un-archived) rows
EXECUTE IMMEDIATE 'create table tab1 as( select distinct count(1) as cnt,
ora_archive_state,studyid from dave_elof
group by ora_archive_state,studyid)';这是表的结果:
cnt ora_archive_state studyid 230553 1 16244 13038 1 15128 13445 0 16953 99 1 99001 256085 0 17530
我希望只看到ora_archive_state = '0' 的记录。
如果我在SQLdeveloper中执行相同的操作,则可以正常工作。应该是。
update dave_elof
set ora_archive_state ='1'
where studyid=15128;
commit;
select distinct count(1) as cnt,ora_archive_state,studyid from dave_elof
group by ora_archive_state,studyid;
cnt ora_archive_state studyid
13445 0 16953
256085 0 17530整个想法是用户通过Java web应用程序调用包或存储过程以使记录可见或不可见。
在打包过程中,可以做些什么来归档记录。这种变化直接反映在表中?
亲切的问候
伊万·亨德里克斯
专家解答
在你的第一个例子中,你有一个创建表...作为选择...
第二个是仅选择。
这会导致您看到的差异:
可悲的是,这在cta中没有应用。
请注意,“从t2中选择计数 (*)” 的计划具有ora_archive_state过滤器。但是cta计划没有。
为此提出了一个内部错误。
虽然我不明白为什么你需要在你的程序的另一个表中转储结果。你当然可以运行选择本身吗?
第二个是仅选择。
这会导致您看到的差异:
create table t as
select level x, mod(level, 11) y from dual
connect by level <= 100;
alter table t row archival;
select count(*) from t;
alter session set row archival visibility = all;
update t
set ora_archive_state = dbms_ilm.archivestatename(1)
where x = 1;
select count(*) from t;
COUNT(*)
100
alter session set row archival visibility = active;
create table t2 as
select * from t;
select count(*) from t2;
COUNT(*)
100
select count(*) from t;
COUNT(*)
99
explain plan for
create table t2 as
select * from t;
select *
from table(dbms_xplan.display());
explain plan for
select count(*) from t;
PLAN_TABLE_OUTPUT
Plan hash value: 1148579242
---------------------------------------
| Id | Operation | Name |
---------------------------------------
| 0 | CREATE TABLE STATEMENT | |
| 1 | LOAD AS SELECT | T2 |
| 2 | TABLE ACCESS FULL | T |
---------------------------------------
select *
from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
Plan hash value: 1071362934
-----------------------------------
| Id | Operation | Name |
-----------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT AGGREGATE | |
|* 2 | TABLE ACCESS FULL| T |
-----------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("T"."ORA_ARCHIVE_STATE"='0')可悲的是,这在cta中没有应用。
请注意,“从t2中选择计数 (*)” 的计划具有ora_archive_state过滤器。但是cta计划没有。
为此提出了一个内部错误。
虽然我不明白为什么你需要在你的程序的另一个表中转储结果。你当然可以运行选择本身吗?
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




