Comments 33
И это не последнее различие, с которым сталкиваются при переходе из одной СУБД в другую. Главное в этом случае — грамотно использовать возможности конкретной СУБД.
+5
сложновато. в Firebird как то понятнее всё:
CREATE PROCEDURE GET_EMPLOYEES(
DEP_ID INTEGER = NULL;
)
RETURNS( --список возвращаемых полей
EMPLOYEE VARCHAR(50);
DEPARTMENT VARCHAR(50);
) AS
BEGIN
FOR SELECT E.empinfo, D.depinfo
FROM T_DEPARTMENTS D
JOIN T_EMPLOYESS E ON E.id_department = D.id
WHERE :DEP_ID IS NULL OR D.ID = :DEP_ID INTO :EMPLOYEE, :DEPARTMENT DO
SUSPEND; -- Это волшебное слово - аналог pipe row
END
SELECT * FROM GET_EMPLOYEES()
0
UFO just landed and posted this here
1) в принципе характерно для SQL всех разновидностей. Очевидно язык планировался для пользовательского уровня, но для рядовых юзеров он все равно сложен, а для специалистов получился слишком многословным
-1
Я усматриваю в этом преимущества:
1) укрепляются мышцы пальцев;
2) программисту подконтрольны те механизмы, которые в том же MSSQL являются черным ящиком, например sequences.
1) укрепляются мышцы пальцев;
2) программисту подконтрольны те механизмы, которые в том же MSSQL являются черным ящиком, например sequences.
-1
кстати в MSSQL так и не запилили sequences? Очень нужны. И UPDATE… RETURNING и INSERT… RETURNING
Привык ко всем этим ништякам на Firebird
Привык ко всем этим ништякам на Firebird
0
В 2008 не увидел. Не представляю, как без этого можно строить многопользовательские системы, использующие поля с автоинкрементом. Приходится использовать GUID.
0
там вроде есть какой-то костыль с возвратом id вставленной строки. Впрочем этот костыль почему-то во многих СУБД встречается и считается нормальным решением.
В Firebird вообще решительно отказались от автоинкрементных полей в пользу SEQUENCE. По-началу кажется дикостью, а потом понимаешь удобство
В Firebird вообще решительно отказались от автоинкрементных полей в пользу SEQUENCE. По-началу кажется дикостью, а потом понимаешь удобство
0
UFO just landed and posted this here
А если между
insert
и select @@SCOPE_IDENTITY
проскочит транзакция с insert от другого пользователя?0
это только в ХП доступно? или в обычном запросе можно?
0
1. Последовательности, наконец, появились. В SQL Server 2008 R2 Service Pack 1 ( CTP) уже точно. sqlserver-training.com/how-to-create-and-use-sequence-in-sql-server/-
2. Очень давно есть, OUTPUT Clause называется
2. Очень давно есть, OUTPUT Clause называется
0
pipelined имеет смысл использовать когда весь результирующий набор вы сами формируете. А если необходимо вернуть результат select, то проще использовать курсор.
+2
Возвратить таблицу можно еще так:
CREATE OR REPLACE
FUNCTION admin.virtual_date_table(p_num_rows in INTEGER, p_start_date IN DATE, p_end_date IN DATE)
RETURN virtual_date_table_type
IS
l_data virtual_date_table_type := virtual_date_table_type();
l_step NUMBER := 1;
BEGIN
l_step := (p_end_date - p_start_date) / p_num_rows;
FOR i IN 1 .. p_num_rows
LOOP
l_data.extend;
l_data(l_data.count) := p_start_date + i * l_step;
END LOOP;
RETURN l_data;
END;
/
select * from table(virtual_date_table(5, sysdate-5, sysdate))
+1
UFO just landed and posted this here
Нет. А что Вас смутило?
0
UFO just landed and posted this here
У нас речь идет именно о получении набора данных, а не о программном интерфейсе
0
UFO just landed and posted this here
Вы однозначно не уловили изюминки. Описанный шаблон позволяет вызывать функции выборок однотипно, меняя только название и параметры. Отсюда и логичная модель, когда методы работы с данными инкапсулируются в одном объекте. Или, по Вашему, в клиенте лучше наклепать кучу TADOQuery и TADOStoredProc'ов с жестко прописанными параметрами?
0
Кстати, а зачем было в самой функции разделение на два курсора делать?
Ведь можно написать условие в курсоре
where (dep.id = prm_depID or prm_depID is null)
ну, или, развлечения ради,
where nvl(to_char(dep.id), '') LIKE nvl(to_char(prm_depID), '%')
Ведь можно написать условие в курсоре
where (dep.id = prm_depID or prm_depID is null)
ну, или, развлечения ради,
where nvl(to_char(dep.id), '') LIKE nvl(to_char(prm_depID), '%')
+2
Sign up to leave a comment.
Функции в Oracle, возвращающие таблицу