Ora 06508 ошибка

ORA-06508 occurs when a program unit being called is not found. This is due to the procedure being dropped or modified in an incompatible manner.

oracle tutorial webinars

ORA-06508

As a database manager delves further and further into their duties of constructing database materials for their company, several files and processes, both big and small, will start to seem like ancient history. Typically, this is fine as we create and store procedures just for that purpose; we want to be able to instantly recall past constructions and signal them at ease.
However, there are times when we create and store information in a database that, over time, becomes either incompatible with newly designed additions or corrupted. We are then forced to correct these past mistakes and adapt them to current requirements. The ORA-06508 is an error indicative of this type of situation in which maintenance must be performed on a past design to ready it for the up-to-date database needs.

The Problem

The ORA-06508 is an error deriving from a program unit being called and not being found. What this means is that the user tried to call a procedure that was not available due to the procedure being dropped or modified in an incompatible manner. It can also occur when the procedure or program was compiled, but contained errors.

If using the OWB (Oracle warehouse builder), a tool for managing and integrating data, in addition to other SQL operations, you can trigger the ORA-06508 error when one of the individual units within the program has not been appropriately compiled. It can also result from the program not being located, which indicates a problem with the $PATH environment variable.

The Solution

In order to correct this error, the user needs to check all programs referenced in an action. This will also included all package bodies, making sure the programs exist in full and are compatible with the action. You can run a query to discover any invalid objects or procedures that look like the following:

select

comp_id,
comp_name,
version,
status,
namespace,
schema

from

dba_registry;

In the event that the user finds that the procedure has been dropped, trying to re-create the stored procedure can provide a simple fix. Additionally, if the stored procedure was compiled with errors, the user can correct the errors and proceed accordingly.

In some rare instances, the user may receive an ORA-06508 error and, when the user ends the current session and opens a new session, the error will disappear. Typically this error will be accompanied in a stack with several other errors such as the ORA-04068 and ORA-04061, which reveal that existing states of packages have been discarded. If the values of variables and constants that comprise a package are at least one in number, then a package is stateful; otherwise, it is stateless. If a stateful package is recompiled later on, the next version of the package will cause Oracle to discard the existing package state and trigger the ORA-04068. It is rare that the user will need a package to be stateful, so go back to the package and see if anything you stated for variables and constants is necessary to continue. By doing this, the next time the procedure is run an error will not be triggered.

Looking forward

For the most part, by revisiting the logs in the database and running the aforementioned query to specify the origins of the error, an ORA-06508 can be resolved. The ‘select’ portion of the query will return any information needed to successfully uncover what is causing the error. From there, the user can adjust the portion of information and update accordingly. If there are still concerns remaining after implementing these corrections or if further information on concepts such as package states is needed, it is always recommended to contact a licensed Oracle consultant for in-depth inquiries.

In this article, I will write about resolving  ORA-06508, ORA-04065, ORA-04068 errors.

The cause of the ORA-04068 is when a dependent object in a package is altered by a DDL statement.  When packages are compiled, the copies of the package in the shared pool are marked as invalid.  In the meantime, there is a new copy of the package that recognizes the calling package. As a result, the ORA-04068 occures. This error occures on the first time when it is called. On the second time, it runs successfuly. But in some cases may have to make a small change in our codes to get rid of these errors.

Now let’s do a test on this issue. I build a package as follows talip_test. Declare a global variable at the SPEC of the package.

CREATE OR REPLACE PACKAGE talip_test
IS
global_var NUMBER := 10;

PROCEDURE inner_test_proc;
END;
/

CREATE OR REPLACE PACKAGE BODY talip_test
IS
PROCEDURE inner_test_proc
IS
BEGIN
global_var := global_var + 1;
DBMS_OUTPUT.put_line (‘Variable =’ || global_var);
END;
END;
/

Next we create a procedure that will call this package.

CREATE OR REPLACE PROCEDURE outer_test_proc
AS
err VARCHAR2 (1024);
BEGIN
talip_test.inner_test_proc;
END;
/

We see that it works successfuly on SQL * Plus.

SQL> set serveroutput on

SQL> begin outer_test_proc; end; /

Variable =12

PL/SQL procedure successfully completed.

