ORA-02402: PLAN_TABLE not found

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
SQL

Iremos 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
SQL

Alterei 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.
SQL

Verifiquei 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
SQL

Como 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;
SQL

Apliquei 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;
SQL

Criei a tabela PLAN_TABLE:

SQL> ALTER SESSION SET CURRENT_SCHEMA=CESAR_TESTE2;
 
Session altered.
 
SQL> @?/rdbms/admin/utlxplan.sql
 
Table created.
SQL

Verificando 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
SQL

Conectando 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>
SQL

Teste 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

Leave a Reply

Your email address will not be published. Required fields are marked *

search previous next tag category expand menu location phone mail time cart zoom edit close