Я знаю, что это кажется простой вещью, но я никогда не делал этого раньше.
Я хотел бы вернуть одну запись из существующей таблицы в результате функции Oracle PL / SQL. Я уже нашел несколько разных способов сделать это, но мне интересен лучший способ сделать это (читай: я не настолько доволен тем, что нашел).
Суть того, что я делаю, заключается в следующем ... У меня есть таблица с именем 'users', и я хочу, чтобы функция 'update_and_get_user', которой присвоено имя пользователя (а также другая доверенная информация о указанном пользователе), потенциально могла выполнять различные действия с таблицей 'users', а затем вернуть либо ноль, либо одну строку / запись из указанной таблицы.
Это основной набросок кода в моей голове на данный момент (читай: понятия не имею, синтаксис даже близок к правильному):
CREATE FUNCTION update_and_get_user(UserName in VARCHAR2, OtherStuff in VARCHAR2)
RETURN users PIPELINED IS
TYPE ref0 IS REF CURSOR;
cur0 ref0;
output_rec users%ROWTYPE;
BEGIN
-- Do stuff
-- Return the row (or nothing)
OPEN cur0 FOR 'SELECT * FROM users WHERE username = :1'
USING UserName;
LOOP
FETCH cur0 INTO output_rec;
EXIT WHEN cur0%NOTFOUND;
PIPE ROW(output_rec);
END LOOP;
END update_and_get_user;
Я видел примеры, когда возвращалась запись или таблица, тип записи или таблицы был создан / объявлен заранее, но похоже, что если таблица уже была определена, я смогу использовать это, и таким образом, не нужно беспокоиться о синхронизации кода объявления типа, если когда-либо вносятся изменения в таблицу.
Я открыт для всех потенциальных решений и комментариев, но я действительно действительно хочу сохранить это в одной функции PL / SQL (в отличие от кода на каком-либо другом языке / фреймворке, который взаимодействует с базы данных несколько раз, заканчивая некоторой формой «SELECT * FROM users WHERE username = blah»), поскольку система, вызывающая функцию, и сама база данных могут быть разными городами. За пределами этого предела я готов изменить свое мышление.