powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция в цикле возвращает не верное количество записей
7 сообщений из 7, страница 1 из 1
Функция в цикле возвращает не верное количество записей
    #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
Функция в цикле возвращает не верное количество записей
    #40077711
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AND CLIENT_ID = client_id;

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

Да, действительно забыл про это и не увидел) Спасибо, помогло)
...
Рейтинг: 0 / 0
Функция в цикле возвращает не верное количество записей
    #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
Функция в цикле возвращает не верное количество записей
    #40077716
Stax,

Да, спасибо) Уже поправил) именно в этом параметре была проблема. Нужно себя приучить) Моя первая процедура и к такому нужно привыкать)
...
Рейтинг: 0 / 0
Функция в цикле возвращает не верное количество записей
    #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
Функция в цикле возвращает не верное количество записей
    #40077876
andreymx,

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


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