Now let some change at the SPEC of  the talip_test package. Add second global variable. And re-compile the SPEC + BODY.

CREATE OR REPLACE PACKAGE talip_test
IS
global_var NUMBER := 10;
global_var2 NUMBER := 10;

PROCEDURE inner_test_proc;
END;
/

CREATE OR REPLACE PACKAGE BODY talip_test
IS
PROCEDURE inner_test_proc
IS
BEGIN
global_var := global_var + 1;
DBMS_OUTPUT.put_line (‘Variable =’ || global_var);
END;
END;
/

outer_test_proc  procedure was invalidated. Compile it.

SQL> select status from dba_objects where object_name=’OUTER_TEST_PROC’;

STATUS

——-

INVALID

SQL> alter procedure outer_test_proc compile ;

SQL> select status from dba_objects where object_name=’OUTER_TEST_PROC’;

STATUS

——-

VALID

In this case, the sessions connected to the database receives ORA-04 068 error when they call the procedure. This error is logged only once in the calling package.

SQL>begin outer_test_proc; end; /

begin outer_test_proc; end;

* ERROR at line 1: ORA-04068: existing state of packages has been discarded

ORA-04061: existing state of package body “TALIP.TALIP_TEST” has been invalidated

ORA-04065: not executed, altered or dropped package body “TALIP.TALIP_TEST”

ORA-06508: PL/SQL: could not find program unit being called: “TALIP.TALIP_TEST”

ORA-06512: at “TALIP.OUTER_TEST_PROC”, line 5 ORA-06512: at line 1

If the package executed for the second time in the same session, it runs successfuly.

SQL> set serveroutput on

SQL> /

Variable =12

PL/SQL procedure successfully completed.

Any PL/SQL block can have an exception-handling part, which can have one or more exception handlers.  In this case, the sessions connected to a database receives these errors on each execution. let’s change outer_test_proc procedure as follows.

CREATE OR REPLACE PROCEDURE outer_test_proc
AS
err VARCHAR2 (1024);
BEGIN
talip_test.inner_test_proc;
EXCEPTION
WHEN OTHERS
THEN
err := SUBSTR (SQLERRM, 0, 1000);
DBMS_OUTPUT.put_line (err);
ROLLBACK;
END;
/

Now let talip_test some change at the SPEC. Add a third global variable. And recompile the SPEC + BODY.

CREATE OR REPLACE PACKAGE talip_test
IS
global_var NUMBER := 10;
global_var2 NUMBER := 10;
global_var3 NUMBER := 10;

PROCEDURE inner_test_proc;
END;
/

CREATE OR REPLACE PACKAGE BODY talip_test
IS
PROCEDURE inner_test_proc
IS
BEGIN
global_var := global_var + 1;
DBMS_OUTPUT.put_line (‘Değişken =’ || global_var);
END;
END;
/

Our outer_test_proc procedure was invalidated. Compile it.

SQL> select status from dba_objects where object_name=’OUTER_TEST_PROC’;

STATUS

——-

INVALID

SQL> alter procedure outer_test_proc compile ;

SQL> select status from dba_objects where object_name=’OUTER_TEST_PROC’;

STATUS

——-

VALID

In this case, the sessions connected to the database will receive ORA-06508 error on each execution of outer_test_proc procedure.

SQL> begin outer_test_proc; end; /

ORA-06508: PL/SQL: could not find program unit being called

PL/SQL procedure successfully completed.

SQL> /

ORA-06508: PL/SQL: could not find program unit being called

PL/SQL procedure successfully completed.

Raise the exception in “when others then” block. In this situation, sessions will receive error on the first time. They will not receive any error on the second time.

CREATE OR REPLACE PROCEDURE outer_test_proc
AS
err VARCHAR2 (1024);
BEGIN
talip_test.inner_test_proc;
EXCEPTION
WHEN OTHERS
THEN
err := SUBSTR (SQLERRM, 0, 1000);
DBMS_OUTPUT.put_line (err);
ROLLBACK;
RAISE;
END;
/

Re-execute the procedure. It will run successfuly on the second time.

SQL> begin outer_test_proc; end; /

begin outer_test_proc; end;

* ERROR at line 1: ORA-04068: existing state of packages has been discarded

