Меню

Ora 00942 table or view does not exist ошибка

Содержание

  • 1 Исправьте ошибку ora-00942
    • 1.1 Недостаточно прав пользователя
    • 1.2 Таблица или представление на самом деле не существуют
    • 1.3 Таблица или представление находятся в другой схеме

Иногда вы видите ошибку ora-00942 при выполнении оператора SQL. У него есть несколько причин, и, как обычно, синтаксис ошибок не является наиболее описательным. Если вы сталкиваетесь с этим и хотите знать, как исправить ошибку ora-00942, читайте дальше.

Насколько я знаю, есть три основные причины ошибки ora-00942:

  1. Недостаточно прав пользователя
  2. Таблица или представление на самом деле не существуют
  3. Таблица или представление находятся в другой схеме

Я покажу вам, как обратиться к каждому.

Исправьте ошибку ora-00942

Прежде всего, небольшой отказ от ответственности. Я не администратор баз данных, я администратор Windows, а также специалист по аппаратному и настольному оборудованию. Я знаю, как запустить SQL, но не до какой-то степени опыта и, конечно, не до уровня, который может устранять проблемы. Я должен был попросить моего друга Oracle DBA о помощи, поэтому, пока я писал эту часть, все умные биты принадлежали ему.

Этот список из трех причин ошибки ora-00942 не является исчерпывающим. Есть, очевидно, другие случайные причины этого, но эти три, по-видимому, наиболее распространены.

Недостаточно прав пользователя

Одной из основных причин ошибки ora-00942 является то, что у пользователя недостаточно прав для доступа к рассматриваемой таблице. Вы можете проверить это, выполнив два запроса.

-- перечислить системные привилегии для пользователя или роли
SELECT * FROM dba_sys_privs
ГДЕ получатель гранта (user_role, 'PUBLIC');

— список привилегий объекта для пользователя или роли

SELECT грантополучатель, владелец || '.' || объект table_name, привилегия, грантируемое
FROM dba_tab_privs
ГДЕ получатель гранта (user_role)
ORDER BY грантополучатель, владелец || '.' || table_name, привилегия;

Эти двое скажут вам, имеет ли данный пользователь правильные привилегии для запуска команды. Если пользователь имеет правильные привилегии, переходите к следующему. Если пользователь не имеет правильных привилегий, предоставьте их им или попросите администратора БД сделать это.

Ошибка ora-00942 также может возникнуть, если пользователь используемой схемы имеет привилегии INSERT, но не привилегии SELECT. Опять же, проверьте уровень привилегий и добавьте SELECT в список или попросите администратора БД сделать это. Очевидно, что каждой схеме должна быть предоставлена ​​определенная привилегия SELECT, в противном случае вы все равно увидите ошибку ora-00942.

Таблица или представление на самом деле не существуют

Причиной ошибки ora-00942 может быть неправильный синтаксис запроса или отсутствие таблицы. Хотя это может показаться логичным для начала, я уверен, что привилегия пользователя является причиной ошибки номер один. Таблица, которой там нет или используется неверный синтаксис таблицы, занимает второе место.

Чтобы проверить, существует ли таблица, сначала проверьте синтаксис запроса. Если синтаксис правильный, запустите этот запрос.

ВЫБЕРИТЕ владельца, имя_объекта, тип_объекта
ОТ всех_объектов
WHERE object_type IN ('TABLE', 'VIEW')
AND имя_объекта = ‘YOUR_TABLE_NAME ';

В последней строке вставьте фактическое имя таблицы, где вы видите «YOUR_TABLE_NAME». Это должно точно сказать вам, существует ли таблица, к которой вы пытаетесь обратиться, или нет. Если он возвращается без таблицы, запрашиваемая вами таблица не существует в схеме или базе данных.

Если в используемой вами системе есть меню «Таблицы», вы можете вручную проверить таблицу, если хотите, но вышеуказанный запрос выполняет свою работу.

Таблица или представление находятся в другой схеме

Если у пользователя есть права, и таблица существует, но вы все еще видите ошибку ora-00942, скорее всего, это связано со схемой. Если вы управляете несколькими схемами, легко выполнить запрос к схеме, которая не принадлежит вам. Когда вы заняты и против этого, это простая ошибка, чтобы сделать.

Проверьте схему вручную, если можно или добавьте имя схемы в строке ОТ вашего запроса. Если у вас нет правильных привилегий для новой схемы, вы снова увидите ошибку ora-00942. Вернитесь к первому исправлению привилегий пользователя и проверьте соответствующую схему или попросите своего администратора базы данных сделать это за вас.

