Имя: Пароль:
1C
1С v8
Запрос Oracle из 1с
,
0 cmex
 
27.05.13
13:30
Всем привет.
Создал внешний источник данных к таблицам Oracle. Все сработало, список таблиц и полей в источнике виден. Там есть таблица MTL_SECONDARY_INVENTORIES. Из нее выбрал все поля. Делаю запрос:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
      |    INV_MTL_SECONDARY_INVENTORIES.ORGANIZATION_ID
      |ИЗ
      |    ВнешнийИсточникДанных.Oracle.Таблица.INV_MTL_SECONDARY_INVENTORIES КАК INV_MTL_SECONDARY_INVENTORIES";
тз = Запрос.Выполнить().Выгрузить();
тз.ВыбратьСтроку();

Все выбирается.

Однако,когда пишу напрямую запрос

Команды = Новый COMObject("ADODB.Command");
Подключение = Новый COMОбъект("ADODB.Connection");
Подключение.ConnectionString = "Driver={Microsoft ODBC for Oracle};Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.ru)(PORT=1522))(CONNECT_DATA=(SID=xxx)));Uid=xxx;Pwd=xxx;";
   Подключение.Open();
   Команды.ActiveConnection = Подключение;
   Команды.CommandTimeOut = 10000;
   
   //Команды.CommandText = "Select * FROM all_objects where object_name = 'MTL_SECONDARY_INVENTORIES'";
   Команды.CommandText = "Select ORGANIZATION_ID FROM MTL_SECONDARY_INVENTORIES";                    
   
   RS = Новый COMОбъект ("ADODB.RecordSet");
   RS = Команды.Execute();

выдает ошибку - Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC driver for Oracle][Oracle]ORA-00942: таблица или представление пользователя не существует

В чем беда?
1 ДенисЧ
 
27.05.13
13:31
Права пользователя?
2 Buggy01
 
27.05.13
13:34
INV_ во втором примере не забыл подставить?
3 cmex
 
27.05.13
13:35
(1) не понял смысла вопроса. если выбирать из Внеш ист данных, то эти данные выбираются в полном объеме. Если писать прямой запрос, то нет таблицы. Права мне предоставляют админы оракловских баз.
4 cmex
 
27.05.13
13:35
(2) тот же эффект(
5 ДенисЧ
 
27.05.13
13:36
(3) uid одинаковый?
6 cmex
 
27.05.13
13:38
(5) uid чего? и где/как его узнать?
7 ДенисЧ
 
27.05.13
13:39
(6) логин пользователя в оракле...
8 cmex
 
27.05.13
13:40
(7) одинаковый
если поможет, то вот выборка из всех объектов

Команды.CommandText = "Select * FROM all_objects where object_name = 'MTL_SECONDARY_INVENTORIES'";

результат

INV    MTL_SECONDARY_INVENTORIES        42 678    42 678    TABLE
APPS    MTL_SECONDARY_INVENTORIES        66 752        SYNONYM
9 Ненавижу 1С
 
гуру
27.05.13
13:40
Execute или Open ?
10 cmex
 
27.05.13
13:41
(9) весь код предоставлен выше
11 cmex
 
27.05.13
13:42
к (8)

RS = Новый COMОбъект ("ADODB.RecordSet");
RS = Команды.Execute();
                                                 
Пока НЕ (RS.EOF) Цикл

Сообщить(RS.Fields(0).Value()+"    "+RS.Fields(1).Value()+"    "+RS.Fields(2).Value()+"    "+RS.Fields(3).Value()+"    "+RS.Fields(4).Value()+"    "+RS.Fields(5).Value());
               
RS.MoveNext();
КонецЦикла;
12 Маратыч
 
27.05.13
13:46
(8) Это все в рамках юзерспейса того же SID?
13 romansun
 
27.05.13
13:53
1С и Оракле ))

1. Имеет ли реальный смысл использовать "Внешние источники данных" когда, по сути, уже всё и так написано (строка подключение, запрос, провайдер), чтобы сделать прямой запрос?

2. проверьте доступность таблиц запросом "SELECT * FROM USER_TABLES". Ошибка у вас из-за того, что нет доступа к таблице, скорее всего. Ну, понятно, если такая такая таблица в принципе есть и правильное имя.
14 romansun
 
27.05.13
13:58
(13)
ээ, не прочитал детально, что пробуете двумя способами извиняйте )

но ошибка сама по себе, да, у меня возникала, когда для данного логина была недоступна таблица. В USER_TABLES можно увидеть все "свои" доступные поля
15 cmex
 
27.05.13
14:14
(12) что?
16 Маратыч
 
27.05.13
14:15
(16) Собсно, подразумевалось (13), п.2.
17 cmex
 
27.05.13
14:24
(14)Спасибо, что то есть.
Если я правильно понял,то в "SELECT * FROM USER_TABLES" нас интересует 2 колонка. В результате моей таблицы не оказалось. Сделал запрос к одной из разрешенных, сработало. Отсюда два вопроса. 1. С какой просьбой обратиться к админам, чтоб увидеть в прямом запросе 2. Как так получилось, что при Внешнем ист данных удалось прочитать таблицу,а в прямом запросе нет?
18 kihor
 
27.05.13
15:04
Вы не указываете название схемы перед именем таблицы. Очевидно логинитесь не под юзером INV или APPS.
Укажите запрос таким образом:  
Select ORGANIZATION_ID FROM INV.MTL_SECONDARY_INVENTORIES
У меня, по крайней мере, он отработал без ошибок.
19 romansun
 
27.05.13
15:06
(16) да, +1..

(17) хм... я бы админам так и расписал, что, дескать, вот под данным логином таблица не видна, сделайте там что-нить :) Думаю, они поймут проблему. Ну и, кстати, текст ошибки и скажите им.

а вот как и почему 1С-ка так вот волшебно обошла права - хз. логин/пароль и название... эээ... базы (схемы) те же?
20 cmex
 
27.05.13
15:34
(18) так тоже пробовал, ничего(
(19) абсолютно. причем админы говорят, что делают выборку под этим же логином, все выбирается.
21 kihor
 
27.05.13
16:30
Попробуйте сами зайти сторонней тулзой, например, TOAD или SQL*Plus, под логином, который указан в ConnectionString как "Uid=xxx" и выполните запрос. Сразу сами увидите в 1С ли дело или в запросе. Кстати, если не секрет, под каким логином Вы коннектитесь?
22 cmex
 
27.05.13
16:39
(21) спасибо, попробую. логин, xxiface
23 kihor
 
27.05.13
18:06
Судя по всему это не один из стандартных пользователей Oracle Applications и синонима для таблицы INV.MTL_SECONDARY_INVENTORIES для него нет. Тогда еще раз обратите внимание на (18). Я тестировал ситуацию, аналогичную Вашей, и указание схемы у меня решило проблему.
24 Живой Ископаемый
 
27.05.13
19:44
А схема где?  В схеме этого пользователя есть такая таблица?
25 cmex
 
28.05.13
09:09
(24) я с ораклом первый раз встретился, поэтому не совсем понимаю, что вы имеете в виду и как это проверить.
26 romansun
 
28.05.13
11:17
(25)

я с ораклом тож, один раз пока.. хотя встреча еще не закончилась ))

http://citforum.ru/database/oracle/polzov_shema/
http://oracle-dba.ru/oracle_schemas.php
http://www.oracloid.ru/index.php?t=381