Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / for in execute ? / 25 сообщений из 25, страница 1 из 1
17.01.2007, 12:20
    #34261248
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
есть простенькая функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
 out text;
 dst_phone alias for $ 1 ;
 sql text;
 int_ab text;
begin
 out:='';
 sql:='select distinct int_abonent from ok where dst_phone=\''||dst_phone||'\'';
 FOR int_ab IN EXECUTE sql LOOP
  out:=out||int_ab||'-';
 END LOOP;
 return out;
end;
при вызове select pos_int_ab('78635467073'); выдается ошибка , что за .. непойму.
SQL error:
ERROR: missing ".." at end of SQL expression
CONTEXT: compile of PL/pgSQL function "pos_int_ab" near line 9
...
Рейтинг: 0 / 0
17.01.2007, 13:31
    #34261592
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
проверьте работает ли у вас \' так как выдумаете :)
...
Рейтинг: 0 / 0
17.01.2007, 15:19
    #34262052
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
даже так не хочет, ошибка та же
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
 out text;
 dst_phone alias for $ 1 ;
 sql text;
 int_ab integer;
begin
 out:='';
 --sql:='select distinct int_abonent from ok where dst_phone=''||dst_phone||'\'';
 FOR int_ab IN select distinct int_abonent from ok where dst_phone='5555555' LOOP
  out:=out||int_ab||'-'; --error
 END LOOP;
 return out;
end;
...
Рейтинг: 0 / 0
17.01.2007, 15:23
    #34262066
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
Какая версия PostgreSQL ?
просто
Код: plaintext
execute $sql$select distinct int_abonent from ok where dst_phone=$q$ 5555555 $q$ $sql$
работает ?
...
Рейтинг: 0 / 0
17.01.2007, 15:44
    #34262126
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
[root@tank scripts]# psql -U igo ats
Welcome to psql 7.4.3, the PostgreSQL interactive terminal.

а Ваша строка чтото мне непонятно, она ругается на сивол $
...
Рейтинг: 0 / 0
17.01.2007, 15:53
    #34262158
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
покажите полный ddl для создания функции
...
Рейтинг: 0 / 0
17.01.2007, 15:59
    #34262180
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE FUNCTION pos_int_ab(character varying) RETURNS text
    AS '
declare
 out text;
 --dst_phone alias for $1;
 sql text;
 int_ab integer;
begin
 out:='''';
 --sql:=''select distinct int_abonent from ok where dst_phone=''''||dst_phone||''\\'''';
 FOR int_ab IN select dst_phone from ok where dst_phone=''5555555'' LOOP
  out:=out||int_ab||''-''; 
 END LOOP;
 return out;
end;
...
Рейтинг: 0 / 0
17.01.2007, 16:01
    #34262184
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
Код: plaintext
1.
'
    LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
17.01.2007, 16:01
    #34262188
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
...
Рейтинг: 0 / 0
17.01.2007, 16:02
    #34262191
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE FUNCTION pos_int_ab(character varying) RETURNS text
    AS '
declare
 out text;
 --dst_phone alias for $1;
 sql text;
 int_ab integer;
begin
 out:='''';
 --sql:=''select distinct int_abonent from ok where dst_phone=''''||dst_phone||''\\'''';
 FOR int_ab IN select dst_phone from ok where dst_phone=''5555555'' LOOP
  out:=out||int_ab||''-''; 
 END LOOP;
 return out;
end;
'
    LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
17.01.2007, 16:13
    #34262223
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
в инете всё что надыбал
http://archives.postgresql.org/pgsql-es-ayuda/2004-05/msg00172.php но на каком там языке
...
Рейтинг: 0 / 0
17.01.2007, 16:20
    #34262248
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
IgoX
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE FUNCTION pos_int_ab(character varying) RETURNS text
    AS '
declare
 out text;
 dst_phone alias for $1;
 sql text;
 int_ab integer;
begin
 out:=\'\';
 sql:=\'select distinct int_abonent from ok where dst_phone=\'\'\'||dst_phone||\'\'\';\';
 FOR int_ab IN select dst_phone from ok where dst_phone=\'5555555\' LOOP
  out:=out||int_ab||\'-\'; 
 END LOOP;
 return out;
end;
'
    LANGUAGE plpgsql;

если не соврал с дублированием \' - для внутренности строки.

ЗЫ: будет, думается, ошибацца, при наличии апосторфов в dst_phone.
...
Рейтинг: 0 / 0
17.01.2007, 16:48
    #34262373
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE FUNCTION pos_int_ab(character varying) RETURNS text
    AS '
declare
 out text;
 dst_phone alias for $1;
 sql text;
 int_ab record;
begin
 out:='''';
 sql:=''select distinct int_abonent from ok where dst_phone='' || quote_literal(dst_phone) ;
 FOR int_ab IN EXECUTE sql LOOP
  out:=out||int_ab.int_abonent||''-''; 
 END LOOP;
 return out;
end;
'
    LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
17.01.2007, 17:16
    #34262481
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
схожу с ума
сделал уже вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare
 out text;
 dst_phone alias for $ 1 ;
 sql text;
 int_ab integer;
begin
 out:='';
 FOR int_ab IN select distinct int_abonent from ok LOOP
  out:=out||int_ab||'-'; 
 END LOOP;
 return out;
end;
...
Рейтинг: 0 / 0
17.01.2007, 17:40
    #34262587
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
A vot pravilnyy variant:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE FUNCTION pos_int_ab(character varying) RETURNS text
    AS '
declare
 out text;
 --dst_phone alias for $1;
 sql text;
 int_ab integer;
begin
 out:='''';
 sql:=''select distinct int_abonent from ok where dst_phone=''''''||dst_phone||'''''''''''';
 FOR int_ab IN select dst_phone from ok where dst_phone=''5555555'' LOOP
  out:=out||int_ab||''-''; 
 END LOOP;
 return out;
end;
'
    LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
17.01.2007, 17:43
    #34262603
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
Tolko ia estestvenno zabyl raskommentit' etu strochku: ... :)
СергейК
Код: plaintext
1.
 --dst_phone alias for $1;
...
Рейтинг: 0 / 0
17.01.2007, 18:03
    #34262685
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
тоже самое, непойму, что ознаают ..(две точки в ошибке)
...
Рейтинг: 0 / 0
17.01.2007, 18:13
    #34262717
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
IgoXтоже самое, непойму, что ознаают ..(две точки в ошибке)

Ia prosto zaputalsia v raznyh versiah vashei pl/pgsql'ki.
vot okonchatelno:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE or replace FUNCTION pos_int_ab(character varying) RETURNS text
    AS '
declare
 out text;
 dst_phone alias for $1;
 sql text;
 int_ab integer;
begin
 out:='''';
 sql:=''select distinct int_abonent from ok where dst_phone=''''''||dst_phone||'''''''';
 FOR int_ab IN EXECUTE sql LOOP
  out:=out||int_ab||''-''; 
 END LOOP;
 return out;
end;
'
    LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
17.01.2007, 18:20
    #34262733
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
СергейК vot okonchatelno:см. от ZemA (с учетом возможности апострофа в параметре)
...
Рейтинг: 0 / 0
17.01.2007, 18:24
    #34262742
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
4321 СергейК vot okonchatelno:см. от ZemA (с учетом возможности апострофа в параметре)
Da, Vy i ZemA pravy, ia kak-to progliadel tot otvet, tak kak avtor thread'a na nego ne proreagiroval.
...
Рейтинг: 0 / 0
17.01.2007, 18:38
    #34262804
Jelis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
Дааа... в 7.х жутковато было кавычки удваивать(*4, *8, ...) - пока разберешся, глаза поломаеш :-(
На 8ку хотя бы тока из-за этого переползать стоит! :-)
...
Рейтинг: 0 / 0
17.01.2007, 21:36
    #34263090
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
как мне кажется ошибка вовсе не в ковычках.я убрал все ковычки и упростил до максимума , но всеравно ошибка та же, может я использую какие нибудь ключевые слова?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
 out text;
 sql text;
 int_ab integer;
begin
 FOR int_ab IN select distinct int_abonent from ok LOOP 
 END LOOP;
 return out;
end;
...
Рейтинг: 0 / 0
17.01.2007, 22:05
    #34263112
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
IgoXкак мне кажется ошибка вовсе не в ковычках.я убрал все ковычки и упростил до максимума , но всеравно ошибка та же, может я использую какие нибудь ключевые слова?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
 out text;
 sql text;
 int_ab integer;
begin
 FOR int_ab IN select distinct int_abonent from ok LOOP 
 END LOOP;
 return out;
end;

ошибка в том что переменная int_ab должна быть типа record.
разве функция которую я привел здесь не работает?
...
Рейтинг: 0 / 0
18.01.2007, 08:59
    #34263470
IgoX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
вы были совершенно правы, я просто увидел только literal и подставил только его а record не заметил. сейчас всё работает, но как то странно почему именно record почему нельзя integer?
...
Рейтинг: 0 / 0
18.01.2007, 11:37
    #34264112
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
for in execute ?
IgoXвы были совершенно правы, я просто увидел только literal и подставил только его а record не заметил. сейчас всё работает, но как то странно почему именно record почему нельзя integer?
почему, почему. потому!
подробнее здесь
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / for in execute ? / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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