Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция в цикле возвращает не верное количество записей / 7 сообщений из 7, страница 1 из 1
15.06.2021, 17:02
    #40077706
Функция в цикле возвращает не верное количество записей
Всем привет. Не могу понять почему у меня функция GET_ROW_PARAM возвращет не верное кол-во записей. Функция внутри цикла в INSERT

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 FETCH client_cur BULK COLLECT INTO v_cur LIMIT c_limit_n;
    
    EXIT WHEN v_cur.COUNT = 0;

    FOR i in v_cur.FIRST..v_cur.LAST  --Наполняем временную таблицу
      LOOP
      INSERT INTO SIEBEL.GTT_PERS_PARAM
      (
        PAR_ROW_ID, NEXT_UP_DISC_DC, REM_AMOUNT_DISC, WAVE_NUM, CLIENT_ID,  MAILING_ID, BOOT_NUM
      )
      VALUES
        (GET_ROW_PARAM(campaign_id,v_cur(i).CON_PER_ID,wave_number,load_number),
        GET_DISC_PERC(v_cur(i).CON_PER_ID), --Получаем проценты
        GET_DISC(v_cur(i).CON_PER_ID), --Получаем скидку
        wave_number,
        v_cur(i).CON_PER_ID,
        campaign_id,
        load_number);
       END LOOP;



Сама функция

Код: 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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
FUNCTION GET_ROW_PARAM
(
	campaign_id  IN VARCHAR2,
  client_id    IN VARCHAR2,
  wave_number  IN NUMBER,
  load_number  IN NUMBER
) RETURN VARCHAR2
IS
countClient NUMBER;
Par VARCHAR2(15);
BEGIN

  IF (
       client_id   IS NULL OR
       campaign_id IS NULL OR
       wave_number IS NULL OR
       load_number IS NULL
     )
  THEN
     DBMS_OUTPUT.PUT_LINE('GET_ROW_PARAM: One or more of the required parameters not passed.');
     RETURN Par;
  END IF;

     DBMS_OUTPUT.PUT_LINE(''||client_id||' '||campaign_id||' '||wave_number||' '||load_number);

  SELECT count(*)
  INTO countClient
  FROM SIEBEL.CX_PERS_PARAM
  WHERE WAVE_NUM = wave_number
  AND MAILING_ID = campaign_id
  AND BOOT_NUM = load_number
  AND CLIENT_ID = client_id;

  IF (countClient = 0)
  THEN
    Par := SIEBEL.CX_PERS_PARAM_SEQ.nextval;
    RETURN Par;
  ELSE  
    SELECT cpp.ROW_ID
    INTO Par
    FROM SIEBEL.CX_PERS_PARAM cpp
    WHERE cpp.CLIENT_ID = client_id
    AND cpp.WAVE_NUM = wave_number
    AND cpp.MAILING_ID = campaign_id
    AND cpp.BOOT_NUM = load_number;
    RETURN Par;
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Other error in GET_ROW_PARAM: '||sqlerrm);
    RETURN Par;

END GET_ROW_PARAM;



Запрос возвращает не верное количество записей которое равно двум

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT count(*)
  INTO countClient
  FROM SIEBEL.CX_PERS_PARAM
  WHERE WAVE_NUM = wave_number
  AND MAILING_ID = campaign_id
  AND BOOT_NUM = load_number
  AND CLIENT_ID = client_id;



Если воспроизводить этот запрос вне функции то кол-во верное, которое равно 1. INSERT был в FORALL, я начал грешить на него. Но когда переписал на FOR то результат был тот же. Данные передаваемые в параметрах функции верные.
...
Рейтинг: 0 / 0
15.06.2021, 17:21
    #40077711
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в цикле возвращает не верное количество записей
AND CLIENT_ID = client_id;

Называйте переменные с любым префиксом, например v_client_id, чтобы компилятор в любом месте понимал, имеется в виду переменная или столбец.
...
Рейтинг: 0 / 0
15.06.2021, 17:25
    #40077713
Функция в цикле возвращает не верное количество записей
dmdmdm,

Да, действительно забыл про это и не увидел) Спасибо, помогло)
...
Рейтинг: 0 / 0
15.06.2021, 17:28
    #40077715
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в цикле возвращает не верное количество записей
Вася Кропоткин,

AND CLIENT_ID = client_id ;

и глянуть на другие переменные, нет ли полей таблицы с таким наименованием

Код: 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.
SQL> ed
Wrote file afiedt.buf

  1* select count(*) from dual where dummy='Y'
SQL> /

     COUNT(*)
-------------
        0.000

SQL> ed
Wrote file afiedt.buf

Wrote file afiedt.buf

  1  declare
  2   dummy varchar(1) :='Y';
  3   v_cc int;
  4  begin
  5    select count(*) into v_cc from dual where DUMMY=dummy;
  6    dbms_output.put_line('cc='||v_cc);
  7* end;
SQL> /
cc=1

PL/SQL procedure successfully completed.

SQL>


.....
stax
...
Рейтинг: 0 / 0
15.06.2021, 17:31
    #40077716
Функция в цикле возвращает не верное количество записей
Stax,

Да, спасибо) Уже поправил) именно в этом параметре была проблема. Нужно себя приучить) Моя первая процедура и к такому нужно привыкать)
...
Рейтинг: 0 / 0
16.06.2021, 09:28
    #40077838
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция в цикле возвращает не верное количество записей
Вася Кропоткин
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  IF (
       client_id   IS NULL OR
       campaign_id IS NULL OR
       wave_number IS NULL OR
       load_number IS NULL
     )
  THEN
     DBMS_OUTPUT.PUT_LINE('GET_ROW_PARAM: One or more of the required parameters not passed.');
     RETURN Par;
  END IF;

у вас есть информация, чего не хватает для работы функции
но вы ее тщательно скрываете от себя же - когда будете искать, что конкретно не передалось
наверное, чтобы было чем заняться в будущем
...
Рейтинг: 0 / 0
16.06.2021, 12:15
    #40077876
Функция в цикле возвращает не верное количество записей
andreymx,

Процедура будет вызывать в другой системе где все процессы логируются. Так что в логах будет не трудно найти что и почему)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция в цикле возвращает не верное количество записей / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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