Подтвердить что ты не робот

Как объявить и использовать переменные в 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

4b9b3361

Ответ 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?