Вставка в таблицу снежинки с переданной переменной

#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. Благослови вас Бог, я слишком долго занимался этой синтаксической ошибкой. Я определенно могу сделать несколько записей