ORA-04061: existing state of package “TALIP.TALIP_TEST” has been invalidated

ORA-04065: not executed, altered or dropped package “TALIP.TALIP_TEST”

ORA-06508: PL/SQL: could not find program unit being called: “TALIP.TALIP_TEST”

ORA-06512: at “TALIP.OUTER_TEST_PROC”, line 11 ORA-06512: at line 1

SQL> /

PL/SQL procedure successfully completed.

Wishing to be useful …

Talip Hakan Öztürk

April 29, 2021

I got ” ORA-06508: PL/SQL: could not find program unit being called ” error in Oracle database.

ORA-06508: PL/SQL: could not find program unit being called

Details of error are as follows.

ORA-06508: PL/SQL: could not find program unit being called.

Cause: An attempt was made to call a stored program that could not be found.
The program may have been dropped or incompatibly modified, or have compiled with errors.

Action: Check that all referenced programs, including their package bodies,
exist and are compatible.



PL/SQL: could not find program unit being called

This ORA-06508 errors are related with the stored procedure, the stored procedure you run could not be found.

The issue is caused by unpublished bug 7284151, which relates to a new feature introduced in 11g called fast validation. The purpose of  fast validation is to speed up recompilation by attempting to detect only those objects which strictly needed to be recompiled.

This issue is documented in Note 1192068.1 “Recreating An Existing Package Generates Timestamps Out Of Sync Which Causes ORA-6508”.

To check if you have timestamp discrepancies on your instance that are causing the error(s) run the
following SQL query.

   alter session set nls_date_format='dd-mon-yy hh24:mi:ss';

   select do.name dname, po.name pname, p_timestamp, po.stime p_stime
   from sys.obj$ do, sys.dependency$ d, sys.obj$ po
  where p_obj#=po.obj#(+)
  and d_obj#=do.obj#
  and do.status=1 /*dependent is valid*/
  and po.status=1 /*parent is valid*/
  and po.stime!=p_timestamp /*parent timestamp does not match*/
  and do.type# not in (28,29,30) /*dependent type is not java*/
  and po.type# not in (28,29,30) /*parent type is not java*/
  order by 2,1;

Check the output of the query for the package name found in your error. If this package is found then this is most likely the cause of the error(s).

Another sign of this issue is that the output of the Diagnostic: Apps Check program shows compiled versions of packages that are lower than what is found on the server.

To solve this error, Perform the following as SYSDBA:

1. ALTER SYSTEM set "_disable_fast_validate"=TRUE scope=spfile;

2. Shut down the database:

   SHUTDOWN IMMEDIATE

3. Start the database in upgrade mode:

   STARTUP UPGRADE

4. Oracle provides scripts in $ORACLE_HOME/rdbms/admin that, when run as sys, will invalidate and re-validate all PL/SQL objects so any timestamp mismatches should be resolved. The script utlirp.sql invalidates all PL/SQL based objects, recreates STANDARD and DBMS_STANDARD, invalidates all views and synonyms dependent on now invalid objects and then does some clean up. The script utlrp.sql calls UTL_RECOMP.RECOMP_PARALLEL which performs dependency based recompilation, in parallel where resources allow. Please use these two scripts:

a) Invalidate all the objects – utlirp.sql

b) Recompile all the objects – utlrp.sql

5. ALTER SYSTEM set "_disable_fast_validate"=FALSE scope=spfile;

6. Shut down the database:

   SHUTDOWN IMMEDIATE

7. Start the database:

   STARTUP

8. Retest the issue.

Note: One customer reported the above actions took about 8 hours. Manually recompiling the affected files shown in the output of the SQL query should work as well, but this will be a labor intensive process if the list is extensive.

Do you want to learn Oracle Database for Beginners, then read the following articles.

Oracle Tutorial | Oracle Database Tutorials for Beginners ( Junior Oracle DBA )

 1,538 views last month,  1 views today

About Mehmet Salih Deveci

