關於all_procedures的問題分析
今天快下班的時候有一個同事問我一個儲存過程的許可權是否做過修改。我簡單看了下發現這個儲存過程已經是很久以前建立的了,一直沒有做過修改,所以就反饋給他了。但是他過了一會問我說,他透過資料字典檢視,沒有找到這個儲存過程,想讓我幫忙看看是不是因為許可權的原因,因為他們呼叫這個儲存過程有一些問題。
同事發過來的語句類似這樣的形式:
SQL> select *from all_procedures where procedure_name like 'insert%cn';
no rows selected
我一看這個語句肯定是查不出結果啊。因為在資料庫裡面顯示都是大寫的。所以改為了大寫繼續檢視,奇怪的是竟然顯示0條記錄。
為了更精確,我直接輸入了儲存過程的完整名字。但是奇怪的是竟然還是沒有任何結果。
SQL> select *from all_procedures where procedure_name='INSERT_BILL_CN';
no rows selected
確認了環境之後,我感覺這個問題一定哪個細節之處存在一些差別。
於是我使用了dba_procedures,但是奇怪的是結果依舊是返回0行
SQL> select *from dba_procedures where procedure_name='INSERT_BILL_CN';
no rows selected
如果對使用者的許可權存在疑問,我可以確定的是我使用的可是超級DBA SYS
SQL> show user
USER is "SYS"
那是不是儲存過程確實不存在呢,使用DESC可以迅速驗證我最開始的檢查是沒有問題的。
SQL> desc test.INSERT_BILL_CN
PROCEDURE test.INSERT_BILL_CN
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SDATE VARCHAR2 IN
EDATE VARCHAR2 IN
FLAG NUMBER IN DEFAULT
到這裡確實奇怪了,於是我這樣來推理,輸出使用者下所有的儲存過程
SQL> select procedure_name from all_procedures where owner='TEST';
PROCEDURE_NAME
------------------------------
。。。
但是奇怪的是儲存過程顯示都是為空,這可讓我有些疑惑了。我多輸出了一個object_name欄位。
SQL>SELECT OBJECT_NAME,PROCEDURE_NAME,OBJECT_ID,OBJECT_TYPE FROM DBA_PROCEDURES WHERE OWNER='TLBB'
OBJECT_NAME PROCEDURE_ OBJECT_ID OBJECT_TYPE
------------------------------ ---------- ---------- -------------
TEST_TURNCARD_STAT 73993 PROCEDURE
INSERT_CONSUME_INFO_CN1 72719 PROCEDURE
INSERT_BILL_CN1 72600 PROCEDURE
INSERT_CN_TEST_TEST 71176 PROCEDURE
...
這個時候我算是看明白了,procedure_name為空,但是object_name顯示的結果是我們期望之中的procedure_name
為什麼這麼蹊蹺呢。我開啟文件檢視是否對於欄位的理解存在一些偏差。
從欄位來看,感覺還是存在著偏差,all_procedures是會包括函式,儲存過程,包的資訊,這個檢視的定義還是不大清晰啊,尤其是欄位的含義,讓人看了有二義性。
那什麼時候procedure_name有值呢,可以看看這個簡單的例子。
我們透過all_procedures看看dbms_stats的結構
SQL>SELECT OBJECT_NAME,PROCEDURE_NAME,OBJECT_ID,OBJECT_TYPE FROM DBA_PROCEDURES WHERE PROCEDURE_NAME IS NOT NULL AND OBJECT_NAME LIKE 'DBMS_STATS' AND ROWNUM<10;
OBJECT_NAME PROCEDURE_NAME OBJECT_ID OBJECT_TYPE
------------------------------ ------------------------------ ---------- -------------
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES_NVARCHAR 4354 PACKAGE
可以看到這個時候儲存過程就有值了。這樣來理解這個檢視就會明白多了。
同事發過來的語句類似這樣的形式:
SQL> select *from all_procedures where procedure_name like 'insert%cn';
no rows selected
我一看這個語句肯定是查不出結果啊。因為在資料庫裡面顯示都是大寫的。所以改為了大寫繼續檢視,奇怪的是竟然顯示0條記錄。
為了更精確,我直接輸入了儲存過程的完整名字。但是奇怪的是竟然還是沒有任何結果。
SQL> select *from all_procedures where procedure_name='INSERT_BILL_CN';
no rows selected
確認了環境之後,我感覺這個問題一定哪個細節之處存在一些差別。
於是我使用了dba_procedures,但是奇怪的是結果依舊是返回0行
SQL> select *from dba_procedures where procedure_name='INSERT_BILL_CN';
no rows selected
如果對使用者的許可權存在疑問,我可以確定的是我使用的可是超級DBA SYS
SQL> show user
USER is "SYS"
那是不是儲存過程確實不存在呢,使用DESC可以迅速驗證我最開始的檢查是沒有問題的。
SQL> desc test.INSERT_BILL_CN
PROCEDURE test.INSERT_BILL_CN
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SDATE VARCHAR2 IN
EDATE VARCHAR2 IN
FLAG NUMBER IN DEFAULT
到這裡確實奇怪了,於是我這樣來推理,輸出使用者下所有的儲存過程
SQL> select procedure_name from all_procedures where owner='TEST';
PROCEDURE_NAME
------------------------------
。。。
但是奇怪的是儲存過程顯示都是為空,這可讓我有些疑惑了。我多輸出了一個object_name欄位。
SQL>SELECT OBJECT_NAME,PROCEDURE_NAME,OBJECT_ID,OBJECT_TYPE FROM DBA_PROCEDURES WHERE OWNER='TLBB'
OBJECT_NAME PROCEDURE_ OBJECT_ID OBJECT_TYPE
------------------------------ ---------- ---------- -------------
TEST_TURNCARD_STAT 73993 PROCEDURE
INSERT_CONSUME_INFO_CN1 72719 PROCEDURE
INSERT_BILL_CN1 72600 PROCEDURE
INSERT_CN_TEST_TEST 71176 PROCEDURE
...
這個時候我算是看明白了,procedure_name為空,但是object_name顯示的結果是我們期望之中的procedure_name
為什麼這麼蹊蹺呢。我開啟文件檢視是否對於欄位的理解存在一些偏差。
從欄位來看,感覺還是存在著偏差,all_procedures是會包括函式,儲存過程,包的資訊,這個檢視的定義還是不大清晰啊,尤其是欄位的含義,讓人看了有二義性。
那什麼時候procedure_name有值呢,可以看看這個簡單的例子。
我們透過all_procedures看看dbms_stats的結構
SQL>SELECT OBJECT_NAME,PROCEDURE_NAME,OBJECT_ID,OBJECT_TYPE FROM DBA_PROCEDURES WHERE PROCEDURE_NAME IS NOT NULL AND OBJECT_NAME LIKE 'DBMS_STATS' AND ROWNUM<10;
OBJECT_NAME PROCEDURE_NAME OBJECT_ID OBJECT_TYPE
------------------------------ ------------------------------ ---------- -------------
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES 4354 PACKAGE
DBMS_STATS PREPARE_COLUMN_VALUES_NVARCHAR 4354 PACKAGE
可以看到這個時候儲存過程就有值了。這樣來理解這個檢視就會明白多了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2122085/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於session leak的問題分析Session
- 關於SQLRecoverableException問題的排查和分析SQLException
- 關於兩個簡單問題的分析
- Elasticsearch中關於transform的一個問題分析ElasticsearchORM
- 關於desc的一個奇怪問題及分析
- 關於oracle的索引重建問題及原因分析Oracle索引
- 關於ORA-01555的問題分析
- 關於刪除資料的快慢問題的分析
- 關於enq: TX - allocate ITL entry的問題分析ENQ
- 關於Java中文問題的幾條分析原則Java
- 關於SQLServerDriver的問題SQLServer
- 關於 JavaMail 的問題JavaAI
- 關於session的問題Session
- 關於ORA-01779問題的分析和解決
- 避坑指南:關於SPDK問題分析過程
- 關於javascript的this指向問題JavaScript
- 關於跨域的問題跨域
- 關於bit code的問題
- 關於序列同步的問題
- 關於IP地址的問題
- 關於橋模式的問題模式
- 求救 關於parallel的問題Parallel
- 關於web start的問題Web
- 關於action的error問題Error
- 關於ADAPTER的問題APT
- 關於session的奇怪問題Session
- php關於session的問題PHPSession
- 關於diag程式的問題
- 關於SimpleJdonFrameworkTest的問題Framework
- 關於 Puerts 的效能問題
- 關於盒模型相關的問題模型
- 關於FastHashMap問題ASTHashMap
- 關於Oracle full outer join 的bug問題分析及處理Oracle
- 關於PHP佇列的問題PHP佇列
- 關於 Laravel 分頁的問題?Laravel
- 關於css權值的問題CSS
- 關於搜尋地址的問題
- 關於PWA落地問題的思考