Функция Oracle Выберите В не работает правильно

#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;
/