Как объявлять и использовать переменные в 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-текста, а не в виде сетки/таблицы.
Пересмотренный ответ
Если вы не вызываете этот код из другой программы, то есть вариант пропустить PL/SQL и сделать это строго на SQL, используя переменные привязки:
Во многих программах (таких как Toad и SQL Developer), если опустить операторы
var
иexec
, программа запросит у вас значение.Оригинальный ответ
Большое различие между T-SQL и PL/SQL заключается в том, что Oracle не позволяет вам неявно возвращать результат запроса. Результат всегда должен быть явно возвращен каким-то образом. Самый простой способ - использовать
DBMS_OUTPUT
(примерно эквивалентноprint
) для вывода переменной:Однако это не очень удобно, если вы пытаетесь вернуть набор результатов. В этом случае вы захотите вернуть либо коллекцию, либо рефкурсор. Однако использование любого из этих решений потребует обернуть ваш код в функцию или процедуру и запустить функцию/процедуру из чего-то, что способно получить результаты. Функция, работающая таким образом, могла бы выглядеть примерно так:
В Oracle PL/SQL, если вы выполняете запрос, который может вернуть несколько строк, вам нужен курсор для итерации результатов. Самый простой способ - цикл for, например:
Если запрос возвращает ровно одну строку, то можно использовать синтаксис
select...into...
, например:Переменные не определяются, а объявляются.
Это возможный дубликат 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