Специальные запросы Oracle PL / SQL - для разработчиков SQL Server

Я занимался разработкой Oracle много лет назад. Я провел большую часть последних 15 лет, работая в основном с SQL Server, и там, где я работал с Oracle, я был изолирован от работы веб-службами и т. Д.

Мой вопрос, кажется, задавали несколько раз в сети, но мне как-то сложно общаться - по крайней мере, судя по ответам. Я очень ценю то, что инструменты и функциональность различаются, знаю, что мне нужно изучать новые вещи, но это так просто, но кажется таким сложным.

Я хочу сделать несколько специальных запросов к базе данных. В настоящее время мы используем SQL Navigator - я открыт для использования других инструментов ...

В SQL Server Management Studio, если вы открываете окно запроса, набираете немного кода SQL, который возвращает значение или набор, вы получаете красивое отображение строк или значений в окне результатов.

Я понял, что с Oracle PL / SQL все немного по-другому, выяснилось, что мне нужно вернуть курсор, но как мне получить инструмент для отображения результатов?

Я начал с простого:

    declare 
        my_id number := 356655;
        cursor c1  is select my_id from dual;

    begin
        open c1;   
    end;

Это работает нормально, но как мне увидеть результаты? Существуют ли какие-либо инструменты, которые справляются с этим так же «хорошо», как SSMS? Я привык делать многое из этого, в том числе такие вещи, как

(возможно, не совсем правильный синтаксис? но идею вы поняли ...)

declare 
    my_id number := 356655;
    cursor c1  is select name from my_table where id = my_id;

begin
    open c1;   

И результаты отображаются мне в виде текста / сетки. В идеале, чтобы было хорошее решение. Может быть, какой-нибудь изящный новый инструмент?


person kpollock    schedule 31.03.2014    source источник


Ответы (3)


С помощью SQL Developer или SQL * Plus вы можете использовать переменную привязки, объявленную перед блоком PL / SQL:

variable rc refcursor;
declare 
  my_id number := 356655;
begin
  open :rc for select my_id from dual;
end;
/

print rc

RC
-------------------------------
356655                                  

Вы также можете использовать переменную привязки в запросе, что может быть полезно:

variable my_id number;
variable rc refcursor;
execute :my_id := 356655;

begin
  open :rc for select :my_id from dual;
end;
/

print rc

variable и _ 4_ описаны в документации SQL * Plus, которая в значительной степени относится и к SQL Developer. - у которого есть собственная документация, включая команды, перенесенные из SQL * Plus.

Если у вас есть функция, которая возвращает указатель ref, вы можете вызвать ее в запросе как select func(val) from dual, а затем результаты могут быть помещены в сетку; или вы можете вызвать функцию (или процедуру) с той же переменной bind :rc и распечатать ее. Но я не уверен, что это поможет, если вы выполняете только специальные запросы.

С другой стороны, использование блока PL / SQL для специального запроса кажется немного неуклюжим, даже если ваши запросы сложны. Вам понадобится веская причина, чтобы открыть курсор для оператора select из блока, а не просто запускать select напрямую. (Не уверен, относится ли это к SQL Server или вам действительно это действительно нужно!). Если вы просто выполняете запрос внутри блока, блок вам не нужен, даже если вы хотите сохранить переменную привязки для значений, которые вы используете в запросе:

variable my_id number;
execute :my_id := 356655;
select :my_id from dual;

    :MY_ID
----------
    356655 
