Потому что "обычные" языки программирования не имеют ничего общего с СУБД, все 
они более низкого уровня.
В СУБД и конкретно 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);

Это было бы вобще супер. Никаких противоречий с тем что вы написали не вижу.

Ответить