#snowflake-cloud-data-platform
Вопрос:
У меня есть таблица, которая имеет 3 атрибута
ФЛАГ ТИПА ДАННЫХ АТРИБУТА( 0 ИЛИ 1)
Моя хранимая процедура принимает строку записей в виде «Att1 Тип данных 1 1, Att2 Тип данных 2 0, Att3 Тип данных 3 0…), поэтому, например, передаваемая строка может быть «VARCHAR БАЗЫ ДАННЫХ 1, VARCHAR СХЕМЫ 1, ОТМЕТКА ВРЕМЕНИ ОТМЕТКА ВРЕМЕНИ 0»
Мой код получает имена столбцов таблицы и сохраняет их в строке , мой код принимает переданную строку и помещает их в элементы массива, разделенные, однако возникает проблема, когда я пытаюсь выполнить вставку в свою таблицу, я продолжаю получать сообщение об ошибке «недопустимый идентификатор».
CREATE OR REPLACE PROCEDURE "ADMINDB"."TOOLKIT".ADD_ATTRIBUTES_SESSION_META ("P_ATTRIBUTE_DATATYPE_FLAG" VARCHAR(16777216))
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
COMMENT='Add Attributes to the table SESSION_ATTRIBUTES_META'
EXECUTE AS CALLER
AS
$
var v_list = P_ATTRIBUTE_DATATYPE_FLAG;
var arr_list = [];
arr_list = P_ATTRIBUTE_DATATYPE_FLAG.split(',');
var v_string;
var arr_col_att = [];
var v_sqlCode = `SELECT * FROM ` "ADMINDB" "." "TOOLKIT" "." "SESSION_ATTRIBUTES_META";
try{
var sqlStmt = snowflake.createStatement({sqlText : v_sqlCode});
var sqlRS = sqlStmt.execute();
}catch(err){
errMessage = "Failed: Code: " err.code "n State: " err.state;
errMessage = "n Message: " err.message v_sqlCode;
errMessage = "nStack Trace:n" err.stackTraceTxt v_sqlCode;
throw 'Encountered error in executing v_sqlCode. n' errMessage;
}
for (i = 1; i <= sqlStmt.getColumnCount(); i ) {
arr_col_att.push(sqlStmt.getColumnName(i));
}
arr_col_att[0] = arr_col_att[0].replace(/s/g, ',');
var v_col_att = arr_col_att.toString();
v_string = arr_list[0].toString();
v_string = v_string.replace(/s/g, ',');
v_sqlCode = `INSERT INTO ` "ADMINDB" "." "TOOLKIT" "."
"SESSION_ATTRIBUTES_META" `(` v_col_att `) VALUES( ` v_string `)`;
try{
var sqlStmt = snowflake.createStatement({sqlText : v_sqlCode});
var sqlRS = sqlStmt.execute();
}catch(err){
errMessage = "Failed: Code: " err.code "n State: " err.state;
errMessage = "n Message: " err.message v_sqlCode;
errMessage = "nStack Trace:n" err.stackTraceTxt v_sqlCode;
throw 'Encountered error in executing v_sqlCode. n' errMessage;
}
return "SUCCESS!";
$;
CALL "ADMINDB"."TOOLKIT".ADD_ATTRIBUTES_SESSION_META('DATABASE VARCHAR 1,SCHEMA VARCHAR 1,TIMESTAMP TIMESTAMP 0');
Комментарии:
1. Проверьте вкладку «История запросов» в веб-интерфейсе Snowflake, чтобы узнать, как ваша инструкция insert отправляется из SP. Это поможет выяснить, что с ним не так.
2. Вам нужны символы кавычек при построении вашего SQL-оператора. Вы должны разделить переменную v_string и добавить одинарные кавычки вокруг первых двух элементов.
Ответ №1:
Изменение строк 33 и 36 устраняет проблему:
CREATE OR REPLACE PROCEDURE "ADMINDB"."TOOLKIT".ADD_ATTRIBUTES_SESSION_META ("P_ATTRIBUTE_DATATYPE_FLAG" VARCHAR(16777216))
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
COMMENT='Add Attributes to the table SESSION_ATTRIBUTES_META'
EXECUTE AS CALLER
AS
$
var v_list = P_ATTRIBUTE_DATATYPE_FLAG;
var arr_list = [];
arr_list = P_ATTRIBUTE_DATATYPE_FLAG.split(',');
var v_string;
var arr_col_att = [];
var v_sqlCode = `SELECT * FROM ` "ADMINDB" "." "TOOLKIT" "." "SESSION_ATTRIBUTES_META";
try{
var sqlStmt = snowflake.createStatement({sqlText : v_sqlCode});
var sqlRS = sqlStmt.execute();
}catch(err){
errMessage = "Failed: Code: " err.code "n State: " err.state;
errMessage = "n Message: " err.message v_sqlCode;
errMessage = "nStack Trace:n" err.stackTraceTxt v_sqlCode;
throw 'Encountered error in executing v_sqlCode. n' errMessage;
}
for (i = 1; i <= sqlStmt.getColumnCount(); i ) {
arr_col_att.push(sqlStmt.getColumnName(i));
}
arr_col_att[0] = arr_col_att[0].replace(/s/g, ',');
var v_col_att = arr_col_att.toString();
v_string = arr_list[0].toString();
v_string = v_string.replace(/s/g, "','" );
v_sqlCode = `INSERT INTO ` "ADMINDB" "." "TOOLKIT" "."
"SESSION_ATTRIBUTES_META" `(` v_col_att `) VALUES( '` v_string `' )`;
try{
var sqlStmt = snowflake.createStatement({sqlText : v_sqlCode});
var sqlRS = sqlStmt.execute();
}catch(err){
errMessage = "Failed: Code: " err.code "n State: " err.state;
errMessage = "n Message: " err.message v_sqlCode;
errMessage = "nStack Trace:n" err.stackTraceTxt v_sqlCode;
throw 'Encountered error in executing v_sqlCode. n' errMessage;
}
return "SUCCESS!";
$;
CALL "ADMINDB"."TOOLKIT".ADD_ATTRIBUTES_SESSION_META('DATABASE VARCHAR 1,SCHEMA VARCHAR 1,TIMESTAMP TIMESTAMP 0');
Насколько я вижу, на данный момент вы не реализовали несколько записей процесса в аргументе, но я думаю, что вы справитесь с этим.
Комментарии:
1. Благослови вас Бог, я слишком долго занимался этой синтаксической ошибкой. Я определенно могу сделать несколько записей