person Alex Poole    schedule 31.03.2014
comment
Предположительно выбор таблицы был бы аналогичным? Интересно, что SQL Navigator, похоже, уловил, что это синтаксис SQL Plus, и игнорирует его. Я не разбираюсь в различиях между SQL Developer и SQL Plus. является ли SQL Developer стандартным инструментом в наши дни? - person kpollock; 31.03.2014
comment
@kpollock - не уверен, что есть стандарт; многие люди используют Toad или PL / SQL Developer, но у SQL Developer есть то преимущество, что он бесплатный. По сути, это версия SQL Plus с графическим интерфейсом пользователя с частями OEM. Я все еще использую SQL Plus большую часть времени. Не уверен, что вы имеете в виду, говоря о «выборе таблицы». Если вы делаете простой выбор, вам не нужны биты PL / SQL вокруг него, и результаты могут либо перейти в сетку, либо на панель вывода скрипта рабочего листа, в зависимости от того, как вы его запускаете (как оператор или как скрипт). Что, вероятно, не будет иметь большого смысла, если / пока вы не воспользуетесь этим клиентом ... - person Alex Poole; 31.03.2014
comment
Использование блока PL / SQL для специального запроса кажется немного неуклюжим. Вы можете объяснить, что такое «легкий» путь? Некоторые из них могут быть сложными, некоторые - простыми. Это просто часть моего стиля работы - проверка данных, поиск проблем, проба. Я сейчас d / l SQL Developer .. - person kpollock; 31.03.2014
comment
@kpollock - я имею в виду, что я не уверен, почему вы вообще используете PL / SQL, а не простой SQL. Я понимаю, что приведенный вами пример является тривиальным для изучения того, как он работает, но неясно, действительно ли вашим реальным запросам нужен элемент PL / SQL или они могут быть простыми операторами select. Ваше описание того, что вы делаете в SSMS, звучит так, будто вам просто нужен простой select? - person Alex Poole; 31.03.2014
comment
Хорошо, это немного похоже на T-SQL vs SQL, но я должен признать, что считаю его всем SQL. Я просто выполняю специальные запросы неизвестной сложности. Выбирает в основном, часто с переменными. Как это сделать проще всего? - person kpollock; 31.03.2014
comment
попытка вашего 2-го примера подсказывает мне значения - это было намерение? И спасибо за все это - намного полезнее, что прочитал мануал n00b ... - person kpollock; 31.03.2014
comment
@kpollock - о, правильно, если вы запустите как оператор, он запросит переменные привязки. Если вы запустите сценарий, этого не произойдет, поскольку он получит их из _1 _ / _ 2_. Вы также можете посмотреть на подстановочные переменные. Если вы выполняете select, независимо от сложности самого запроса, придерживайтесь простого SQL. Вы можете жестко запрограммировать любые значения, которые хотите установить; использование переменных связывания просто упрощает их изменение в одном месте (ну, и это более эффективно, но это не имеет большого значения для ad hoc). - person Alex Poole; 31.03.2014
comment
Я не уверен, что понимаю, что вы подразумеваете под эквивалентом «простого sql» (включая получение вывода). Могу я попросить очень быстрый пример? - person kpollock; 31.03.2014
comment
@kpollock - третий запрос в моем ответе - это "простой SQL" эквивалент второго; это прямой select, а не select, завернутый в блок PL / SQL (_3 _ / _ 4 _ / _ 5_). На самом деле вам следует использовать PL / SQL только для того, чего вы не можете сделать в «простом» SQL. - person Alex Poole; 31.03.2014
comment
Извините, я не видел эту правку. 3-й пример предлагает мне ввести my_id вместо использования назначенного значения ... даже когда я использую оператор run - person kpollock; 31.03.2014
comment
@kpollock - вам нужно использовать «запустить скрипт», чтобы избежать подсказки. (Или, конечно, жестко запрограммируйте значение * 8-) - person Alex Poole; 31.03.2014
comment
«Выполнить сценарий» сделал это. Это означает, что он отображается как текст, а не как сетка. Ну что ж, думаю, этого нет. Благодарю. - person kpollock; 31.03.2014

Я использую Oracle SQL Developer.

В любом случае, это должно работать в любом клиенте Oracle sql:

Если вы просто хотите увидеть свои результаты, вы можете использовать

dbms_output.put_line('Foo' || somevar || ' bar');

Перед этим запустите

 SET SERVEROUTPUT ON 

Посмотрите примеры на docs.oracle.com

person tjati    schedule 31.03.2014

Я бы предложил использовать sql-разработчика, доступного бесплатно с веб-сайта oracle. Есть кнопка, которая позволяет вам запускать sql как скрипт, который вернет то, что вы хотите. SSMS не работает с pl / sql.

person Yas V    schedule 31.03.2014