I am Founder of SysDBASoft IT and IT Tutorial and Certified Expert about Oracle & SQL Server database, Goldengate, Exadata Machine, Oracle Database Appliance administrator with 10+years experience.I have OCA, OCP, OCE RAC Expert Certificates I have worked 100+ Banking, Insurance, Finance, Telco and etc. clients as a Consultant, Insource or Outsource.I have done 200+ Operations in this clients such as Exadata Installation & PoC & Migration & Upgrade, Oracle & SQL Server Database Upgrade, Oracle RAC Installation, SQL Server AlwaysOn Installation, Database Migration, Disaster Recovery, Backup Restore, Performance Tuning, Periodic Healthchecks.I have done 2000+ Table replication with Goldengate or SQL Server Replication tool for DWH Databases in many clients.If you need Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS Consultancy and Training you can send my email adress [email protected].-                                                                                                                                                                                                                                                 -Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS ve linux Danışmanlık ve Eğitim için  [email protected] a mail atabilirsiniz.

When a user submits a new order, sometimes will get an error:

Error in Line 1.0: ORA-06508:PL/SQL:could not find program unit being called in Package OM_TAX_UTIL Procedure Tax_Line

This error is persistent and relogin does not allow the user to bypass the error.
This framework uses Java Apache processes to connect to the DB, and not the default connection method, seen when a form opens a session and closes it when it is done.
These Apache processes stay connected to the DB, until an Apache restart/shutdown occurs.

We enable tracing for ORA-06508:

ALTER SYSTEM SET EVENTS '6508 trace name errorstack level 3';

The trace files created by the «submit orders» attempts contain the following group of ORA errors:

ORA-04061: existing state of package body "APPS.ARP_PROCESS_TAX" has been invalidated

ORA-04065: not executed, altered or dropped package body "APPS.ARP_PROCESS_TAX"

ORA-06508: PL/SQL: could not find program unit being called

In OM_TAX_UTIL.TAX_LINE there are calls to ARP_PROCESS_TAX’s procedures.
ARP_PROCESS_TAX package gets its body invalidated by a AR purge process, which executes DDL operations on a few AR interface tables.
This process recompiles every object it invalidates, before it finishes.
So, ARP_PROCESS_TAX spec and body have VALID status, when its procedures are called by TAX_LINE.
The key for this problem is the fact that the Apache processes that handle the Quoting requests, stay always connected to the database.
For some reason (probably Bug 2747350) the new package state is not picked up.

A demonstration is following to simulate the issue.
We create a table:

CREATE TABLE SYSTEM.TEST_TABLE
TABLESPACE TOOLS
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
NOMONITORING
AS
   SELECT * FROM DBA_OBJECTS;

A view on this table:

CREATE OR REPLACE FORCE VIEW SYSTEM.TEST_VIEW
(
   OWNER,
   OBJECT_NAME,
   SUBOBJECT_NAME,
   OBJECT_ID,
   DATA_OBJECT_ID,
   OBJECT_TYPE,
   CREATED,
   LAST_DDL_TIME,
   TIMESTAMP,
   STATUS,
   TEMPORARY,
   GENERATED,
   SECONDARY
)
AS
   SELECT "OWNER",
          "OBJECT_NAME",
          "SUBOBJECT_NAME",
          "OBJECT_ID",
          "DATA_OBJECT_ID",
          "OBJECT_TYPE",
          "CREATED",
          "LAST_DDL_TIME",
          "TIMESTAMP",
          "STATUS",
          "TEMPORARY",
          "GENERATED",
          "SECONDARY"
     FROM TEST_TABLE;

A package which uses this view, and is equivalent to ARP_PROCESS_TAX:

CREATE OR REPLACE PACKAGE TEST_PKG
IS
   X   CONSTANT NUMBER := 1;
   GVAR         VARCHAR2 (50);

   FUNCTION GETINFO
      RETURN VARCHAR2;
END;
/

CREATE OR REPLACE PACKAGE BODY TEST_PKG
IS
   FUNCTION GETINFO
      RETURN VARCHAR2
   IS
   BEGIN
      SELECT OBJECT_NAME
        INTO GVAR
        FROM TEST_VIEW
       WHERE OBJECT_ID = 100;
      RETURN GVAR;
   END;
END;
/

A package which calls test_pkg.getInfo and has exception handling of ORA-6508 error.
This is equivalent to the OM_TAX_UTIL package:

CREATE OR REPLACE PACKAGE TEST_PKG_RUN
IS
   X   CONSTANT NUMBER := 1;

   PROCEDURE RUNPROC;
