Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / переменная в sql запросе oracle / 22 сообщений из 22, страница 1 из 1
19.06.2019, 15:52
    #39828432
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Всем привет. подскажите как использовать переменную в select
Так работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION count_row (start_date IN date)
RETURN  number as 
   n NUMBER;
   st date;
   s varchar2(256);
   begin
  st:=trunc(start_date);
  sq:=st;
  s:= 'select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR=''Y''and pc.full_date=''02.01.2019'''; 
    execute immediate s INTO n;
  RETURN n;
end; 
/
with sss AS(select to_date('25.01.2019 18:30:52', 'DD.MM.YYYY HH24:MI:SS') as start_date, 
       to_date('30.01.2019 18:30:52', 'DD.MM.YYYY HH24:MI:SS') as end_date from dual)
SELECT T1.*, count_row(START_DATE)
FROM SSS T1;



А так не работает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION count_row (start_date IN date)
RETURN  number as 
   n NUMBER;
   st date;
   s varchar2(256);
   begin
  st:=trunc(start_date);
  sq:=st;
  s:= 'select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR=''Y''and pc.full_date='||st;
    execute immediate s INTO n;
  RETURN n;
end; 
/
with sss AS(select to_date('25.01.2019 18:30:52', 'DD.MM.YYYY HH24:MI:SS') as start_date, 
       to_date('30.01.2019 18:30:52', 'DD.MM.YYYY HH24:MI:SS') as end_date from dual)
SELECT T1.*, count_row(START_DATE)
FROM SSS T1;
...
Рейтинг: 0 / 0
19.06.2019, 15:57
    #39828435
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
antonkashinкак использовать переменную в select

Попробуй так, как написано в главе "Using the EXECUTE IMMEDIATE Statement in PL/SQL" из
"PL/SQL User's Guide and Reference".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2019, 15:57
    #39828436
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
antonkashin,

Код: plsql
1.
dbms_output.put_line(s); 
...
Рейтинг: 0 / 0
19.06.2019, 16:09
    #39828447
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
antonkashinТак работаетВ поведении приведенных вариантов кода разницы нет.
...
Рейтинг: 0 / 0
19.06.2019, 16:10
    #39828448
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
antonkashin,

зачем Вам execute immediate? или ето просто пример?

ps
1) использовать бинд переменную (using st)
2) добавіть кавычки (возможно и to_date)

