Простая переменная Oracle Назначение SQL - PullRequest
7 голосов
/ 07 ноября 2011

Несмотря на то, что я потратил целый час на изучение, я не могу понять, как правильно определить переменную и затем использовать ее в вашем SQL.

Это то, что я до сих пор произвел:

DECLARE startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy');

из которых я получаю ответ:

ORA-06550: строка 1, столбец 63: PLS-00103: обнаружен символ «конец файла» при ожидании одного из следующего:

начало функциональный пакет прагма тип процедуры подтип использование текущая форма курсор

Подробности: ОБЪЯВИТЬ ДАТУ startDate: = to_date ('03 / 11/2011 ', 'Дд / мм / гггг'); Ошибка в строке 1 ORA-06550: строка 1, столбец 63: PLS-00103: Обнаружен символ «конец файла» при ожидании одного из следующее:

начало функциональный пакет прагма тип процедуры подтип использование текущая форма курсор

Мне бы очень хотелось узнать, как выполнить такое простое задание!

Ответы [ 5 ]

13 голосов
/ 07 ноября 2011

Ваше объявление переменной правильное.

Ключевое слово DECLARE используется для определения переменных, ограниченных областью действия в блоке PL / SQL (тело которого ограничено BEGIN и END;). Как вы хотите использовать эту переменную?

У меня нормально работает следующий PL / SQL:

DECLARE 
    startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy');
    reccount INTEGER;
BEGIN
    SELECT count(*) INTO reccount 
        FROM my_table tab 
        WHERE tab.somedate < startDate;
    dbms_output.put_line(reccount);
END;

Вы также можете использовать оператор DEFINE, чтобы использовать простые строковые переменные. Они подходят для таких клиентов, как SQL / PLUS или TOAD.

DEFINE start_date = "to_date('03/11/2011', 'dd/mm/yyyy')"
SELECT COUNT(*) from my_table tab where tab.some_date < &start_date;
5 голосов
/ 07 ноября 2011

Чтобы выполнить то, что вы пытаетесь в Toad, вам вообще не нужно объявлять переменную.Просто включите вашу переменную с предваряющим двоеточием, и Toad предложит вам значение переменной при выполнении запроса.Например:

select * from all_tables where owner = :this_is_a_variable;

Если изначально это не сработало, щелкните правой кнопкой мыши в любом месте редактора и убедитесь, что установлен флажок «Запрашивать переменные замещения».

Если вы действительно хотитесделать это аналогично тому, как SQL Server обрабатывает переменные (или вы хотите сделать то же самое в SQL * Plus), вы можете написать это следующим образом:

var this_is_a_variable varchar2(30); 

exec :this_is_a_variable := 'YOUR_SCHEMA_NAME';

print this_is_a_variable;

select * from all_tables where owner = :this_is_a_variable;

Однако, чтобы это работалов Toad вам нужно будет запустить его через «Выполнить как скрипт», а не через типичную команду «Выполнить оператор».

3 голосов
/ 16 октября 2015

Это старый пост, но в случае, если кто-то наткнется на это (как я только что), вы можете справиться с этим с помощью CTE:

with params as (
      select date '2011-11-03' as startdate
      from dual
     )
select . . .
from params cross join
     . . .

Почти такой же синтаксис работает в SQL Server (минусdate -специфичные вещи и from dual).

3 голосов
/ 07 ноября 2011

Помните, что Oracle PL / SQL - это , а не SQL.

PL / SQL - это процедурный язык. SQL не является процедурным, но вы можете определить «переменные», которые пользователь может ввести с помощью синтаксиса «& var» (см. http://www.orafaq.com/node/515).

0 голосов
/ 21 апреля 2015

Можете ли вы попробовать это:

DEF  startDate = to_date('03/11/2011', 'dd/mm/yyyy');
Select &startDate from dual;
...