END;
/

CREATE OR REPLACE PACKAGE BODY TEST_PKG_RUN
IS
   PROCEDURE RUNPROC
   IS
      PACKAGE_EXCEPTION   EXCEPTION;
      PRAGMA EXCEPTION_INIT (PACKAGE_EXCEPTION, -6508);
      D                   VARCHAR2 (50);
   BEGIN
      D := TEST_PKG.GETINFO ();
      DBMS_OUTPUT.PUT_LINE (D);
      DBMS_LOCK.SLEEP (10);           --> to allow me time to recreate package
   EXCEPTION
      WHEN PACKAGE_EXCEPTION
      THEN
         DBMS_OUTPUT.PUT_LINE ('Called failed with ' || SQLCODE);
   END;
END;
/

We open one session [1] and run test_pkg_run.runproc:

SQL> conn system@sme_gnvdev
Enter password: *******
Connected.

SQL> set serveroutput on
SQL> exec test_pkg_run.runproc;
I_IDL_UB11
PL/SQL procedure successfully completed.

We open a second session [2] and modify test_view, which invalidates test_pkg’s body:

SQL> conn system@sme_gnvdev
Enter password: *******
Connected.

SQL> CREATE OR REPLACE FORCE VIEW SYSTEM.TEST_VIEW
2 (
3 OWNER,
4 OBJECT_NAME,
5 SUBOBJECT_NAME,
6 OBJECT_ID,
7 DATA_OBJECT_ID,
8 OBJECT_TYPE,
9 CREATED,
10 LAST_DDL_TIME,
11 --TIMESTAMP,
12 STATUS,
13 TEMPORARY,
14 GENERATED,
15 SECONDARY
16 )
17 AS
18 SELECT "OWNER",
19 "OBJECT_NAME",
20 "SUBOBJECT_NAME",
21 "OBJECT_ID",
22 "DATA_OBJECT_ID",
23 "OBJECT_TYPE",
24 "CREATED",
25 "LAST_DDL_TIME",
26 -- "TIMESTAMP",
27 "STATUS",
28 "TEMPORARY",
29 "GENERATED",
30 "SECONDARY"
31 FROM test_table;
View created.

SQL> select object_type,status
2 from dba_objects where object_name='TEST_PKG';

OBJECT_TYPE STATUS
------------------
PACKAGE VALID
PACKAGE BODY INVALID

In [2] we compile test_pkg’s body and validate it:

SQL> alter package test_pkg compile body;
Package body altered.

SQL> select object_type,status
2 from dba_objects where object_name='TEST_PKG';

OBJECT_TYPE STATUS
------------------
PACKAGE VALID
PACKAGE BODY VALID

In [1] any execution of test_pkg_run.runproc results to a ORA-6508 error:

SQL> set serveroutput on
SQL> exec test_pkg_run.runproc;
Called failed with -6508
PL/SQL procedure successfully completed.

SQL> set serveroutput on
SQL> exec test_pkg_run.runproc;
Called failed with -6508
PL/SQL procedure successfully completed.

SQL> set serveroutput on
SQL> exec test_pkg_run.runproc;
Called failed with -6508
PL/SQL procedure successfully completed.

Oracle has filed this issue under Bug 8613161: PRAGMA EXCEPTION_INIT MASKS ORA-4068 AND PACKAGE IS NOT RE-INSTANTIATED PROBLEM:

 1. Clear description of the problem encountered: 


A PL/SQL package declares a user defined exception using PRAGMA EXCEPTION_INIT for ORA-6508. When this error occurs a second user defined  exception is raised which appears to mask the underlying ORA-4068 error which  accompanies the ORA-6508 error. This has the effect of preventing the Package from being re-instantiated in the session even though the underlying  cause of the ORA-6508 error (an invalid dependent) is resolved.  


    procedure runproc is 
      package_exception exception; 
      rzy_except exception; 
      PRAGMA EXCEPTION_INIT (package_exception, -6508); 
      PRAGMA EXCEPTION_INIT (rzy_except, -20001); 
      d varchar2(50); 
    begin 
      d:=test_pkg.getInfo(); 
      dbms_output.PUT_LINE(d); 
      dbms_lock.sleep(10); —> to allow me time to recreate package 
    exception 
      when package_exception then 
      dbms_output.put_line(‘Called failed with ‘||sqlcode); 
      —raise; 
      raise rzy_except; 
    end; 