Как упомянуто выше, я проконсультировался с моим приятелем по DBA Oracle для этой работы, так что вся заслуга ему в тяжелой работе. Если вы обнаружите здесь какие-либо ошибки или упущения, они одни. Дайте мне знать в разделе комментариев, если я что-то пропустил или ошибся, и я исправлю это.

Если вам известен какой-либо другой способ исправить ошибку ora-00942, сообщите нам об этом ниже!

Because this post is the top one found on stackoverflow when searching for «ORA-00942: table or view does not exist insert», I want to mention another possible cause of this error (at least in Oracle 12c): a table uses a sequence to set a default value and the user executing the insert query does not have select privilege on the sequence. This was my problem and it took me an unnecessarily long time to figure it out.

To reproduce the problem, execute the following SQL as user1:

create sequence seq_customer_id;

create table customer (
c_id number(10) default seq_customer_id.nextval primary key,
name varchar(100) not null,
surname varchar(100) not null
);

grant select, insert, update, delete on customer to user2;

Then, execute this insert statement as user2:

insert into user1.customer (name,surname) values ('michael','jackson');

The result will be «ORA-00942: table or view does not exist» even though user2 does have insert and select privileges on user1.customer table and is correctly prefixing the table with the schema owner name. To avoid the problem, you must grant select privilege on the sequence:

grant select on seq_customer_id to user2;

totn Oracle Error Messages


Learn the cause and how to resolve the ORA-00942 error message in Oracle.

Description

When you encounter an ORA-00942 error, the following error message will appear:

  • ORA-00942: table or view does not exist

Cause

You tried to execute a SQL statement that references a table or view that either does not exist, that you do not have access to, or that belongs to another schema and you didn’t reference the table by the schema name.

Resolution

The option(s) to resolve this Oracle error are:

Option #1

If this error occurred because the table or view does not exist, you will need to create the table or view.

You can check to see if the table exists in Oracle by executing the following SQL statement:

SELECT *
FROM all_objects
WHERE object_type IN ('TABLE','VIEW')
AND object_name = 'OBJECT_NAME';

For example, if you are looking for a suppliers table, you would execute:

SELECT *
FROM all_objects
WHERE object_type IN ('TABLE','VIEW')
AND object_name = 'SUPPLIERS';

Option #2

If this error occurred because you do not have access to the table or view, you will need to have the owner of the table/view, or a DBA grant you the appropriate privileges to this object.

Option #3

If this error occurred because the table/view belongs to another schema and you didn’t reference the table by the schema name, you will need to rewrite your SQL to include the schema name.

For example, you may have executed the following SQL statement:

SELECT *
FROM suppliers;

But the suppliers table is not owned by you, but rather, it is owned by a schema called app, you could fix your SQL as follows:

SELECT *
FROM app.suppliers;

If you do not know what schema the suppliers table/view belongs to, you can execute the following SQL to find out:

SELECT owner
FROM all_objects
WHERE object_type IN ('TABLE','VIEW')
AND object_name = 'SUPPLIERS';

This will return the schema name who owns the suppliers table.

СyberSpec

Кибернетик

465 / 89 / 12

Регистрация: 10.04.2009

Сообщений: 424

1

24.11.2011, 09:00. Показов 102154. Ответов 17

Метки нет (Все метки)


Доброе утро.

Вчера вечером обнаружил мистическую ситуацию, прошу помощи, сам я пока найти объяснение не смог.

Суть такова:
Выполняю запрос

T-SQL
1
Select * FROM D_LS_PLS

Получаю ошибку:

START at : 24.11.2011 8:45:54
Oracle Connection Opened, OK
System.Data.OracleClient.OracleException: ORA-00942: table or view does not exist

Делаю вывод что у меня опечатка в названии таблицы. Делаю селект на получения списка таблиц:

T-SQL
1
Select * FROM all_Tables

Вижу что имя таблицы такое же. Проверил трижды. Копировал копипастом и писал вручную, в итоге

ORA-00942: table or view does not exist

После этого запустил Microsoft Access открыл там новую БД и выбрал импорт. подключение через ODBC и в списке доступных для импорта таблиц увидел таблицу: D_V_LS_PLS.

Вот и странности.

  • В таблице all_Tables нет D_V_LS_PLS но есть D_LS_PLS
  • Обращение к D_LS_PLS вызывает ошибку ORA-00942
  • Обращение к D_V_LS_PLS открывает таблицу со структурой как у D_LS_PLS

