Hoje um desenvolvedor reclamou que não conseguia gerar o plano de execução das consultas em que ele estava trabalhando, ele informou que ao tentar gerar o plano de execução ocorria o erro ORA-02402: PLAN_TABLE not found, abaixo segue o procedimento que utilizei para a correção:
- O erro é claro, indica que o esquema conectado usado pelo desenvolvedor não possui a tabela PLAN_TABLE necessária para armazenar o plano de execução gerado.
[oracle@srv002 ~]$ sqlplus
SQL*Plus: Release 11.2.0.4.0 Production on Fri Oct 7 20:06:09 2022
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Enter user-name: CESAR_TESTE2
Enter password:
SQL> SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL;
SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
------------------------------------------
CESAR_TESTE2
SQL> EXPLAIN PLAN FOR SELECT * FROM DBA_USERS;
EXPLAIN PLAN FOR SELECT * FROM DBA_USERS
*
ERROR at line 1:
ORA-02402: PLAN_TABLE not found
SQLIremos verificar que a tabela PLAN_TABLE não existe para o esquema CESAR_TESTE2, apenas para o SYS neste exemplo:
[oracle@srv002 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Fri Oct 7 14:49:39 2022
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
SQL>
SET LINESIZE 500 PAGESIZE 2000
COLUMN OBJECT_NAME FORMAT A30
SELECT OWNER,
OBJECT_TYPE,
OBJECT_NAME,
STATUS
FROM DBA_OBJECTS
WHERE OBJECT_NAME ='PLAN_TABLE'
AND OWNER IN ('SYS','CESAR_TESTE2')
ORDER BY OWNER, OBJECT_TYPE, OBJECT_NAME;
OWNER OBJECT_TYPE OBJECT_NAME STATUS
------------------------------ ------------------- ------------------------------ -------
SYS TABLE PLAN_TABLE VALID
SQLAlterei a minha sessão no sqlplus para a do desenvolvedor:
[oracle@srv002 ~]$ sqlplus / as sysdba
SQL> ALTER SESSION SET CURRENT_SCHEMA=CESAR_TESTE2;
Session altered.
SQLVerifiquei se a minha sessão estava realmente como CESAR_TESTE2:
SQL> SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') CONNECTED_AS_SCHEMA FROM DUAL;
CONNECTED_AS_SCHEMA
-----------------------------
CESAR_TESTE2
SQLComo ele precisava visualizar algumas informações de sessões e outras views de sistema, apliquei o grant para visualizar o dicionário do Oracle Database:
GRANT SELECT ANY DICTIONARY TO CESAR_TESTE2;
SQLApliquei uma quota para que ele pudesse gravar o plano de execução na tabela criada com o script acima na tablespace default USERS da conta dele:
ALTER USER CESAR_TESTE2 QUOTA 1024M ON USERS;
SQLCriei a tabela PLAN_TABLE:
SQL> ALTER SESSION SET CURRENT_SCHEMA=CESAR_TESTE2;
Session altered.
SQL> @?/rdbms/admin/utlxplan.sql
Table created.
SQLVerificando a tabela criada para o esquema CESAR_TESTE2:
SQL> SET LINESIZE 500 PAGESIZE 2000
COLUMN OBJECT_NAME FORMAT A30
SELECT OWNER,
OBJECT_TYPE,
SQL> SQL> OBJECT_NAME,
STATUS
FROM DBA_OBJECTS
WHERE OBJECT_NAME ='PLAN_TABLE'
2 AND OWNER IN ('SYS','')
ORDER BY OWNER, OBJECT_TYPE, OBJECT_ 3 NAME; 4 5 6 7 8
OWNER OBJECT_TYPE OBJECT_NAME STATUS
------------------------------ ------------------- ------------------------------ -------
CESAR_TESTE2 TABLE PLAN_TABLE VALID
SYS TABLE PLAN_TABLE VALID
SQLConectando com o esquema CESAR_TESTE2:
[oracle@srv002 ~]$ sqlplus
SQL*Plus: Release 11.2.0.4.0 Production on Fri Oct 7 20:16:52 2022
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Enter user-name: CESAR_TESTE2
Enter password:
Connected to:
Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
SQL>
SQLTeste de geração do plano de execução após a correção:
SQL> SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') CONNECTED_AS_SCHEMA FROM DUAL;
CONNECTED_AS_SCHEMA
--------------------
CESAR_TESTE2
SQL> SET LINESIZE 500 PAGESIZE 2000
SQL> EXPLAIN PLAN FOR SELECT * FROM DBA_USERS;
Explained.
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
Plan hash value: 2679157696
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 561 | 139K| 42 (0)| 00:00:01 |
|* 1 | HASH JOIN | | 561 | 139K| 42 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL | TS$ | 27 | 405 | 9 (0)| 00:00:01 |
|* 3 | HASH JOIN | | 561 | 130K| 33 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | TS$ | 27 | 405 | 9 (0)| 00:00:01 |
|* 5 | HASH JOIN | | 561 | 122K| 24 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL | USER_ASTATUS_MAP | 9 | 171 | 2 (0)| 00:00:01 |
|* 7 | HASH JOIN | | 561 | 112K| 22 (0)| 00:00:01 |
| 8 | TABLE ACCESS FULL | PROFNAME$ | 2 | 34 | 2 (0)| 00:00:01 |
|* 9 | HASH JOIN RIGHT OUTER | | 561 | 102K| 20 (0)| 00:00:01 |
|* 10 | TABLE ACCESS FULL | RESOURCE_GROUP_MAPPING$ | 1 | 38 | 2 (0)| 00:00:01 |
|* 11 | HASH JOIN | | 561 | 84150 | 18 (0)| 00:00:01 |
| 12 | MERGE JOIN CARTESIAN| | 1 | 24 | 4 (0)| 00:00:01 |
|* 13 | TABLE ACCESS FULL | PROFILE$ | 1 | 12 | 2 (0)| 00:00:01 |
| 14 | BUFFER SORT | | 2 | 24 | 2 (0)| 00:00:01 |
|* 15 | TABLE ACCESS FULL | PROFILE$ | 2 | 24 | 2 (0)| 00:00:01 |
|* 16 | TABLE ACCESS FULL | USER$ | 891 | 109K| 14 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("U"."TEMPTS#"="TTS"."TS#")
3 - access("U"."DATATS#"="DTS"."TS#")
5 - access("U"."ASTATUS"="M"."STATUS#")
7 - access("U"."RESOURCE$"="P"."PROFILE#")
9 - access("CGM"."VALUE"(+)="U"."NAME")
10 - filter("CGM"."ATTRIBUTE"(+)='ORACLE_USER' AND "CGM"."STATUS"(+)='ACTIVE')
11 - access("U"."RESOURCE$"="PR"."PROFILE#")
13 - filter("DP"."RESOURCE#"=1 AND "DP"."TYPE#"=1 AND "DP"."PROFILE#"=0)
15 - filter("PR"."RESOURCE#"=1 AND "PR"."TYPE#"=1)
16 - filter("U"."TYPE#"=1)
37 rows selected.
SQL