儲存過程中user_tables的owner是definer還是invoker
基於自定義函式的索引在使用時,需要注意因修改函式導致的索引狀態變化。
需要關注兩點:
*** user_indexes.FUNCIDX_STATUS
*** create or replace 方式修改函式後,雖然索引狀態有效,但索引本身因為沒有重建,仍返回原值,需要關注。
需要關注兩點:
*** user_indexes.FUNCIDX_STATUS
*** create or replace 方式修改函式後,雖然索引狀態有效,但索引本身因為沒有重建,仍返回原值,需要關注。
版本:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
1,建立測試表
drop table test;
create table test(x int,y int);
insert into test
select rownum,rownum from dual connect by level<20;
select rownum,rownum from dual connect by level<20;
commit;
create or replace function f(x in int) return int deterministic
as
begin
return x;
end;
/
create index idx_test_x on test(f(x));
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
select x,y from test where f(x)=5;
X Y
--- ---
5 5
2,create or replace方式修改函式
create or replace function f(x in int) return int deterministic
as
begin
return x-1;
end;
/
as
begin
return x-1;
end;
/
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
==>索引狀態VALID ENABLED
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
==>索引狀態VALID ENABLED
select x,y from test where f(x)=5;
X Y
--- ---
5 5
==>結果有誤,應返回6,6!!!
X Y
--- ---
5 5
==>結果有誤,應返回6,6!!!
alter index idx_test_x rebuild;
select x,y from test where f(x)=5;
X Y
---- ---
6 6
3,drop & create方式修改函式
drop function f;
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID DISABLED
==>索引狀態為 VALID DISABLED
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID DISABLED
==>索引狀態為 VALID DISABLED
create function f(x in int) return int deterministic
as
begin
return x-2;
end;
/
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID DISABLED
==>索引狀態為 VALID DISABLED
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID DISABLED
==>索引狀態為 VALID DISABLED
select x,y from test where f(x)=6;
ORA-30554: function-based index BOCNET.IDX_TEST_X is disabled
--重建索引
alter index idx_test_x rebuild;
select index_type, status, funcidx_status
from user_indexes
where index_name = 'IDX_TEST_X';
INDEX_TYPE STATUS FUNCIDX_STATUS
--------------------------- -------- --------------
FUNCTION-BASED NORMAL VALID ENABLED
==>索引狀態為 VALID ENABLED
select x,y from test where f(x)=6;
X Y
---- ----
8 8
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18922393/viewspace-773502/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql儲存過程的許可權 definerMySql儲存過程
- 什麼是儲存過程儲存過程
- oracle儲存過程中authid current_user和authid definerOracle儲存過程
- 要接觸JAVA,還有很多Oracle的儲存過程,不知是喜是悲JavaOracle儲存過程
- 在儲存過程A中呼叫儲存過程B的結果儲存過程
- Sqlserver中的儲存過程SQLServer儲存過程
- 儲存過程中巢狀儲存過程的變數執行方式儲存過程巢狀變數
- PB中呼叫儲存過程儲存過程
- 儲存過程中拼接字串儲存過程字串
- java中呼叫儲存過程Java儲存過程
- MySQL 中的 DEFINER(定義者)是什麼MySql
- Redis 儲存物件資訊是用 Hash 還是 StringRedis物件
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- oracle儲存過程中的陣列Oracle儲存過程陣列
- ORACLE儲存過程中建立子過程的測試!Oracle儲存過程
- 從sybase的儲存過程轉向oracle的儲存過程儲存過程Oracle
- MySQL儲存過程詳解 mysql 儲存過程MySql儲存過程
- job中呼叫儲存過程,儲存過程使用AUTHID CURRENT_USER,還出現ORA-01031儲存過程
- 儲存過程儲存過程
- jsp中呼叫儲存過程JS儲存過程
- 儲存過程中慎用 execute immediate儲存過程
- java中呼叫ORACLE儲存過程JavaOracle儲存過程
- 儲存過程裡呼叫編譯自己是什麼情況?儲存過程編譯
- oracle的儲存過程Oracle儲存過程
- 修改的儲存過程儲存過程
- mysql的儲存過程MySql儲存過程
- SQL Server儲存過程中raiserror的使用SQLServer儲存過程AIError
- Oracle 儲存過程中的DDL語句Oracle儲存過程
- 虛擬共享儲存:選iSCSI還是NFS?NFS
- MySql儲存過程—2、第一個MySql儲存過程的建立MySql儲存過程
- 儲存過程呼叫其他模式的儲存過程需要注意的地方儲存過程模式
- go區域性變數的儲存空間是堆還是棧?Go變數
- LogMiner分析完日誌之後,檢視中儲存的資訊是經過字典資訊轉換的還是未經過轉換的?
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- MySQL儲存過程詳解 mysql 儲存過程linkMySql儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- 函式呼叫發生在SQL呼叫之前還是過程中函式SQL
- 恢復MySQL資料庫建立儲存過程是遇到錯誤MySql資料庫儲存過程