Как быть? Дело в том что у меня несколько таблиц вида D_LS_* в Microsoft Access имеют вид D_V_LS_* по непонятной причине. Я пишу программу которая будет работать не только на моем компьютере поэтому нужно разобраться.

Спасибо.



0



Модератор

4186 / 3026 / 576

Регистрация: 21.01.2011

Сообщений: 13,096

24.11.2011, 10:01

2

Честно говоря, не очень понял, причем тут Access.

Правильно ли я понял, что ты видишь в all_tables (которая вовсе не таблица, а view) таблицу tab1, но при SELECT из нее получаешь ORA-942 ? При этом ты НЕ видишь в all_tables таблицу tab2, но SELECT из нее проходит?

Или где?



1



Кибернетик

465 / 89 / 12

Регистрация: 10.04.2009

Сообщений: 424

24.11.2011, 10:14

 [ТС]

3

Цитата
Сообщение от Grossmeister
Посмотреть сообщение

Честно говоря, не очень понял, причем тут Access.

Правильно ли я понял, что ты видишь в all_tables (которая вовсе не таблица, а view) таблицу tab1, но при SELECT из нее получаешь ORA-942 ? При этом ты НЕ видишь в all_tables таблицу tab2, но SELECT из нее проходит?

Или где?

Да именно так. Access ни при чем, просто через него я увидел имя tab2 которую я не вижу в all_tables.
Иначе никак не смог бы догадаться что tab2 существует. Так в чем же дело?)



0



9 / 9 / 8

Регистрация: 20.04.2010

Сообщений: 34

24.11.2011, 10:17

4

Попробуйте подключится как SYSDBA и посмотреть ее



0



Кибернетик

465 / 89 / 12

Регистрация: 10.04.2009

Сообщений: 424

24.11.2011, 10:20

 [ТС]

5

Цитата
Сообщение от bloker
Посмотреть сообщение

Попробуйте подключится как SYSDBA и посмотреть ее

У меня минимум прав. Я не могу выполнять административные задачи. Но могу попросить если будет обоснование необходимости. Только это долго и не удобно..



0



Grossmeister

Модератор

4186 / 3026 / 576

Регистрация: 21.01.2011

Сообщений: 13,096

24.11.2011, 10:24

6

Могут быть разные предположения.
Первый случай(1) — например, в названии есть пробелы и/или непечатные символы, или разный регистр. Пробелы я обычно выявляю так:

SQL
1
2
SELECT '*'|| TABLE_NAME ||'*'
FROM all_tables

В более сложном случае

SQL
1
2
SELECT TABLE_NAME, dump(TABLE_NAME)
FROM all_tables

Второй случай(2) — например, это не таблица, а view или external table. Можно ее поискать в all_objects



1



Кибернетик

465 / 89 / 12

Регистрация: 10.04.2009

Сообщений: 424

24.11.2011, 10:46

 [ТС]

7

Получилось найти D_V_LS_PLS(представление) и D_LS_PLS(таблица) в all_objects
Еще вопрос остался.
Я имею доступ к представлению, к таблице просто нет прав, правильно? Это можно как нибудь показать? Ну чтоб я сказал: вот смотрите мой логин и пароль не имеет прав читать эту таблицу.



0



Grossmeister

Модератор

4186 / 3026 / 576

Регистрация: 21.01.2011

Сообщений: 13,096

24.11.2011, 11:01

8

Цитата
Сообщение от СyberSpec

Я имею доступ к представлению, к таблице просто нет прав, правильно?

Нет. Если бы ты не имел прав на таблицу, то в all_tables и в all_objects ты бы ее не видел.
В all_* показаны твои объекты + те, на которые тебе выданы гранты.

Кстати, откуда ты выполняешь запросы? Надеюсь, из SQL*PLus? Приведи протокол работы в нем с обращением к этой таблице и вывод этого имени из all_tables.

На всякий случай проверь привилегии на эту таблицу из

SQL
1
2
SELECT *
FROM all_tab_privs

Вдруг там нет привилегии на SELECT, а только на DML (хотя так обычно не делают)



1



СyberSpec

Кибернетик

465 / 89 / 12

Регистрация: 10.04.2009

Сообщений: 424

24.11.2011, 11:23

 [ТС]

9

Цитата
Сообщение от Grossmeister
Посмотреть сообщение

Нет. Если бы ты не имел прав на таблицу, то в all_tables и в all_objects ты бы ее не видел.
В all_* показаны твои объекты + те, на которые тебе выданы гранты.

Кстати, откуда ты выполняешь запросы? Надеюсь, из SQL*PLus? Приведи протокол работы в нем с обращением к этой таблице и вывод этого имени из all_tables.

