Javascript 在Snowflake中将JSON对象传递给存储过程

Javascript 在Snowflake中将JSON对象传递给存储过程,javascript,snowflake-cloud-data-platform,Javascript,Snowflake Cloud Data Platform,我想调用Snowflake过程并传入一个JSON对象,但我得到了一个绑定错误 /* Function to insert one record into the database. @param tableName : string = Name of table to insert into @param record: object with the columns and their respective values. Expected format: var record = {'

我想调用Snowflake过程并传入一个JSON对象,但我得到了一个绑定错误

/*
Function to insert one record into the database.

@param tableName : string = Name of table to insert into
@param record: object with the columns and their respective values. Expected format:

var record = {'severity': 'I',message:'TestMess\"\'age'};

In the above, column severity detected type string due to value 'I'
and message 'TestMess"'age', where the surrounding single quotes (')
will not be inserted.  

@return True if the insert success
*/
create or replace procedure sc_hub_insert(tableName varchar,record object)
    RETURNS boolean
    LANGUAGE javascript
    strict 
    execute as owner 
    as 
    $$
    var result = false;

    var columnNames=[];
    var quotedValues=[];
    var SINGLE_QUOTE_CHAR="'";
    var DOUBLE_QUOTE_CHAR="\"";
    var COMMA_CHAR=",";
    var LEFT_PARENTHESIS="(";
    var RIGHT_PARENTHESIS=")";
    var ESCAPED_SINGLE_QUOTE_CHAR="\\'";
    var ESCAPED_DOUBLE_QUOTE_CHAR="\\\"";
    for(var propertyName in record) {
        columnNames.push(propertyName);
        var recordValue=record[propertyName];
        var quotedValue=recordValue;
        if(typeof(recordValue)==='string') {
            var escapeStep1=recordValue.replace(SINGLE_QUOTE_CHAR,ESCAPED_SINGLE_QUOTE_CHAR);
            var escapeStep2=escapeStep1.replace(DOUBLE_QUOTE_CHAR,ESCAPED_DOUBLE_QUOTE_CHAR);
            quotedValue=SINGLE_QUOTE_CHAR+escapeStep2+SINGLE_QUOTE_CHAR;
        }
        quotedValues.push(quotedValue);
    }
    var sql_command = "insert into "+tableName+LEFT_PARENTHESIS+columnNames.join(",")+RIGHT_PARENTHESIS+
    " values "+LEFT_PARENTHESIS+quotedValues.join(",")+RIGHT_PARENTHESIS);

    try {
        snowflake.execute ({sqlText: sql_command});
        result = true;
    } catch(error) {
        result = false;
    }

    return result;
    $$
    ;

/*
Function to log message into SC_HUB_LOG_MESSAGES table

@param tableName : string = Name of table to insert into
@param record: object with the columns and their respective values. Expected format:

var record = {'severity': 'I',message:'TestMess\"\'age'};

In the above, column severity detected type string due to value 'I'
and message 'TestMess"'age', where the surrounding single quotes (')
will not be inserted.  

@return True if the insert success
*/
create or replace procedure sc_hub_log_message(severity varchar,message varchar)
    RETURNS varchar
    LANGUAGE javascript
    strict 
    execute as owner 
    as 
    $$
    var result = 'UNKNOWN';
    var record = {'severity': SEVERITY,message:MESSAGE};
    var SINGLE_QUOTE_CHAR="'";
    var DOUBLE_QUOTE_CHAR="\"";
    var COMMA_CHAR=",";
    var LEFT_PARENTHESIS="(";
    var RIGHT_PARENTHESIS=")";
    var ESCAPED_SINGLE_QUOTE_CHAR="\\'";
    var ESCAPED_DOUBLE_QUOTE_CHAR="\\\"";
    try {
        statement = snowflake.createStatement(
            {
            sqlText: "call SC_HUB_INSERT(?,?);",
            binds:['SC_HUB_LOG_MESSAGES',record]
            }
        );
        statementResult = statement.execute();
        statementResult.next();
        result = 'SUCCESS';
    } catch(error) {
        result = 'FAILURE: '+error;
    }

    return result;
    $$
    ;
当我使用以下语法调用下面的sc_hub_log_消息例程时:

