Возврат одной строки в функции Oracle - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь вернуть одну строку пользовательских данных из функции на основе ввода пользователя.Я не могу получить доступ к значениям столбцов объекта.Я пробовал решение процедуры здесь , а также в значительной степени копирование решения здесь (с использованием ORACLE и SQLDeveloper)

CREATE OR REPLACE FUNCTION F_FINDBYSSN (SSN VARCHAR2)
   RETURN T_USEROBJECT
AS
   THISUSER   T_USEROBJECT;
BEGIN
   SELECT T_USEROBJECT (A.USER_ID,
                        A.FIRSTNAME,
                        A.LASTNAME,
                        A.SOCIAL,
                        A.BIRTHDATE,
                        A.PHONE,
                        A.USER_ROLE_TYPE_ID,
                        A.USER_LOGIN_ID,
                        A.USER_LAST_LOGIN,
                        B.LOGIN_USERNAME,
                        B.LOGIN_PASSWORD)
     INTO THISUSER
     FROM BANK_USERS A
          INNER JOIN LOGININFO B
             ON     A.USER_LOGIN_ID = B.LOGIN_ID
                AND A.SOCIAL = SSN;

   RETURN THISUSER;
END;
/

Объект является пользователем

CREATE OR REPLACE TYPE T_USEROBJECT IS OBJECT
(
   USERID INTEGER,
   FNAME VARCHAR2 (50),
   LNAME VARCHAR2 (50),
   SSN VARCHAR2 (15),
   BIRTHDATE DATE,
   USERPHONE VARCHAR2 (15),
   ROLEID INT,
   LOGINID INT,
   LASTLOGIN DATE,
   UNAME VARCHAR2 (50),
   UPASS VARCHAR (50)
);
/

Это выводит [T_USEROBJECT]

SELECT *
FROM ( SELECT F_FINDBYSSN('123-45-6789') AS THISUSER FROM DUAL );

Использование любых имен столбцов в операторе выбора приводит к ошибке «неверный идентификатор»

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Найден ответ здесь.Нужно использовать функцию «Лечить» следующим образом:

SELECT TREAT(THISUSER AS T_USEROBJECT).USERID, TREAT(THISUSER AS T_USEROBJECT).FNAME
 FROM ( SELECT * FROM (SELECT F_FINDBYSSN('123-45-6789') AS THISUSER FROM DUAL ));

Как выбрать из столбца типа объекта в Oracle 11g?

0 голосов
/ 21 сентября 2018

Я нашел один способ сделать это, но не слишком ли сложно получить одну строку?

CREATE OR REPLACE TYPE t_singleuserset IS TABLE OF t_userobject;
/

CREATE OR REPLACE FUNCTION select_userrow (ssn IN VARCHAR)
   RETURN t_singleuserset
AS
   l_user   t_singleuserset := t_singleuserset ();
   n        INTEGER := 0;
BEGIN
   FOR i IN (SELECT a.user_id,
                    a.firstname,
                    a.lastname,
                    a.social,
                    a.birthdate,
                    a.phone,
                    a.user_role_type_id,
                    a.user_login_id,
                    a.user_last_login,
                    b.login_username,
                    b.login_password
               FROM bank_users a
                    INNER JOIN logininfo b
                       ON     a.user_login_id = b.login_id
                          AND a.social = ssn)
   LOOP
      l_user.EXTEND ();
      n := n + 1;
      l_user (n) :=
         t_userobject (i.user_id,
                       i.firstname,
                       i.lastname,
                       i.social,
                       i.birthdate,
                       i.phone,
                       i.user_role_type_id,
                       i.user_login_id,
                       i.user_last_login,
                       i.login_username,
                       i.login_password);
   END LOOP;

   RETURN l_user;
END;
/

SELECT * FROM TABLE (select_userrow ('123-45-6789'));
...