На всякий случай проверь привилегии на эту таблицу из

SQL
1
2
SELECT *
FROM all_tab_privs

Вдруг там нет привилегии на SELECT, а только на DML (хотя так обычно не делают)

Протокол это лог или как-то создать нужно? я с sql*plus не работал, не знаю что вы просите. вот ошибка при попытке прочитать таблицу D_LS_PLS

Миниатюры

Странная ошибка ORA-00942: table or view does not exist
 



0



Кибернетик

465 / 89 / 12

Регистрация: 10.04.2009

Сообщений: 424

24.11.2011, 11:37

 [ТС]

10

Вот тут видно что я вижу а что нет

Миниатюры

Странная ошибка ORA-00942: table or view does not exist
 



0



Модератор

4186 / 3026 / 576

Регистрация: 21.01.2011

Сообщений: 13,096

24.11.2011, 11:38

11

ОК, можно и так, хотя обычно делают копипаст с экрана.
Теперь сделай остальное, что я просил

PS
А через что ты работаешь с Oracle вместо SQL*Plus?

PPS
Обычно SQL*Plus используют для вывода, если есть подозрение на возможность ошибки GUI. Так сказать, истина в последней инстанции



1



Кибернетик

465 / 89 / 12

Регистрация: 10.04.2009

Сообщений: 424

24.11.2011, 11:45

 [ТС]

12

Цитата
Сообщение от Grossmeister
Посмотреть сообщение

ОК, можно и так, хотя обычно делают копипаст с экрана.
Теперь сделай остальное, что я просил

PS
А через что ты работаешь с Oracle вместо SQL*Plus?

PPS
Обычно SQL*Plus используют для вывода, если есть подозрение на возможность ошибки GUI. Так сказать, истина в последней инстанции

Постом выше еще добавил скрин.

Я сам клиент простой написал, она просто sql запросы отправляет на сервер и таблицы выводит на экран.

Миниатюры

Странная ошибка ORA-00942: table or view does not exist
 



0



Модератор

4186 / 3026 / 576

Регистрация: 21.01.2011

Сообщений: 13,096

24.11.2011, 11:57

13

Из all_tables видно, что владелец таблицы — parus. Ты под ним заходишь, когда обращаешься к искомой таблице?



1



Кибернетик

465 / 89 / 12

Регистрация: 10.04.2009

Сообщений: 424

24.11.2011, 12:18

 [ТС]

14

Цитата
Сообщение от Grossmeister
Посмотреть сообщение

Из all_tables видно, что владелец таблицы — parus. Ты под ним заходишь, когда обращаешься к искомой таблице?

Я не знаю как это посмотреть. Только логин и пароль указываю и другие таблицы с владельцем PARUS у меня открываются.



0



Grossmeister

Модератор

4186 / 3026 / 576

Регистрация: 21.01.2011

Сообщений: 13,096

24.11.2011, 12:31

15

Посмотреть, под каким пользователем зашел

SQL
1
2
SELECT USER
FROM dual

Если ты зашел не под владельцем таблицы (но на нее у тебя есть гранты), то есть две возможности обращения к ней:
1.

SQL
1
2
SELECT *
FROM parus.d_ls_pls   -- т.е. имя схемы в качестве префикса

2. создать синоним на эту таблицу (приватный в своей схеме или public). Тогда можно будет обращаться к ней БЕЗ префикса.
Список синонимов

SQL
1
2
SELECT *
FROM all_synonyms



2



СyberSpec

Кибернетик

465 / 89 / 12

Регистрация: 10.04.2009

Сообщений: 424

24.11.2011, 12:38

 [ТС]

16

Цитата
Сообщение от Grossmeister
Посмотреть сообщение

Посмотреть, под каким пользователем зашел

SQL
1
2
SELECT USER
FROM dual

Если ты зашел не под владельцем таблицы (но на нее у тебя есть гранты), то есть две возможности обращения к ней:
1.

SQL
1
2
SELECT *
FROM parus.d_ls_pls   -- т.е. имя схемы в качестве префикса

2. создать синоним на эту таблицу (приватный в своей схеме или public). Тогда можно будет обращаться к ней БЕЗ префикса.
Список синонимов

SQL
1
2
SELECT *
FROM all_synonyms

Спасибо за объяснения Все работает если указывать префикс

T-SQL
1
Select * From PARUS.D_LS_PLS



0



105 / 75 / 0

Регистрация: 29.06.2009

Сообщений: 328

25.11.2011, 14:22

