Потому что "обычные" языки программирования не имеют ничего общего с СУБД, все
они более низкого уровня.
В СУБД и конкретно SQL ты пишешь "пожелание серверу", ЧТО ты хочешь получить, но не КАК
ты хочешь получить, вот это "как" сервер за тебя решает.
Хотя многие конструкции уже начинают скатываться именно к "как", потому как ещё
не придумали, как обойтись без этого, и это огорчает.
Одно другому не мешает. Вот было бы прикольно иметь что-то типа женериков:
CREATE PROCEDURE GetChildren<T> (
ParentId INTEGER )
RETURNS (
ChildId INTEGER )
WHERE T : ITree(Id INTEGER PRIMARY KEY, ParentId INTEGER REFERENCES
ITree(Id))
AS
DECLARE ChildId1 INTEGER;
BEGIN
SUSPEND;
FOR SELECT Id FROM T WHERE T.ParentId = :ParentId INTO :ChildId1 DO
BEGIN
ChildId = ChildId1;
SUSPEND;
FOR SELECT ChildId FROM GetChildren(:ChildId1) INTO :ChildId DO
SUSPEND;
END
END
А потом вызывать процедуру так:
SELECT * FROM GetChildren<Table_1>(1);
SELECT * FROM GetChildren<Table_2>(1);
SELECT * FROM GetChildren<Table_3>(1);
Это было бы вобще супер. Никаких противоречий с тем что вы написали не вижу.