#oracle #plsql #oracle11g
Вопрос:
Привет всем, у меня есть код ниже :
CREATE OR REPLACE FUNCTION GET_STATE_USER (user_id IN NUMBER)
RETURN VARCHAR2
AS
staffName VARCHAR2 (50);
BEGIN
DBMS_OUTPUT.put_line(user_id);
SELECT bs.FIRST_NAME || ' ' || bs.LAST_NAME
INTO staffName
FROM EMPLOYEE e
WHERE bs.USER_ID = user_id;
RETURN (CASE
WHEN staffName IS NOT NULL THEN staffName
ELSE 'Invalid'
END);
END;
/
И я получаю следующую ошибку :
ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк
ORA-06512: в «GET_STATE_USER», строка 8
Комментарии:
1. ваш выбор возвращает более одной строки
2. Нет, когда я запускаю его вне функции, это всего лишь одна строка, а столбец пользователя для сотрудника-уникальный человек. @Beso
Ответ №1:
Необходимо изменить имя входной переменной. Имя переменной не должно совпадать с именем столбца таблицы.
попробуйте это :
CREATE OR REPLACE NONEDITIONABLE FUNCTION GET_STATE_USER (user__id IN NUMBER)
RETURN VARCHAR2
AS
staffName VARCHAR2 (50);
BEGIN
DBMS_OUTPUT.put_line(user__id);
SELECT bs.FIRST_NAME || ' ' || bs.LAST_NAME
INTO staffName
FROM EMPLOYEE bs
WHERE bs.USER_ID = user__id;
RETURN (CASE
WHEN staffName IS NOT NULL THEN staffName
ELSE 'Invalid'
END);
END;
Ответ №2:
На самом деле я хотел проверить две таблицы на наличие записи, и, наконец, приведенный ниже код сделал свое дело :
CREATE OR REPLACE FUNCTION GET_STATE_USER (userId IN NUMBER)
RETURN VARCHAR2
AS
r_count NUMBER;
userTitle VARCHAR2 (100);
BEGIN
SELECT COUNT (1)
INTO r_count
FROM EMPLOYEE bs
WHERE bs.USER_ID = userId;
IF r_count > 0
THEN
SELECT bs.FIRST_NAME || ' ' || bs.LAST_NAME
INTO userTitle
FROM EMPLOYEE bs
WHERE bs.USER_ID = userId;
ELSE
SELECT ac.name
INTO userTitle
FROM allcustomer ac
WHERE ac.CUSTOMER_USER_ID = userId;
END IF;
RETURN (CASE
WHEN userTitle IS NOT NULL THEN userTitle
ELSE 'inavlid'
END);
END;
/