gpt4 book ai didi

snowflake-cloud-data-platform - 如何将存储过程作为雪花中的参数传递

转载 作者:行者123 更新时间:2023-12-03 08:16:04 24 4
gpt4 key购买 nike

我有一个存储过程,它采用另一个存储过程的名称来调用它并带有参数

但是,当我尝试执行此存储过程时,出现错误

我做错了什么?从下面的代码中,我认为我知道如何调用传递的存储过程,但是我想知道我的语法是否不正确。

CREATE OR REPLACE PROCEDURE "ADMINDB"."TOOLKIT".LOG_PROCEDURES("P_PROCEDURE_NAME" VARCHAR, "P_PROCEDURE_PARAMETERS" VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
COMMENT='Inserts into the table PROCEDURE_LOGGING information about the last runned procedure'
EXECUTE AS CALLER
AS
$$
var v = P_PROCEDURE_PARAMETERS;
var v_sqlCode;
if(P_PROCEDURE_PARAMETERS.length > 0){
v_sqlCode = `CALL ` + P_PROCEDURE_NAME + `(` + P_PROCEDURE_PARAMETERS + `)`;

}else{
return "there was no parameter passed";
}

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!";
$$;

CREATE OR REPLACE PROCEDURE "ADMINDB"."TOOLKIT".TESTFORLOG("P" VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
COMMENT='Inserts into the table PROCEDURE_LOGGING information about the last runned procedure'
EXECUTE AS CALLER
AS
$$
var v_sqlCode = 'CREATE TABLE ' + P + `(name varchar)`;
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.LOG_PROCEDURES('TESTFORLOG','P');

最佳答案

综合上述所有评论,这里是更新的存储过程,当我在我的开发帐户上进行测试时,这些存储过程正在运行。

注释:

  • 如果进行跨架构/数据库对象引用,请注意上下文并尽可能使用完全限定名称

  • 调试时查看查询历史记录

  • 反引号对于 SQL 来说非常棒,下面我有一个带反引号的示例和一个不带反引号的示例

  • 我喜欢将 SQL 放在一个 block 中(带反引号),然后进行替换,如图所示。

    CREATE OR REPLACE PROCEDURE sp_stacko_1(p1 varchar, p2 varchar)
    RETURNS VARCHAR
    LANGUAGE javascript
    EXECUTE AS caller
    AS
    $$

    var p_procedure_name = P1;
    var p_params = P2;

    if(p_params.length > 0) {
    v_sqlCode = `
    CALL <p_procedure_name>('<p_params>')
    `;
    v_sqlCode = v_sqlCode.replace("<p_procedure_name>", p_procedure_name);
    v_sqlCode = v_sqlCode.replace("<p_params>", p_params);
    }
    else {
    return "there was no parameter passed";
    }

    try {
    snowflake.execute({sqlText: v_sqlCode});
    }
    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!";
    $$;

    CREATE OR REPLACE PROCEDURE sp_stacko_2(p3 varchar)
    RETURNS VARCHAR
    LANGUAGE javascript
    EXECUTE AS caller
    AS
    $$

    var p_table_name = P3;
    var v_sqlCode = "CREATE TABLE <table_name> (name varchar)";
    v_sqlCode = v_sqlCode.replace("<table_name>", p_table_name);

    try {
    snowflake.execute({sqlText: v_sqlCode});
    }
    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 sp_stacko_1('sp_stacko_2','P');

关于snowflake-cloud-data-platform - 如何将存储过程作为雪花中的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69347608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com