kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Tom Halladay
Tom Halladay
Вопрос

Как объявлять и использовать переменные в PL/SQL, как это делается в T-SQL?

В Sql Server часто, когда я тестирую тело хранимой процедуры, я копирую тело в SSMS, РАЗРЕШАЮ переменные в верхней части страницы, устанавливаю их в некоторые примерные значения и выполняю тело как есть.

Например, если моя процедура

CREATE PROC MySampleProc
    @Name   VARCHAR(20)
AS
    SELECT @Name

Тогда мой тестовый sql будет выглядеть следующим образом

DECLARE @Name VARCHAR(20)
SET     @Name = 'Tom'

    SELECT @Name

Каков эквивалент этого в Oracle PL/SQL?

Это самое близкое, что я придумал, но я получаю "PLS-00428: в этом операторе SELECT ожидается предложение INTO"

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     select myname from DUAL;
END;

Вот лучший пример того, что я пытаюсь сделать:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     SELECT *
     FROM   Customers
     WHERE  Name = myname;
END;

Но опять же, он хочет 'INTO', в то время как на самом деле я просто хочу, чтобы записи печатались на экране, а не хранились в другой таблице.....

РАЗРЕШЕНО:

Благодаря @Allan, я добился того, что все работает достаточно хорошо. Oracle SQL Developer, очевидно, запоминает значения параметров, которые вы ему предоставляете. PL/SQL Developer, однако, не хочет иметь ничего общего с этим.....

введите описание изображения здесь

Если вы "Запустите как сценарий", он будет подчиняться вашим значениям по умолчанию, но результаты будут возвращаться только в виде ASCI-текста, а не в виде сетки/таблицы.

введите описание изображения здесь

24 2012-06-04T18:48:15+00:00 3
Tom Halladay
Tom Halladay
Редактировал вопрос 6-го июня 2012 в 2:58
Программирование
oracle
sql-server
tsql
plsql
oracle-sqldeveloper
Решение / Ответ
 Allan
Allan
4-го июня 2012 в 7:53
2012-06-04T19:53:10+00:00
Дополнительно
Источник
Редактировать
#16353086

Пересмотренный ответ

Если вы не вызываете этот код из другой программы, то есть вариант пропустить PL/SQL и сделать это строго на SQL, используя переменные привязки:

var myname varchar2(20);

exec :myname := 'Tom';

SELECT *
FROM   Customers
WHERE  Name = :myname;

Во многих программах (таких как Toad и SQL Developer), если опустить операторы var и exec, программа запросит у вас значение.


Оригинальный ответ

Большое различие между T-SQL и PL/SQL заключается в том, что Oracle не позволяет вам неявно возвращать результат запроса. Результат всегда должен быть явно возвращен каким-то образом. Самый простой способ - использовать DBMS_OUTPUT (примерно эквивалентно print) для вывода переменной:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     dbms_output.print_line(myname);
END;

Однако это не очень удобно, если вы пытаетесь вернуть набор результатов. В этом случае вы захотите вернуть либо коллекцию, либо рефкурсор. Однако использование любого из этих решений потребует обернуть ваш код в функцию или процедуру и запустить функцию/процедуру из чего-то, что способно получить результаты. Функция, работающая таким образом, могла бы выглядеть примерно так:

CREATE FUNCTION my_function (myname in varchar2)
     my_refcursor out sys_refcursor
BEGIN
     open my_refcursor for
     SELECT *
     FROM   Customers
     WHERE  Name = myname;

     return my_refcursor;
END my_function;
 Allan
Allan
Редактировал ответ 12-го августа 2013 в 4:12
20
0
 GriffeyDog
GriffeyDog
4-го июня 2012 в 8:26
2012-06-04T20:26:53+00:00
Дополнительно
Источник
Редактировать
#16353087

В Oracle PL/SQL, если вы выполняете запрос, который может вернуть несколько строк, вам нужен курсор для итерации результатов. Самый простой способ - цикл for, например:

declare
  myname varchar2(20) := 'tom';
begin
  for result_cursor in (select * from mytable where first_name = myname) loop
    dbms_output.put_line(result_cursor.first_name);
    dbms_output.put_line(result_cursor.other_field);
  end loop;
end;

Если запрос возвращает ровно одну строку, то можно использовать синтаксис select...into..., например:

declare 
  myname varchar2(20);
begin
  select first_name into myname 
    from mytable 
    where person_id = 123;
end;
4
0
 rkosegi
rkosegi
4-го июня 2012 в 7:02
2012-06-04T19:02:14+00:00
Дополнительно
Источник
Редактировать
#16353085

Переменные не определяются, а объявляются.

Это возможный дубликат https://stackoverflow.com/questions/8469301/declare-variables-in-a-pl-sql-block.

Но вы можете посмотреть здесь :

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#i27306

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm

UPDATE:

См. здесь: https://stackoverflow.com/questions/2153053/how-to-return-a-resultset-cursor-from-a-oracle-pl-sql-anonymous-block-that-exe

 Community
Community
Редактировал ответ 23-го мая 2017 в 12:16
1
0
Похожие сообщества 8
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
3 542 пользователей
Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.
Открыть telegram
Oracle Developer👨🏻‍💻
Oracle Developer👨🏻‍💻
2 683 пользователей
ТОП канал о разработке в СУБД Oracle: SQL, PL/SQL, оптимизация, архитектура, сертификации и многое другое... Автор канала: Кивилёв Денис @denis_dbd Сотрудничество, обучение, вопросы, мнения - пишите. Youtube-канал: https://www.youtube.com/c/OracleDBD
Открыть telegram
sql_ninja
sql_ninja
2 520 пользователей
Канал для тех, кто знает или интересуется SQL 🛢 Взаимная помощь и позитив =) Вакансии тут - @sql_jobs Бан за: оскорбления, спам, фри рекламу, расизм, сексизм. Наш MSSQL канал - @sqlcom По рекламе: @aveLestat
Открыть telegram
SQL JOBS
SQL JOBS
2 144 пользователей
Обязательны: компания, город, позиция, вилка, наличие удалёнки, требования, контакты. Бан за рекламу, сексизм, расизм и неадекватный обсёр объявлений
Открыть telegram
Oracle RU
Oracle RU
1 338 пользователей
Русскоязычная группа по Oracle. Архитектура, PL/SQL, Оптимизация, DBA Вакансии - по согласованию с адм. @ikamil Запрещены: личные оскорбления, мат, обсуждения оффтопик вопросов политики и религии Вопросы - после гугла, используя sqlfiddle, планы запроса
Открыть telegram
Oracle DBAs Group (RUS)
Oracle DBAs Group (RUS)
934 пользователей
Вы можете добавлять свои знания на сайтах: oracle-dba.ru plsql.ru Лучше потратить какое-то количество времени, чтобы записать успешный опыт, чем потом повторно воспроизводить по памяти. Друг познается в БД
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ES
ID
JA
KO
RU
TR
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией