powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Где ошибка в SQL коде?
9 сообщений из 9, страница 1 из 1
Где ошибка в SQL коде?
    #39953980
АртЮганск
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 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
Где ошибка в SQL коде?
    #39953981
Да ну
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АртЮганск,

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

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

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

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

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

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

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

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

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

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


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