If the raised user defined exception (raise rzy_except;) is replaced with the raise statement, the ORA-4068 error is shown on the error stack and the package is re-instantiated in the session. 


I have raised this bug as a P2 because the APPS customer has coded a great deal of customisation code before encountering this error and it is not feasible for them to make the necessary code changes.  


=========================     
DIAGNOSTIC ANALYSIS: 
=========================    
WORKAROUND: 
Use the raise statement or reconnect to the db. 
=========================    
RELATED BUGS: 
Bug 229349 ORA-4068 LEADS TO INSERT ALWAYS FAILING IF TRIGGER USES RAISE_APPLICATION_ERROR. 
=========================    
REPRODUCIBILITY: 
 1. State if the problem is reproducible; indicate where and predictability Reproduces every time 
 2. List the versions in which the problem has reproduced   On Solaris Oracle Version 10.2.0.4, 11.1.0.7 
 3. List any versions in which the problem has not reproduced . 
=========================     
tc.sql — creates table, view and package. 
tc1.sql — runs the package 
tc2.sql — drops and recreates the view and checks the status of the package in user_objects. 
Two sessions A and B  
1. Run tc.sql to set up the table, view and package. 
2. Run tc1.sql to run the package and straight after in session B run tc2.sql 
Session A 
SQL> @tc.sql 
SQL> @tc1.sql 
Session B 
SQL> @tc2.sql 


Results: 
ERROR at line 1: 
ORA-20001: 
ORA-06512: at «SCOTT.TEST_PKG_RUN», line 17 
ORA-04061: existing state of package body «SCOTT.TEST_PKG» has been invalidated 
ORA-04065: not executed, altered or dropped package body «SCOTT.TEST_PKG» 
ORA-06508: PL/SQL: could not find program unit being called: «SCOTT.TEST_PKG» 
ORA-06512: at line 1 


This error occurs every time even though the package is now valid, which can be shown in session B. 
When ‘raise rzy_except;’ is commented out and replaced by ‘raise;’, the package reports the following error: 


ERROR at line 1: 
ORA-04068: existing state of packages has been discarded 
ORA-04061: existing state of package body «SCOTT.TEST_PKG» has been  invalidated
ORA-04065: not executed, altered or dropped package body «SCOTT.TEST_PKG» 
ORA-06508: PL/SQL: could not find program unit being called: «SCOTT.TEST_PKG» 
ORA-06512: at «SCOTT.TEST_PKG_RUN», line 16 
ORA-06512: at line 1 


The following call to the package works as expected as the ORA-4068 error triggers an in-instantiation of the package. 
This is not a bug.  The only way to force it to clear the package state, recompile the package and load the new instantiation is to allow the ORA-4068 to be raised back to the client.  By trapping it you are signalling to Oracle that you do not want this to happen yet.   


Apart from changing their code the only other option is to use event 10945  that reverts behaviour to 8i so that it will not raise the error at all but carry on using the old copy of the package.  This also means that the package  does not get recompiled on the next call to it in that session.


I would not generally recommend customers do this as, if for instance the application uses connection/session pooling, it could be that some sessions run for a long time using an out of date copy of a package.  


The event can be set at session level via: 
alter session set events = ‘10945 trace name context forever, level 1’; 


but they’d probably need it set system wide.   


Note, this event only works as long as the old instantiation exists.  If a new session calls the same currently invalid package and therefore recompiles it automatically, or an alter compile is issued, then the event will have no effect on the existing session and the errors will be raised again.   


Using the testcase, with the event set in tc1.sql and the alter compile commented out of tc2.sql the package remains invalid and no errors occur.   


Run the alter compile though and the errors will appear. 

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Ora 06502 описание ошибки
  • Ora 06502 pl sql буфер символьных строк слишком маленький ошибка числа или значения
  • Ora 06502 pl sql numeric or value error null index table key value
  • Ora 06502 pl sql numeric or value error invalid lob locator specified
  • Oracle dbms utility format error backtrace

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии