Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не могу разобраться в Perl (Perl vs PostgreSQL) / 4 сообщений из 4, страница 1 из 1
29.06.2007, 00:47
    #34627526
Крупский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться в Perl (Perl vs PostgreSQL)
Среда: ОС Windows XP Prof, PostgreSQL 8.2.4, dll-ка от Active Perl 5.8.

Пишу процедуру на строне сервера на plperl Смысл ее прост... Нужно получить список колонок таблицы, имя которой является параметром процедуры. Внутри цикла, формирующего строку дублирую её формирование в другую переменную... Итак

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE FUNCTION get_columns(text)
  RETURNS text AS
$BODY$

$sqlresult = spi_exec_query ("SELECT column_name FROM information_schema.columns WHERE table_name= '".$_[0]."'") ;
$nrows  = $sqlresult->{processed};
$status = $sqlresult->{status};

$cols1_set = '1st column set is: ';
$cols2_set = '2nd column set is: ';

for ($i =  0 ; $i < $nrows; $i++) {
  $name = $sqlresult->{rows}[$i]->{column_name};

  $cols1_set .=  $i.'='.$name.',';

  $cols2_set .=  $i.'='.$name.','; 
}

    return $cols1_set.' '.$cols2_set;       

$BODY$
  LANGUAGE 'plperl' VOLATILE;

Теперь выполним:
Код: plaintext
1.
select get_columns(<имя таблицы>)

В результате имеем примерно следующее:

"1st column set is: 0=idkey,1=idname,... 2nd column set is: 0=idkey,1=idname,..."

Очевидно, что две переменные $cols1_set и $cols2_set Равны... Теперь изменим процедуру... Сформируем $cols2_set используя заранее невыполнимое условие, например, так: if ($name != 'нехорошее слово') {$cols2_set .= $i.'='.$name.','; } , получаем следующую изменённую процедуру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE FUNCTION get_columns(text)
  RETURNS text AS
$BODY$

$sqlresult = spi_exec_query ("SELECT column_name FROM information_schema.columns WHERE table_name= '".$_[0]."'") ;
$nrows  = $sqlresult->{processed};
$status = $sqlresult->{status};

$cols1_set = '1st column set is: ';
$cols2_set = '2nd column set is: ';

for ($i =  0 ; $i < $nrows; $i++) {
  $name = $sqlresult->{rows}[$i]->{column_name};

  $cols1_set .=  $i.'='.$name.',';

  if ($name != 'нехорошее слово') {$cols2_set .= $i.'='.$name.','; }
}

    return $cols1_set.' '.$cols2_set;       

$BODY$
  LANGUAGE 'plperl' VOLATILE;

Выполним SQL запрос обозначенный выше и получаем.......... УПС!!!

"1st column set is: 0=idkey,1=idname,... 2nd column set is: "

Теперь ВОПРОС... ПОЧЕМУ произошла потеря значений переменных $i и $name ??? Просьба разъснить... В документации не нашел ничего, чтобы говорило о каких-либо ограничений на область действия переменных...
С уважением
...
Рейтинг: 0 / 0
29.06.2007, 03:28
    #34627562
mp44
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться в Perl (Perl vs PostgreSQL)
В перле отдельные операторы для сравнения строк и чисел.
== != < > <=> сравнивают числа
eq ne lt gt cmp сравнивают строки
Любая нечисловая строка в числовом контексте превращается в 0. Соответственно все не-числа равны между собой.

Панять эта нэвазможна - эта нада запомнить
...
Рейтинг: 0 / 0
29.06.2007, 03:28
    #34627563
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться в Perl (Perl vs PostgreSQL)
строки в Perl сравниваются оператором 'ne' а не '!='
...
Рейтинг: 0 / 0
30.06.2007, 18:33
    #34630293
Ленивец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу разобраться в Perl (Perl vs PostgreSQL)
Вобщем сначала нужно выучит Perl а потом уж PL/Perl
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не могу разобраться в Perl (Perl vs PostgreSQL) / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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