Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Где ошибка в SQL коде? / 9 сообщений из 9, страница 1 из 1
04.05.2020, 04:20
    #39953980
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где ошибка в SQL коде?
Есть PL/SQL код:

Код: 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.
DECLARE
  startdate date:= sysdate;
  enddate date;
  d1 VARCHAR2 (10) := '02.02.2020';
  sql_block VARCHAR2 (2000) := 'alter session set global_names=false;' ||
' select o2.name, o1.name obj, o.name,p.name, d.id_typical_param, d.sum  sum_prom, test.sum sum_test, nvl(d.sum,0)-nvl(test.sum,0) delta_sum,' ||
' nvl(d.val_tm_02,0)-nvl(test.val_tm_02,0) delta_tm_02, nvl(d.val_tm_04,0)-nvl(test.val_tm_04,0) delta_tm_04, nvl(d.val_tm_06,0)-nvl(test.val_tm_06,0) delta_tm_06,' || 
' nvl(d.val_tm_08,0)-nvl(test.val_tm_08,0) delta_tm_08,' ||
' nvl(d.val_tm_10,0)-nvl(test.val_tm_10,0) delta_tm_10, nvl(d.val_tm_12,0)-nvl(test.val_tm_12,0) delta_tm_12, nvl(d.val_tm_14,0)-nvl(test.val_tm_14,0) delta_tm_14,' || 
' nvl(d.val_tm_16,0)-nvl(test.val_tm_16,0) delta_tm_16,' ||
' nvl(d.val_tm_18,0)-nvl(test.val_tm_18,0) delta_tm_18, nvl(d.val_tm_20,0)-nvl(test.val_tm_20,0) delta_tm_20, nvl(d.val_tm_22,0)-nvl(test.val_tm_22,0) delta_tm_22,' || 
' nvl(d.val_tm_24,0)-nvl(test.val_tm_24,0) delta_tm_24, d.*, test.*' ||
' from dns_operative_data d, dns_operative_data@ois_test.yng.rn.ru test, oil_object o, oil_object o1, oil_object o2, dns_parameter p' ||
' where d.date_operative = '':d1''' ||
' and test.date_operative = '':d1''' ||
' and d.id_object = test.id_object' ||
' and d.id_typical_param = test.id_typical_param' ||
' and d.date_operative = test.date_operative' ||
' and d.id_object=o.id' ||
' and o.parent_id=o1.id' ||
' and o1.parent_id=o2.id' ||
' and d.id_parameter = p.id' ||
' and d.id_object<200000000000000' ||
' and (d.id_typical_param < 10100 or d.id_typical_param >10159) and d.id_typical_param not in (50013, 50026, 50027,10204,10205)' ||
' and d.id_typical_param not in (10031,10032,10033,80001,80002,80004)' ||
' and ABS (NVL(d.sum, 0) - NVL(test.sum, 0))>0.00000001 order by 5,2,3';
  
BEGIN
  dbms_output.put_line(d1);
  dbms_output.put_line(sql_block);
  EXECUTE IMMEDIATE sql_block USING d1,d1;
  enddate := sysdate;
END;



при его выполнении, на строке:

Код: plsql
1.
  EXECUTE IMMEDIATE sql_block USING d1,d1;



выскакивает ошибка "ORA-00911: invalid character ORA-06512: at line 31"

Подскажите пожалуйста, где поправить?
...
Рейтинг: 0 / 0
04.05.2020, 04:52
    #39953981
Да ну
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где ошибка в SQL коде?
АртЮганск,

Это не SQL*Plus - несколько команд через запяточие не допускается.

Ошибки в запросе и сам подход комментировать не буду.
...
Рейтинг: 0 / 0
04.05.2020, 07:37
    #39953987
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где ошибка в SQL коде?
АртЮганск
Подскажите пожалуйста, где поправить?
Где-то в районе мозжечка.
1) EI выполняет ровно одну команду, а не скрипт.
2) Нахрена делать запрос, если его результат никому не нужен?
...
Рейтинг: 0 / 0
04.05.2020, 10:42
    #39954019
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где ошибка в SQL коде?
АртЮганск,

sql_block - не блок, надо begin end;
но тогда надо куда-то (into) результат селекта пристроить

выполните отдельно alter session через EXECUTE IMMEDIATE и селект

.....
stax
...
Рейтинг: 0 / 0
04.05.2020, 10:52
    #39954023
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где ошибка в SQL коде?
Stax
выполните отдельно
А с этим что делать?
АртЮганск
Код: plsql
1.
  enddate := sysdate;

...
Рейтинг: 0 / 0
05.05.2020, 06:24
    #39954256
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где ошибка в SQL коде?
Код переработал:

Код: 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.
DECLARE
  startdate date:= sysdate;
  enddate date;
  rez dns_operative_data%ROWTYPE;
  d1 VARCHAR2 (10) := '02.02.2020';
  sql_block1 VARCHAR2 (100) := 'alter session set global_names=false';
  sql_block2 VARCHAR2 (2000) := 'select o2.name, o1.name obj, o.name,p.name, d.id_typical_param, d.sum  sum_prom, test.sum sum_test, nvl(d.sum,0)-nvl(test.sum,0) delta_sum,' ||
' nvl(d.val_tm_02,0)-nvl(test.val_tm_02,0) delta_tm_02, nvl(d.val_tm_04,0)-nvl(test.val_tm_04,0) delta_tm_04, nvl(d.val_tm_06,0)-nvl(test.val_tm_06,0) delta_tm_06,' || 
' nvl(d.val_tm_08,0)-nvl(test.val_tm_08,0) delta_tm_08,' ||
' nvl(d.val_tm_10,0)-nvl(test.val_tm_10,0) delta_tm_10, nvl(d.val_tm_12,0)-nvl(test.val_tm_12,0) delta_tm_12, nvl(d.val_tm_14,0)-nvl(test.val_tm_14,0) delta_tm_14,' || 
' nvl(d.val_tm_16,0)-nvl(test.val_tm_16,0) delta_tm_16,' ||
' nvl(d.val_tm_18,0)-nvl(test.val_tm_18,0) delta_tm_18, nvl(d.val_tm_20,0)-nvl(test.val_tm_20,0) delta_tm_20, nvl(d.val_tm_22,0)-nvl(test.val_tm_22,0) delta_tm_22,' || 
' nvl(d.val_tm_24,0)-nvl(test.val_tm_24,0) delta_tm_24' || utl_tcp.CRLF ||
' from dns_operative_data d, dns_operative_data@ois_test.yng.rn.ru test, oil_object o, oil_object o1, oil_object o2, dns_parameter p' || utl_tcp.CRLF ||
' where d.date_operative = :d1' ||
' and test.date_operative = :d1' ||
' and d.id_object = test.id_object' ||
' and d.id_typical_param = test.id_typical_param' ||
' and d.date_operative = test.date_operative' ||
' and d.id_object=o.id' ||
' and o.parent_id=o1.id' ||
' and o1.parent_id=o2.id' ||
' and d.id_parameter = p.id' ||
' and d.id_object<200000000000000' ||
' and (d.id_typical_param < 10100 or d.id_typical_param >10159) and d.id_typical_param not in (50013, 50026, 50027,10204,10205)' ||
' and d.id_typical_param not in (10031,10032,10033,80001,80002,80004)' ||
' and ABS (NVL(d.sum, 0) - NVL(test.sum, 0))>0.00000001 order by 5,2,3';
  
BEGIN
  dbms_output.put_line(d1);
  dbms_output.put_line(sql_block1);
  dbms_output.put_line(sql_block2);
  
  EXECUTE IMMEDIATE sql_block1;
  EXECUTE IMMEDIATE sql_block2 INTO rez USING d1,d1;
  
  dbms_output.put_line('Обработано строк: ' || SQL%ROWCOUNT);
  dbms_output.put_line(rez);
  enddate := sysdate;
  dbms_output.put_line(enddate - startdate); -- вывести разницу с точностью до сотых секунды
END;
/


Теперь выскакивает другая ошибка, на строке:
Код: plsql
1.
  dbms_output.put_line(rez);



Подскажите как переменную типа запись вывести в консоль?
...
Рейтинг: 0 / 0
05.05.2020, 06:53
    #39954258
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где ошибка в SQL коде?
АртЮганск
Подскажите как переменную типа запись вывести в консоль?
Поэлементно. Тут тебе не сказка чудес.
...
Рейтинг: 0 / 0
05.05.2020, 06:59
    #39954259
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где ошибка в SQL коде?
АртЮганск
Код: plsql
1.
dbms_output.put_line(enddate - startdate); -- вывести разницу с точностью до сотых секунды

И где вы только этот лживый говнокод копи-пастите?
RTFM timestamp.

P.S. Ты полез туда и так, для чего у тебя недостаёт квалификации. Лучшим исходом будет, если ты хотя бы не нанесёшь ущерба.
...
Рейтинг: 0 / 0
05.05.2020, 09:40
    #39954269
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где ошибка в SQL коде?
АртЮганск
Код переработал:

Код: plsql
1.
  EXECUTE IMMEDIATE sql_block2 INTO rez USING d1,d1;




если запрос возвращает не одну запись (да и с одной) так не пойдет
1) отказатся от EXECUTE IMMEDIATE для селекта
2) bulk collect

селект явно не с лабы
Зачем Вам EXECUTE IMMEDIATE sql_block2 INTO rez USING d1,d1;?

ps
rez dns_operative_data%ROWTYPE;
...
dbms_output.put_line(rez.sum);

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


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