Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / [хочу странного] plperl spi_prepare( ,ARRAY['unknown'] / 9 сообщений из 9, страница 1 из 1
05.11.2015, 12:15
    #39095125
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[хочу странного] plperl spi_prepare( ,ARRAY['unknown']
в sql я могу не указывать типы в prepare /execute

sql
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DROP TABLE IF EXISTS test;
CREATE TABLE IF NOT EXISTS test 
(fint integer
,ftxt text
,fvrchr varchar(20)
);

DEALLOCATE ALL;
PREPARE FOO (unknown ,unknown ,unknown )AS
INSERT INTO test(fint, ftxt, fvrchr)
			VALUES ($1, $2, $3);
EXECUTE FOO('1','adaad','adaad');
SELECT * FROM test;



а в случае plperl [и,как говорят -- plpython] -- обязан
иначе
авторERROR: failed to find conversion function from unknown to integer at line

plperl + sql
Код: sql
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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
DROP TABLE IF EXISTS test;
CREATE TABLE IF NOT EXISTS test 
(fint integer
,ftxt text
,fvrchr varchar(20)
);

CREATE OR REPLACE FUNCTION test1(a_val text[]) RETURNS VOID AS 
$$
	use strict;
	#my @av = @$_[0]; так нельзя
	my @av = @{$_[0]};
	elog(NOTICE ,"@av");
	my $av = $_[0];
	#my @av =@$av; так тоже
	my @av =@{$av};
	elog(NOTICE ,$av);
	my $plan = spi_prepare(
			'INSERT INTO test(fint, ftxt, fvrchr)
			VALUES ($1, $2, $3);'
			,'integer'
			,'text'
			,'varchar');
	spi_exec_prepared(
			$plan,@av[0],@av[1],@av[2]
			);
	spi_freeplan( $plan);
$$
LANGUAGE plperlu;

SELECT test1(ARRAY['1','адын','адын']);
SELECT * FROM test; 
/*
CREATE OR REPLACE FUNCTION test2(a_val text[]) RETURNS VOID AS 
$$
	use strict;
	#my @av = @$_[0]; так нельзя
	my @av = @{$_[0]};
	elog(NOTICE ,"@av");
	my $av = $_[0];
	#my @av =@$av; так тоже
	my @av =@{$av};
	elog(NOTICE ,$av);
	my $plan = spi_prepare(
			'INSERT INTO test(fint, ftxt, fvrchr)
			VALUES ($1, $2, $3);'
			,'unknown'
			,'unknown'
			,'unknown');
	spi_exec_prepared(
			$plan,@av[0],@av[1],@av[2]
			);
	spi_freeplan( $plan);
$$
LANGUAGE plperlu;

SELECT test2(ARRAY['1','адын','адын']);
-- ERROR:  failed to find conversion function from unknown to integer at line 12.
-- WTF
*/

CREATE OR REPLACE FUNCTION test3(a_val text[]) RETURNS VOID AS 
$$
	use strict;
	my @av = @{$_[0]};
	elog(NOTICE ,"@av");
	#my @ptypes = ['integer','text','varchar'];
	#elog(NOTICE ,"@ptypes");
	#NOTICE:  ARRAY(0x25efaa8)
	my $ptypes = ['integer','text','varchar'];
	my @ptypes = @$ptypes;
	elog(NOTICE ,"@ptypes");
	my @ptypes;
	#push @ptypes ,('unknown','unknown','unknown');	
	push @ptypes ,('integer','text','varchar');
	elog(NOTICE ,"@ptypes");
	my $plan = spi_prepare(
			'INSERT INTO test(fint, ftxt, fvrchr)
			VALUES ($1, $2, $3);'
			,@ptypes
			);
	spi_exec_prepared(
			$plan,@av
			);
	spi_freeplan( $plan);
$$
LANGUAGE plperlu;
SELECT test3(ARRAY['1','адын','адын']);
--ERROR:  failed to find conversion function from unknown to integer at line 15.
SELECT * FROM test;



-- вот зачем оно так ?

кудыть бедному крестьянину податься ?
-- оно же все равно тестит типы полей при синтаксическом разборе, -- зачем мне самому читать системные?

есть тут опытные перловары ?
...
Рейтинг: 0 / 0
13.11.2015, 12:40
    #39102823
al.netrusov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[хочу странного] plperl spi_prepare( ,ARRAY['unknown']
Так ведь всё логично.
В первом случае Вы неправильно использовали символ для переменных (только в Perl6 появились неизменяемые сигилы), и модуль (возможно!) не может его правильно интерпретировать.

Код: php
1.
2.
$ perl -Mstrict -Mwarnings -e 'my @av = qw(1 2 3); print @av[1], $/;'
Scalar value @av[1] better written as $av[1] at -e line 1.



Код: php
1.
2.
3.
@av[0], @av[1], @av[2] # неправильно

$av[0], $av[1], $av[2] # надо так



Во втором случае массив может попросту автоматически не раскладываться на элементы. Возможно, это опять косяк модуля для PG.
Еще в примерах увидел, что типы переменных в "spi_prepare" указываются в верхнем регистре. Может быть это тоже влияет?

Попробуйте такой код

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
use strict;

my @av = @{$_[0]};
elog(NOTICE, "@av");
my $plan = spi_prepare(
    'INSERT INTO test(fint, ftxt, fvrchr)
			VALUES ($1, $2, $3);'
    , 'INTEGER'
    , 'TEXT'
    , 'VARCHAR');
spi_exec_prepared(
    $plan, $av[0], $av[1], $av[2]
);
spi_freeplan($plan);
...
Рейтинг: 0 / 0
13.11.2015, 13:46
    #39102910
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[хочу странного] plperl spi_prepare( ,ARRAY['unknown']
al.netrusov,
не ,речь не про то, как я знакомлюсь с перлом методом тыка (оно осталось там в комментах, но не в кач-ве вопроса)

, а про то, что мне хочется создать prepare от unknown-ов -- как в SQL--варианте выше.
но перл, [как и питон] этого не хочет.

а вот почему такая дискриминация перлов с пайтонами -- обидно же.
хотя в plpgsql вообще без ухищрений не отпрепаришься. только с исподвывертом


а от типов -- то я давно написал. (тыком изучив синтакс перла). это неинтересно -- мну пришлось дополнительно лазить по системным -- определять типы. а это не спортивно.

т.е. задача -- есть метадата -- ключ --значение [читай -- имя_поля => литерал значения]. надо отпрепарить стейтменты. Вот в SQL все легко и просто делается через unknown-ы [при синтакс анализе будет определен тип. и потом будут ошибки времени исполнения -- если литералы в типы не влезают]. а в перле -- изволь наковырять из носа типов до, еще до препаринга.
...
Рейтинг: 0 / 0
13.11.2015, 13:57
    #39102921
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[хочу странного] plperl spi_prepare( ,ARRAY['unknown']
al.netrusov,

PS т.е. у меня в приведенном "неправильном коде" все работает. Неработающий вариант закомментирован (подсвеченная строка). и именно к нему вопрос -- "за что дискриминация".
...
Рейтинг: 0 / 0
13.11.2015, 14:15
    #39102946
al.netrusov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[хочу странного] plperl spi_prepare( ,ARRAY['unknown']
Да, видимо я не проникся вопросом.
Подумал, что процедура в принципе не работает, и сразу заметил эти части кода.
Пока читал документацию, где-то увидел, что объявление типов на стадии prepare обязательно.

Действительно, иметь аналог Oracle 'table_name.column_name%type' (в данном случае 'unknown') в PL/Perl было бы плюсом.
...
Рейтинг: 0 / 0
13.11.2015, 14:17
    #39102949
PCContra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[хочу странного] plperl spi_prepare( ,ARRAY['unknown']
qwwq,

мне вот интересно, а какие такие задачи Вам приходится решать вот такими сложными способами?

Ведь явно существуют более простые решения.

Я пару лет назад тоже думал над тем, сколько таблиц сделать под разные типы [...], потом решил вопрос использованием одного поля типа JSON в одной таблице.

Простые решения рулят
...
Рейтинг: 0 / 0
13.11.2015, 14:28
    #39102962
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[хочу странного] plperl spi_prepare( ,ARRAY['unknown']
PCContraqwwq,

мне вот интересно, а какие такие задачи Вам приходится решать вот такими сложными способами?

Ведь явно существуют более простые решения.

Я пару лет назад тоже думал над тем, сколько таблиц сделать под разные типы [...], потом решил вопрос использованием одного поля типа JSON в одной таблице.

Простые решения рулят
ну вот у меня и лежат в простом решении (трульный hstore ,а не факабл json) события. А потом я их превращаю в хитровывернутые препареды (так надо). и вот тут -- в перле случилась небольшая засадка... накладные расходы небольшие.


а json прелесто козлит при попытке обратно отпопулировать его в исходный тип, ежели в исходном типе скажем array затесался. как там говорил лавров : "де - Биллы, тчк" ? -- вот где-то так. да. Биллы, де. мол.
...
Рейтинг: 0 / 0
13.11.2015, 14:33
    #39102968
PCContra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[хочу странного] plperl spi_prepare( ,ARRAY['unknown']
qwwq в перле случилась небольшая засадка... накладные расходы небольшие.

Зарплата сотрудникам? 1с? В какой организации работаем, дружище? Хотя бы регион назовите, есть подозрения, что мы с Вами знакомы)))
...
Рейтинг: 0 / 0
13.11.2015, 14:43
    #39102975
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[хочу странного] plperl spi_prepare( ,ARRAY['unknown']
PCContraqwwq в перле случилась небольшая засадка... накладные расходы небольшие.

Зарплата сотрудникам? 1с? В какой организации работаем, дружище? Хотя бы регион назовите, есть подозрения, что мы с Вами знакомы)))
нет. ещё один препаред к системным - на вычитку массивов типов по массиву имен. плюс хештабличка для резалтов.

при всём при том, что синтакс анализёр сам полезет (по месту препарки ) в системные. более того -- он без зазрения информирует -- не могу мол анноуны именно в интежеры кастнуть. Т.е. где-- то в коде реализации spi_exec_prepared лишний каст затесался. Могли бы откейсить -- если unknown -- не кастить.


а работаем мы в понаехаловке, торжок видим только в виде молока и кефира. довольно таки гм. овённых. но за отсуствием горничной, да.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / [хочу странного] plperl spi_prepare( ,ARRAY['unknown'] / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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