Javascript 在Snowflake中将JSON对象传递给存储过程
我想调用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 = {'
/*
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错误?如果我使用标准编辑器,比如微软代码,它可能不会识别雪花库。它还会抱怨周围的雪花。即使编译存储过程也不能捕获所有错误。据我所知,在运行存储过程之前,您无法判断任何语法错误。你能提出更可靠的建议吗?谢谢,樵夫。