17

Да, интересная задачка. Синоним, скорее всего, битый — указывает на какую-нибудь отсутствующую таблицу. И если так, то лучше разобраться, поскольку может оказаться, что прописывать овнера в прикладухе не лучший вариант.



0



sql error ORA-00942: Table Or View Does Not Exist by manish sharma

SQL error ORA-00942: Table Or View Does Not Exist is very common. I was reading your comments the other day. Consequently I saw that some of you guys are having a problem in finding objects like table or views in the schema and facing an error. 

So what does this “ORA-00942: Table or View Does not Exist” error means?

It means exactly what it says, the table or view you are executing your query on does not exist in your schema. To explain, whenever you execute a query which includes a table, view, synonym or a cluster which does not exist into the schema with which you are connected the SQL engine will show you this error.

sql error ORA-00942: Table Or View Does Not Exist by manish sharma

So how can we solve it?

You can easily solve this error either by creating the missing object (by object I mean a table, view, synonym or a cluster) or by importing it from another source into your schema.

Is there any way we can check what objects do we have in our schema?

Yes, we can easily check out how many objects are created and saved in a schema. In addition to their types and names.

Oracle provides a View which comes pre-created into the SYS schema. And using it we can find out how many objects are there in a schema as well as what are their types and names. The name of that view is TAB.

What is this TAB view?

TAB is a pre-created view which is saved into the SYS schema of the Oracle Database. Furthermore this view stores the name, type and the cluster id of all the tables, views, synonyms and clusters created into the schema of the database.

Do we need to create this view?

No, TAB view is created by Oracle engine during the creation of the database thus you don’t have to worry about it. 

Can we use this view in any schema of the database?

TAB view can easily be accessed by any user/schema of the database through its public synonym. Moreover along with the TAB view, Oracle engine also creates its public synonym with the same name. Which provides the secure access to the TAB view to any schema in the database.

In addition, both the TAB view and its public synonym share the same name which is TAB and the same structure, so don’t be confused.

What is the structure of the TAB view?

TAB view consists of three columns, TNAME, TABTYPE, and CLUSTERID. First two columns are of VARCHAR2 type and hold the name of the database object and their types. Meanwhile the third column is of NUMBER type and holds the Cluster ID of the cluster if you have created any in your schema.

Check out the structure of TAB view here.

sql error ORA-00942: Table Or View Does Not Exist by manish sharma

Info Byte:
You can check out the structure of the TAB view just by using DESCRIBE command, Like this
DESC TAB;

Ok, I think I have answered almost all the questions about the TAB view. Do you think something is left out or you still have some doubts? Then feel free to write to me on my Facebook or Twitter.

Anyways, now let’s do some examples.

You first need to connect with the schema whose object’s information you want to find out. For example, let’s say I want to find out how many objects are created in HR schema and what are their names. Once you have decided that go ahead and connect your database with that schema.

You can read my blog on how to connect with the database using SQL Developer and SQL*Plus as well.

Before showing you the examples of TAB view let me tell you that I am connected to my database through the HR user. But you can use any of these queries in any user/schema of your desire. They will show you the result accordingly.

Example 1: Show me the complete information about all the tables, views, synonyms and clusters created in my schema.

SELECT * FROM tab;

On successful execution, the above query will show you the name, type and the cluster id of all the tables, views, synonyms and clusters created in the schema with which you are connected.

Example 2: Show me the total number of objects created into my schema.

In order to find out the total number of objects created in a schema, you can use the COUNT function with the TAB view. Like this

SELECT count (*) FROM tab;

On successful execution, this query will show you the total number of objects created in your schema.

Example 3: Show me how many tables are there in the schema and what are their names.

In order to find out the information of a specific object, you can use the WHERE clause and filter the result.

SELECT * FROM tab WHERE tabtype = ‘TABLE’;

This query will show the information of all the objects of the schema which are tables. You can refine this query even more like this:

SELECT tname FROM tab WHERE tabtype = ‘TABLE’;

This will show you only the names of all the tables created into the schema. In case you only want to find out the total number of tables created into the schema then you can modify this query like this:

SELECT count (*) FROM tab WHERE tabtype = ‘TABLE’;

This will show you the total number of tables created in your schema.

Like this you can tweak the queries according to your needs.

Now, if you have gone through the blog carefully then take this poll on my Facebook page and check out your knowledge.

Yes, I do have Facebook and I post a lot of Programming Quizzes there!

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

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

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ora 00918 column ambiguously defined ошибка
  • Ora 12560 tns ошибка адаптера протокола как исправить