Почему эта хранимая процедура SQL требует, чтобы для ее работы была создана временная таблица (возвращает результаты)? - PullRequest
3 голосов
/ 08 сентября 2011

IBM Informix Dynamic Server версии 11.50.FC6

Я работал над небольшой хранимой процедурой, которая брала бы поля имен из таблицы и разбирала их в «имена пользователей» с максимум 8 символами.

Это код, который я пытался:

CREATE PROCEDURE build_jics_user (pid INT)
    RETURNING CHAR(8) AS username;
    SELECT LOWER((SUBSTR(firstname,0,1))||(SUBSTR(lastname,0,7))) username
    FROM id_rec
    WHERE id = pid;
END PROCEDURE;

Ошибка возвращается при выполнении:

  659: INTO TEMP table required for SELECT statement.
Error in line 5
Near character position 15

Я не понимаю, в чем смысл вызова временной таблицы, и я также не смог найти в Интернете аналогичных простых примеров, которые бы работали без ошибок.

Кто-нибудь знает, что мне не хватает?

Ответы [ 2 ]

4 голосов
/ 08 сентября 2011

То, что вы хотите сказать, это:

CREATE PROCEDURE build_jics_user (pid INT)
    RETURNING CHAR(8);
    DEFINE username CHAR(8);
    SELECT LOWER((SUBSTR(firstname,0,1))||(SUBSTR(lastname,0,7))) INTO username
      FROM id_rec
      WHERE id = pid;
    RETURN username;
END PROCEDURE;

... и выполните это так:

EXECUTE PROCEDURE build_jics_user(42);

ОБНОВЛЕНИЕ

Если цель этого состоит в том, чтобы быть функцией, в которой она требуется внутри некоторого другого SQL, тогда вы можете сделать следующее:

CREATE FUNCTION jics_user(fname VARCHAR(255), lname VARCHAR(255))
    RETURNING CHAR(8);
    RETURN LOWER(SUBSTR(fname,0,1) || SUBSTR(lname,0,7));
END FUNCTION;

... и выполнить ее так:

SELECT id, firstname, lastname, jics_user(firstname, lastname) AS jics_user, ...
  FROM id_rec;

Нет реальной технической разницы между ПРОЦЕДУРОЙ и ФУНКЦИЕЙ, это скорее утверждение о том, как она используется.

3 голосов
/ 08 сентября 2011

Это , кажется, соответствует дизайну (что должно учитывать отсутствие 'аналогично простых примеров в Интернете' ). Очевидно, что любые данные, которые вы извлекаете с помощью оператора SELECT в хранимой процедуре, вы не можете вернуть их напрямую. Вы должны хранить их во временной таблице или в переменных для дальнейшего использования.

Вполне вероятно, что ваш оператор SELECT должен выглядеть следующим образом

SELECT LOWER((SUBSTR(firstname,0,1))||(SUBSTR(lastname,0,7))) <b>INTO</b> username
FROM id_rec
WHERE id = pid;
...