Как объявить и использовать переменные в PL/SQL, как в T-SQL?
В Sql Server, часто когда я тестирую тело хранимой процедуры, я копирую тело в SSMS, DECLARE - переменные в верхней части страницы, устанавливают их в некоторые значения выборки и выполняют тело как -is.
Например, если мой proc
CREATE PROC MySampleProc
@Name VARCHAR(20)
AS
SELECT @Name
Тогда мой тестовый sql будет
DECLARE @Name VARCHAR(20)
SET @Name = 'Tom'
SELECT @Name
Что такое эквивалент Oracle PL/SQL?
Это самое близкое, что я придумал, но я получаю "PLS-00428: предложение INTO ожидается в этой инструкции SELECT"
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, однако, не хочет иметь ничего общего с этим....
![enter image description here]()
Если вы запустили как Script ", он будет соблюдать ваши значения по умолчанию, но он будет возвращать результаты только в виде текста ASCI, а не в таблицу/таблицу
![enter image description here]()
Ответы
Ответ 1
Пересмотренный ответ
Если вы не вызываете этот код из другой программы, опция должна пропускать 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;
Это не очень полезно, если вы пытаетесь вернуть набор результатов. В этом случае вы захотите вернуть коллекцию или refcursor. Тем не менее, использование любого из этих решений потребует обертывания вашего кода в функции или процедуре и выполнения функции/процедуры из того, что может удовлетворить результаты. Функция, работающая таким образом, может выглядеть примерно так:
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;
Ответ 2
В 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;
Ответ 3
Переменные не определены, но объявлены.
Это возможный дубликат объявляет переменные в блоке pl/sql
Но вы можете посмотреть здесь:
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:
Обратитесь сюда: Как вернуть набор результатов/курсор из анонимного блока Oracle PL/SQL, который выполняет Dynamic SQL?