Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / insert / 2 сообщений из 2, страница 1 из 1
16.07.2020, 16:13
    #39980533
neteurt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
insert
Здравствуйте, при добавление записи(insert), как мне получить значение айдишника который будет в TRW.id_user и присвоить ему переменную "user_id ", чтобы можно было использовать в дальнейшем по коду? покуда ничего не выходит
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
-- Function: users_set(character varying, character varying, integer, character varying, character varying, character varying, character varying, character varying, character varying, character varying)

 DROP FUNCTION users_set(character varying, character varying, integer, integer, character varying, character varying, character varying, character varying, character varying, character varying, character varying);

CREATE OR REPLACE FUNCTION users_set(
    username character varying, 
    remember_token character varying, 
    p_usersid integer,
    p_departmentid integer,
    p_firstname character varying,
    p_secondname character varying,
    p_lastname character varying,
    p_personal_number character varying,
    p_position character varying,
    p_userstatus character varying,
    p_rolesid character varying)
  RETURNS TABLE(r_rows integer, r_id integer, r_errcode character varying, r_errtext character varying) AS
$BODY$

DECLARE
	id_user INT4 := NULL; -- id сотрудника;
        PValues text[];  -- IN значение параметров
        nP INT2 = 0;     -- количество элеменотов в массиве
        user_id int; 
BEGIN
  BEGIN
      r_errCode := '0';
      r_errText := '<Ok>';


       id_user := user_permit_get(remember_token, username);
       IF id_user IS NOT NULL THEN
 
       PValues := string_to_array(p_rolesid, ',');
       nP := array_length(PValues, 1);

       -- добавление / изменние записи
       BEGIN
           IF ( p_usersid IS NULL ) THEN
               RETURN QUERY
                   WITH TRW AS (
                     INSERT INTO users(
			    id_department_fk,
			    first_name,
			    second_name,
			    last_name,
			    personal_number,
			    position,
			    user_status,
			    created_at,
			    updated_at)

                     VALUES (
                             p_departmentid,
                             p_firstname,
                             p_secondname,
                             p_lastname,
                             p_personal_number,
                             p_position,
                             p_userstatus,
                             TO_CHAR(NOW(), 'YYYY-mm-dd HH24:MI:SS')::timestamp without time zone,
                             TO_CHAR(NOW(), 'YYYY-mm-dd HH24:MI:SS')::timestamp without time zone)

                     RETURNING *
                   )
               SELECT CAST(COUNT(TRW.id_user) as INTEGER), CAST(TRW.id_user as INTEGER), CAST(r_errCode as character varying), CAST(r_errText as character varying)
               FROM TRW
               GROUP BY TRW.id_user, r_errCode, r_errText
               ;
           ELSE
               RETURN QUERY
                   WITH TRW AS (
                     UPDATE users
                     SET
                        id_department_fk = p_departmentid,
                        first_name = p_firstname,
                        second_name = p_secondname,
                        last_name = p_lastname,
                        personal_number = p_personal_number,
                        position = p_position,
                        user_status = p_userstatus,
                        created_at = TO_CHAR(NOW(), 'YYYY-mm-dd HH24:MI:SS')::timestamp without time zone, 
                        updated_at = TO_CHAR(NOW(), 'YYYY-mm-dd HH24:MI:SS')::timestamp without time zone 
                        
                     WHERE users.id_user = p_usersid
                     RETURNING *
                   )
               SELECT CAST(COUNT(TRW.id_user) as INTEGER), CAST(TRW.id_user as INTEGER), CAST(r_errCode as character varying), CAST(r_errText as character varying)
               FROM TRW
               GROUP BY TRW.id_user, r_errCode, r_errText;
           END IF;

    
       
       EXCEPTION
           WHEN others THEN
            RAISE EXCEPTION 'Ошибка выполнения: % %', SQLSTATE, SQLERRM;
       END;
       END IF;
  EXCEPTION
      WHEN others THEN
            RAISE EXCEPTION 'Ошибка выполнения: % %', SQLSTATE, SQLERRM;
  END;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION users_set(character varying, character varying, integer, integer, character varying, character varying, character varying, character varying, character varying, character varying, character varying)--;
  OWNER TO gf;
--COMMENT ON FUNCTION users_set(character varying, character varying, integer, character varying, character varying, character varying, character varying, character varying, character varying, character varying) IS 'Добавляет новую запись в таблицу users';
...
Рейтинг: 0 / 0
16.07.2020, 22:04
    #39980668
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
insert
neteurt,

может стоит разбить операцию return ... insert на две insert с сохранением результата в переменные, а затем return ... select


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
declare
  TRW record;
begin
  for trw in (                   WITH TRW AS (
                     INSERT INTO users(
          id_department_fk,
          first_name,
          second_name,
          last_name,
          personal_number,
          position,
          user_status,
          created_at,
          updated_at)

                     VALUES (
                             p_departmentid,
                             p_firstname,
                             p_secondname,
                             p_lastname,
                             p_personal_number,
                             p_position,
                             p_userstatus,
                             TO_CHAR(NOW(), 'YYYY-mm-dd HH24:MI:SS')::timestamp without time zone,
                             TO_CHAR(NOW(), 'YYYY-mm-dd HH24:MI:SS')::timestamp without time zone)

                     RETURNING *
                   ) SELECT *FROM TRW)
    loop
      --Здесь работаем с TRW.id_user 
    
      --проталкиваем код дальше
      RETURN QUERY 
      SELECT 1 /*CAST(COUNT(TRW.id_user) as INTEGER)? всегда 1?*/, CAST(TRW.id_user as INTEGER), CAST(r_errCode as character varying), CAST(r_errText as character varying)
      --FROM TRW
      --GROUP BY TRW.id_user, r_errCode, r_errText
;      
    end loop;
end;
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / insert / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]