Предложение Oracle WITH не возвращает данных - PullRequest
0 голосов
/ 22 сентября 2011

Я пытаюсь использовать предложение WITH в Oracle, но оно не возвращает никаких данных.

Это запрос, который я пытаюсь выполнить ...

with test as 
 (select count(*)  
 from my_table)
select *
from test;

КогдаЯ запускаю этот код, я возвращаю количество записей в my_table

select count(*)  
 from my_table

Я нахожусь на Oracle 10g, поэтому запрос должен работать ...

select * from v$version;

приводит к

Oracle Database 10g Enterprise Edition, выпуск 10.2.0.4.0 - 64bi
PL / SQL, выпуск 10.2.0.4.0 - Производство
CORE 10.2.0.4.0 Производство
TNS для Solaris:Версия 10.2.0.4.0 - Производство
NLSRTL Версия 10.2.0.4.0 - Производство

Может ли быть проблема с разрешениями или что-то подобное?

* РЕДАКТИРОВАТЬ: *

Полагаю, мой вопрос ясен.Использование оператора WITH не вернет мне никаких записей, даже если оператор «select count (*) from my_table» внутри оператора WITH работает правильно, что заставило бы меня поверить, что есть еще одна проблема, которую я не могу выяснитьотсюда вопрос:)

РЕДАКТИРОВАТЬ 2

ОК, поэтому, если я попытаюсь выполнить запрос со связанного сервера из студии управления SQL-сервером, я получу некоторую информацию об ошибкеназад:

sg 7357, Уровень 16, Состояние 2, Строка 1 Не удается обработать объект "с тестом как (выберите количество (*) из v $ version) выберите * из теста;".Поставщик OLE DB «MSDAORA» для связанного сервера «MyServer» указывает, что либо у объекта нет столбцов, либо у текущего пользователя нет разрешений на этот объект.

Ответы [ 5 ]

1 голос
/ 22 сентября 2011

Возможно, оптимизатор материализует запрос подсчета (тупой, я согласен). Это выстрел в темноте, но у вас есть эти привилегии?

  • grant query rewrite to youruser;
  • grant create materialized view to youruser;
1 голос
/ 22 сентября 2011

Следующее работает отлично для меня (10gR2)

SQL> with test as
  2   (select count(*)
  3   from user_tables)
  4  select *
  5  from test;

  COUNT(*)
----------
       593

SQL> 

Какой клиент вы используете?

1 голос
/ 22 сентября 2011

Попробуйте дать агрегату псевдоним.

with test as 
 (select count(*) as MyCount 
 from my_table)
select MyCount
from test;
0 голосов
/ 26 февраля 2016

Некоторые люди в моей компании столкнулись с этим на днях - мы проследили это до версии клиента Oracle [и, следовательно, OCI.dll] версии , которую собирал разработчик PL / SQL.На некоторых наших компьютерах разработчика были установлены клиентские установки Oracle 8 (!), А также более поздние версии.

Симптомом было то, что запросы не только были написаны с использованием предложения WITH, но не возвращали строк, они былине возвращая ни одного столбца!Если вы вручную настроите приложение на получение Oracle 11 oci.dll, тогда все заработает.

Я думаю, что происходит, что Oracle 8 предшествует предложению WITH (введенному в Oracle 9 и усовершенствованному впоследствии),Теперь, в основном, вы можете получить разные версии клиента и сервера Oracle для общения друг с другом.Однако, поскольку у клиента есть определенное количество «интеллекта», он должен быть наполовину осведомлен о том, какую операцию он передает в базу данных, так же как и некоторая форма примитивного разбора SQL.Поскольку он не распознает команду как SELECT, он обрабатывает ее как некоторую неизвестную команду (например, возможно, команду DDL) и не распознает ее как возвращающую набор результатов.Если вы включите SQL_TRACE для сеанса, вы увидите, что SQL получает PARSEd и EXECUTEd нормально на сервере, но при этом не выполняется никаких вызовов FETCH.

У меня недавно была похожая вещь, когда я пытался использовать новыйСинтаксис WITH в Oracle 12, который позволяет определять встроенные функции.Если вы попробуете простые примеры с использованием клиентского приложения Oracle 11 толстого типа, такого как PL / SQL developer или SQL * Plus, то вы получите ошибку.Если вы используете клиент Oracle 12 или приложение тонкого клиента, которое не требует установки на стороне клиента, то оно работает.

0 голосов
/ 22 сентября 2011

Этот вопрос сбивает с толку.Вы говорите, что или не не возвращают счет из my_table?

Вы должны вернуть счет, потому что это именно то, что вы просили в

Это аналогично записи:

select * from (select count (*) from my_table);

...