Объявление и установка переменных в операторе выбора - PullRequest
20 голосов
/ 03 августа 2010

Я пытаюсь написать простой запрос, в котором я объявляю некоторые переменные, а затем использую их в операторе выбора в Oracle.Ранее я мог делать это в SQL Server с помощью следующего:

DECLARE @date1   DATETIME
SET @date1 = '03-AUG-2010'

SELECT U.VisualID
FROM Usage u WITH(NOLOCK)
WHERE U.UseTime > @Date1

Из проведенного поиска выяснилось, что вы не можете объявлять и устанавливать переменные, подобные этой, в инструкциях Select.Это правильно или я что-то пишу?

Ответы [ 4 ]

15 голосов
/ 04 августа 2010

По результатам проведенного поиска выяснилось, что вы не можете объявлять и устанавливать переменные, подобные этой, в инструкциях Select.Это правильно или я что-то упустил?

В Oracle PL / SQL и SQL два разных языка с двумя отдельными движками.Вы можете встроить SQL DML в PL / SQL, и вы получите переменные.Например, следующий анонимный блок PL / SQL.Обратите внимание, что / в конце не является частью PL / SQL, но говорит SQL * Plus отправить предыдущий блок.

declare 
    v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
    v_Count number;
begin
    select count(*) into v_Count
    from Usage
    where UseTime > v_Date1;
    dbms_output.put_line(v_Count);
end;
/

Проблема в том, что блок эквивалентен вашему T-SQLкод не будет работать:

SQL> declare 
  2      v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
  3  begin
  4      select VisualId
  5      from Usage
  6      where UseTime > v_Date1;
  7  end;
  8  /
    select VisualId
    *
ERROR at line 4:
ORA-06550: line 4, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement

Чтобы передать результаты запроса из PL / SQL, анонимного блока, хранимой процедуры или хранимой функции, курсор должен быть объявлен, открыт и затем возвращенвызывающая программа.(За рамками ответа на этот вопрос. РЕДАКТИРОВАТЬ: см. Получить набор результатов из хранимой процедуры оракула )

Клиентский инструмент, который подключается к базе данных, может иметь свою собственную привязкупеременные.В SQL * Plus:

SQL> -- SQL*Plus does not all date type in this context
SQL> -- So using varchar2 to hold text
SQL> variable v_Date1 varchar2(20)
SQL>
SQL> -- use PL/SQL to set the value of the bind variable
SQL> exec :v_Date1 := '02-Aug-2010';

PL/SQL procedure successfully completed.

SQL> -- Converting to a date, since the variable is not yet a date.
SQL> -- Note the use of colon, this tells SQL*Plus that v_Date1
SQL> -- is a bind variable.
SQL> select VisualId
  2  from Usage
  3  where UseTime > to_char(:v_Date1, 'DD-Mon-YYYY');

no rows selected

Обратите внимание, что вышеприведенное относится к SQL Plus, может не работать (вероятно, не будет) в Toad PL / SQL Developer и т. Д. Строки, начинающиеся с переменной и execявляются командами SQL Plus.Они не являются командами SQL или PL / SQL.Строки не выбраны, поскольку таблица пуста.

3 голосов
/ 29 июля 2015

Я попробовал это, и это сработало:

define PROPp_START_DT = TO_DATE('01-SEP-1999')

select * from proposal where prop_start_dt = &PROPp_START_DT

1 голос
/ 03 августа 2010

Команда SET специфична для TSQL - вот PLSQL эквивалентный тому, что вы опубликовали:

v_date1 DATE := TO_DATE('03-AUG-2010', 'DD-MON-YYYY');

SELECT u.visualid
  FROM USAGE u 
 WHERE u.usetime > v_date1;

Также нет необходимости префиксировать переменные с помощью "@"; Я склоняюсь к префиксам переменных с "v_", чтобы различать переменные и столбцы / и т. Д.

См. эту ветку об Oracle, эквивалентном NOLOCK ...

0 голосов
/ 03 августа 2010

Попробуйте функцию to_date .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...