Я пытаюсь записать простой запрос, где я объявляю некоторые переменные и затем использую их в избранном операторе в Oracle. Я смог сделать это прежде в SQL Server со следующим:
DECLARE @date1 DATETIME
SET @date1 = '03-AUG-2010'
SELECT U.VisualID
FROM Usage u WITH(NOLOCK)
WHERE U.UseTime > @Date1
От поиска, который я сделал, кажется, что Вы не можете объявить и установить переменные как это в операторах Select. Это правильно или является мной mssing что-то?
Проведенный мной поиск показал, что вы не можете объявлять и устанавливать такие переменные в операторах 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, будь то анонимный блок, хранимая процедура или хранимая функция, курсор должен быть объявлен, открыт и затем возвращен вызывающей программе. (За рамками ответа на этот вопрос. РЕДАКТИРОВАТЬ: см. Получить набор результатов из хранимой процедуры Oracle )
Клиентский инструмент, который подключается к базе данных, может иметь собственные переменные связывания. В 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. Строки не выбраны, потому что таблица пуста.
Команда 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_", чтобы различать переменные и столбцы/etc.