KDB - ошибка при переносе рабочего кода в функцию - PullRequest
0 голосов
/ 14 декабря 2018

Я написал следующую функцию, которая извлекает данные из таблицы sql.

get_sql_table:{[usr;psswd;server;db;tbl]
    usr: "'", usr, "'";
    psswd: "'", psswd, "'";
    new_tbl: "'", tbl, "'\"";
    map:(`date`datetime`bigint`char`decimal`double`int`varchar)!("DZJCFFIS");
    schema:exec column_name!native from (update native:map[data_type] from (2#"S";enlist"\t") 0: 
        schema:system "mysql --user=",usr," --password=",psswd," -h ",server, " ", db, " --execute=\"select column_name, data_type from information_schema.columns WHERE table_name = ", new_tbl) 
        where not null native;
    query: system "mysql --user=",usr," --password=",psswd," -h ",server, " ", db, " --execute=\"select * from ", tbl, ";\"";
    data:(count["\t" vs query 0]#"S";enlist"\t") 0: query;
    :![data;();0b;k!{($;schema[x];(string;x))} each k:key[schema] inter cols data];
 };

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

Однако иногда код завершается успешно.Кажется, что таблицы, с которыми он преуспевает и с которыми происходит сбой, являются произвольными и не имеют ничего общего с типами столбцов (на самом деле, это не удалось в таблицах, с которыми он преуспел раньше, и наоборот).

Кроме того, в этом нет ничего плохогосам код.Когда я пишу это вне функции, она работает каждый раз , за исключением того, что таблица имеет тип данных, которого нет в карте (но в этом случае я могу просто добавить его в карту). Этот код завершается ошибкой только тогда, когда он заключен в функцию.

Чего мне не хватает?

1 Ответ

0 голосов
/ 14 декабря 2018

Ваша переменная schema определена внутри функции, а не глобально, поэтому она не доступна изнутри этой лямбды

{($;schema[x];(string;x))}

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

{($;y[x];(string;x))}[;schema] each k:key[schema] inter cols data

Вероятно, он работал вне функции, потому что вы случайно определили глобально schema

...