.....
stax
...
Рейтинг: 0 / 0
19.06.2019, 16:12
    #39828449
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Первое тоже не работает. Оно даже хуже посколько a) может не работать б) может работать правильно в) может работать неправильно. Почему? pc.full_date=''02.01.2019''' (я предположу тип full_date DATE) приводит к неявному преобразованию строки '02.01.2019' в дату используя NLS_DATE_FORMAT конкретной сессии. И если NLS_DATE_FORMAT='dd.mm.yyyy' то '02.01.2019' преобразуется во второе Января 2019 a если NLS_DATE_FORMAT='mm.dd.yyyy' то в первое Февраля 2019 a если NLS_DATE_FORMAT='dd-mon-rr' то вылетит с ошибкой.
Второе - используй bind переменные:

Код: plsql
1.
s:= 'select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR=''Y''and pc.full_date=:st' using st;



SY.
...
Рейтинг: 0 / 0
19.06.2019, 16:16
    #39828450
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
SYПервое тоже не работает.

странно что иногда работает
sq:=st;

sq ж не описано

....
stax
...
Рейтинг: 0 / 0
19.06.2019, 16:30
    #39828468
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
antonkashinВсем привет. подскажите как использовать переменную в select
А так не работает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION count_row (start_date IN date)
RETURN  number as 
   n NUMBER;
   st date;
   s varchar2(256);
   begin
  st:=trunc(start_date);
  sq:=st;
  s:= 'select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR=''Y''and pc.full_date='||st;
    execute immediate s INTO n;
  RETURN n;
end; 



sq вызывает вопросы: зачем оно тут - ну если только переменная пакета...

строгий контроль преобразований наше всё:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE FUNCTION count_row (start_date IN date)
RETURN  number as 
   n NUMBER;
   st date;
   s varchar2(256);
   begin
  st:=trunc(start_date);
  sq:=st;
  s:= q'[select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y' and pc.full_date=to_date(']'
||to_char(st,'dd.mm.yyyy')||q'[','dd.mm.yyyy')]';
    execute immediate s INTO n;
  RETURN n;
end; 
...
Рейтинг: 0 / 0
19.06.2019, 16:37
    #39828476
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Fogelну если только переменная пакета...

какого пакета
CREATE OR REPLACE FUNCTION

ps
проще date 'yyyy-mm-dd'
.....
stax
...
Рейтинг: 0 / 0
19.06.2019, 16:37
    #39828477
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Fogelстрогий контроль преобразований наше всё:
Код: plsql
1.
2.
3.
  s:= q'[select count(*)cc from PROIZVOD_CALENDAR pc where... pc.full_date=to_date(']'
||to_char(st,'dd.mm.yyyy')||q'[','dd.mm.yyyy')]';
    execute immediate s INTO n;


Ахренеть.
Дайте две.

2ТС: Fogel просто издевается, не надо так делать.
...
Рейтинг: 0 / 0
19.06.2019, 16:42
    #39828480
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
andrey_anonymousFogel просто издевается

Хотелось бы надеятся...

SY.
...
Рейтинг: 0 / 0
19.06.2019, 16:43
    #39828481
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
StaxFogelну если только переменная пакета...

какого пакета
CREATE OR REPLACE FUNCTION

.....
stax
выдернули кусок кода из пакета и добавили
CREATE OR REPLACE
иначе наличие sq я объяснить не могу
...
Рейтинг: 0 / 0
19.06.2019, 16:48
    #39828486
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Спасибо всем большое
...
Рейтинг: 0 / 0
19.06.2019, 16:49
    #39828487
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
вот так конечно правильно )
Код: plsql
1.
||to_char(st,'DD.MM.YYYY HH24:MI:SS')||q'[','DD.MM.YYYY HH24:MI:SS')]'
...
Рейтинг: 0 / 0
19.06.2019, 16:50
    #39828489
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
SYandrey_anonymousFogel просто издевается

Хотелось бы надеятся...

SY.
Хотелось бы надеятЬся...
)))
...
Рейтинг: 0 / 0
19.06.2019, 16:54
    #39828492
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Fogelвот так конечно правильно )
задумчиво: ...или в самом деле думает, что так правильно...
...
Рейтинг: 0 / 0
19.06.2019, 16:56
    #39828494
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Fogelвот так конечно правильно )


Надежд ты явно не оправдал.

SY.
...
Рейтинг: 0 / 0
19.06.2019, 18:18
    #39828533
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Код: 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.
55.
56.
57.
58.
59.
60.
CREATE OR REPLACE FUNCTION net_time(start_date IN DATE, end_date IN DATE)
   RETURN NUMBER IS
busdays NUMBER := 0;
stDate DATE;
enDate DATE; 
st date;
et date;
sn number;
en number;
fn number;
pks varchar2(256);
pke varchar2(256);
pkf varchar2(256);
pks1 number;
pke1 number;
pkf1 number;
BEGIN 

stDate := start_date;
enDate := end_date;
st:=trunc(start_date);
et:=trunc(end_date);
pks:=q'[select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y' and pc.full_date=to_date(']'
||to_char(st,'dd.mm.yyyy')||q'[','dd.mm.yyyy')]';
execute immediate pks INTO pks1;
pke:=q'[select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y' and pc.full_date=to_date(']'
||to_char(et,'dd.mm.yyyy')||q'[','dd.mm.yyyy')]';
execute immediate pke INTO pke1;
pkf:=q'[select count(*)cc from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y' and pc.full_date between to_date(']'
||to_char(st+1,'dd.mm.yyyy')||q'[','dd.mm.yyyy')]'||q'[and to_date(']'||to_char(et-1,'dd.mm.yyyy')||q'[','dd.mm.yyyy')]';
execute immediate pkf INTO pkf1;
if stDate<trunc(stDate)+7/24 and pks='0'
then sn:=14/24;
elsif 
  stDate>trunc(stDate)+21/24 or pks<>'0'
then sn:=0;
else
   sn := (trunc(stDate)+21/24)-stDate;
END IF;

if enDate<trunc(enDate)+7/24 or pke<>'0'
then en:=0;
elsif 
  enDate>trunc(enDate)+21/24 or pke='0'
then en:=14/24;
else
   en := enDate-(trunc(enDate)+7/24);
END IF;

fn:=(trunc(enDate)-trunc(stDate)-1-pkf1)*(14/24);
busdays:=decode(trunc(stDate),trunc(enDate),greatest((least(enDate,trunc(enDate)+21/24)-greatest(stDate,trunc(stDate)+7/24)),0),sn+en+fn);

   RETURN(fn);
END;

/
select net_time(start_date, end_date) as dddd
from (
select to_date('25.01.2019 10:10:00', 'DD.MM.YYYY HH24:MI:SS') as start_date, 
       to_date('30.01.2019 18:30:52', 'DD.MM.YYYY HH24:MI:SS') as end_date from dual);



подскажите где ошибка
...
Рейтинг: 0 / 0
19.06.2019, 18:38
    #39828539
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
antonkashinподскажите где ошибкаВ генах. Динамика здесь не нужна.
...
Рейтинг: 0 / 0
20.06.2019, 05:09
    #39828618
alex-ls
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Код: plsql
1.
select count(*) into pkf1 from PROIZVOD_CALENDAR pc where pc.HOLIDAY_INDICATOR='Y' and pc.full_date between st+1 and et-1


Вам бы книги какие почитать базовые...
...
Рейтинг: 0 / 0
20.06.2019, 08:35
    #39828645
antonkashin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
alex-ls,
спасибо большое
...
Рейтинг: 0 / 0
20.06.2019, 08:58
    #39828652
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переменная в sql запросе oracle
Fogelстрогий контроль преобразований наше всё:
Код: plsql
1.
2.
3.
  s:= q'[select count(*)cc from PROIZVOD_CALENDAR pc where... pc.full_date=to_date(']'
||to_char(st,'dd.mm.yyyy')||q'[','dd.mm.yyyy')]';
    execute immediate s INTO n;

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


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