call sc_hub_log_message('I','***TestMessage');
我明白了 1. 失败:绑定参数[object]的类型不受支持 作为结果值

从文档中,我假设JSON对象的DB类型是object,但我不确定。我也不确定是否需要进行任何类型的JSON转换(即,将对象视为字符串,然后将其反序列化为真正的JavaScript JSON对象)


其次,考虑到显然没有像Oracle那样的console.log或服务器输出概念,人们如何处理这个问题?

正如您所说,对象不支持作为绑定变量,您需要进行一些JSON转换。在sc_hub_log_消息中绑定时,可以将JSON对象转换为varchar,然后在sc_hub_insert函数中转换回JSON

我修复了一些语法错误,还包括了从参数读取的额外变量定义,并删除了注释以缩短它们:

create or replace procedure sc_hub_insert(tableName varchar,record varchar)
    RETURNS boolean
    LANGUAGE javascript
    strict 
    execute as owner 
    as 
    $$
    var result = false;

    var columnNames=[];
    var quotedValues=[];
    var SINGLE_QUOTE_CHAR="'";
    var DOUBLE_QUOTE_CHAR="\"";
    var COMMA_CHAR=",";
    var LEFT_PARENTHESIS="(";
    var RIGHT_PARENTHESIS=")";
    var ESCAPED_SINGLE_QUOTE_CHAR="\\'";
    var ESCAPED_DOUBLE_QUOTE_CHAR="\\\"";
    var record = JSON.parse(RECORD)
    var tableName = TABLENAME;
    for(var propertyName in record) {
        columnNames.push(propertyName);
        var recordValue=record[propertyName];
        var quotedValue=recordValue;
        if(typeof(recordValue)==='string') {
            var escapeStep1=recordValue.replace(SINGLE_QUOTE_CHAR,ESCAPED_SINGLE_QUOTE_CHAR);
            var escapeStep2=escapeStep1.replace(DOUBLE_QUOTE_CHAR,ESCAPED_DOUBLE_QUOTE_CHAR);
            quotedValue=SINGLE_QUOTE_CHAR+escapeStep2+SINGLE_QUOTE_CHAR;
        }
        quotedValues.push(quotedValue);
    }
    var sql_command = "insert into "+tableName+LEFT_PARENTHESIS+columnNames.join(",")+RIGHT_PARENTHESIS+
    " values "+LEFT_PARENTHESIS+quotedValues.join(",")+RIGHT_PARENTHESIS;

    try {
        snowflake.execute ({sqlText: sql_command});
        result = true;
    } catch(error) {
        result = false;
    }

    return result;
    $$
    ;



create or replace procedure sc_hub_log_message(severity varchar,message varchar)
    RETURNS varchar
    LANGUAGE javascript
    strict 
    execute as owner 
    as 
    $$
    var result = 'UNKNOWN';
    var record = {'severity': SEVERITY,message:MESSAGE};
    var SINGLE_QUOTE_CHAR="'";
    var DOUBLE_QUOTE_CHAR="\"";
    var COMMA_CHAR=",";
    var LEFT_PARENTHESIS="(";
    var RIGHT_PARENTHESIS=")";
    var ESCAPED_SINGLE_QUOTE_CHAR="\\'";
    var ESCAPED_DOUBLE_QUOTE_CHAR="\\\"";
    try {
        statement = snowflake.createStatement(
            {
            sqlText: "call SC_HUB_INSERT(?,?);",
            binds:['SC_HUB_LOG_MESSAGES',JSON.stringify(record) ]
            }
        );
        statementResult = statement.execute();
        statementResult.next();
        result = 'SUCCESS';
    } catch(error) {
        result = 'FAILURE: '+error;
    }

    return result;
    $$
    ;
你是对的,可能会有更好的“日志”功能,也许你可以将此想法发布到Snowflake ideas:


正如您所说,对象不支持作为绑定变量,您需要进行一些JSON转换。在sc_hub_log_消息中绑定时,可以将JSON对象转换为varchar,然后在sc_hub_insert函数中转换回JSON

我修复了一些语法错误,还包括了从参数读取的额外变量定义,并删除了注释以缩短它们:

create or replace procedure sc_hub_insert(tableName varchar,record varchar)
    RETURNS boolean
    LANGUAGE javascript
    strict 
    execute as owner 
    as 
    $$
    var result = false;

    var columnNames=[];
    var quotedValues=[];
    var SINGLE_QUOTE_CHAR="'";
    var DOUBLE_QUOTE_CHAR="\"";
    var COMMA_CHAR=",";
    var LEFT_PARENTHESIS="(";
    var RIGHT_PARENTHESIS=")";
    var ESCAPED_SINGLE_QUOTE_CHAR="\\'";
    var ESCAPED_DOUBLE_QUOTE_CHAR="\\\"";
    var record = JSON.parse(RECORD)
    var tableName = TABLENAME;
    for(var propertyName in record) {
        columnNames.push(propertyName);
        var recordValue=record[propertyName];
        var quotedValue=recordValue;
        if(typeof(recordValue)==='string') {
            var escapeStep1=recordValue.replace(SINGLE_QUOTE_CHAR,ESCAPED_SINGLE_QUOTE_CHAR);
            var escapeStep2=escapeStep1.replace(DOUBLE_QUOTE_CHAR,ESCAPED_DOUBLE_QUOTE_CHAR);
            quotedValue=SINGLE_QUOTE_CHAR+escapeStep2+SINGLE_QUOTE_CHAR;
        }
        quotedValues.push(quotedValue);
    }
    var sql_command = "insert into "+tableName+LEFT_PARENTHESIS+columnNames.join(",")+RIGHT_PARENTHESIS+
    " values "+LEFT_PARENTHESIS+quotedValues.join(",")+RIGHT_PARENTHESIS;

    try {
        snowflake.execute ({sqlText: sql_command});
        result = true;
    } catch(error) {
        result = false;
    }

    return result;
    $$
    ;



create or replace procedure sc_hub_log_message(severity varchar,message varchar)
    RETURNS varchar
    LANGUAGE javascript
    strict 
    execute as owner 
    as 
    $$
    var result = 'UNKNOWN';
    var record = {'severity': SEVERITY,message:MESSAGE};
    var SINGLE_QUOTE_CHAR="'";
    var DOUBLE_QUOTE_CHAR="\"";
    var COMMA_CHAR=",";
    var LEFT_PARENTHESIS="(";
    var RIGHT_PARENTHESIS=")";
    var ESCAPED_SINGLE_QUOTE_CHAR="\\'";
    var ESCAPED_DOUBLE_QUOTE_CHAR="\\\"";
    try {
        statement = snowflake.createStatement(
            {
            sqlText: "call SC_HUB_INSERT(?,?);",
            binds:['SC_HUB_LOG_MESSAGES',JSON.stringify(record) ]
            }
        );
        statementResult = statement.execute();
        statementResult.next();
        result = 'SUCCESS';
    } catch(error) {
        result = 'FAILURE: '+error;
    }

    return result;
    $$
    ;
你是对的,可能会有更好的“日志”功能,也许你可以将此想法发布到Snowflake ideas:


若要获取详细错误信息,请将其用于在catch块中记录错误日志

               catch(err)
   {
       var result_set= "";
        result_set =  "Failed: Code: " + err.code + " State: " + err.state + " Message: " + err.message +" Stack Trace:" + err.stackTraceTxt;
--返回结果_集;--或者登录到表中
}

若要获取详细错误信息,请将其用于在catch块中记录错误日志

               catch(err)
   {
       var result_set= "";
        result_set =  "Failed: Code: " + err.code + " State: " + err.state + " Message: " + err.message +" Stack Trace:" + err.stackTraceTxt;
--返回结果_集;--或者登录到表中
}

有没有办法更快地查看Javascript错误?如果我使用标准编辑器,比如微软代码,它可能不会识别雪花库。它还会抱怨周围的雪花。即使编译存储过程也不能捕获所有错误。据我所知,在运行存储过程之前,您无法判断任何语法错误。你能提出更可靠的建议吗?Thx,Woodsman.有没有办法更快地看到Javascript错误?如果我使用标准编辑器,比如微软代码,它可能不会识别雪花库。它还会抱怨周围的雪花。即使编译存储过程也不能捕获所有错误。据我所知,在运行存储过程之前,您无法判断任何语法错误。你能提出更可靠的建议吗?谢谢,樵夫。