【问题标题】:Javascript Procedure to create tables in Snowflake在雪花中创建表的 Javascript 程序
【发布时间】:2021-06-29 12:26:57
【问题描述】:

我已尝试使用以下代码创建表数组中列出的表,但出现错误:

JavaScript 编译错误:Uncaught SyntaxError: Unexpected end of input in CREATE_TABLES_SP at '

CREATE OR REPLACE PROCEDURE create_tables_sp()   //Procedure to create tables
    RETURNS string
    LANGUAGE JAVASCRIPT
    AS
    $$   
       var tables = ['table_a', 'table_b', 'table_c'];
       for (var table of tables){
       try {
        snowflake.execute (
            {sqlText: "create or replace table PROD_DB.schema1.${table} (ename varchar);"}
            );
        return "Succeeded.";   // Return a success/error indicator.
        }
    catch (err)  {
        return "Failed: " + err;   // Return a success/error indicator.
        }
    $$; 

有人知道我错过了什么吗?

【问题讨论】:

    标签: snowflake-cloud-data-platform java-stored-procedures


    【解决方案1】:

    使用IDENTIFIER 提供表名作为“变量”并使用binds 设置实际值:

    CREATE OR REPLACE PROCEDURE create_table_sp()
    RETURNS string
    LANGUAGE JAVASCRIPT
    AS
    $$
        var tables = ['table_a', 'table_b', 'table_c'];
        
        for (var table of tables) {
            try {
                snowflake.execute(
                    {
                     sqlText: `CREATE OR REPLACE TABLE IDENTIFIER(?)(ename VARCHAR);`
                    ,binds: ['PROD_DB.schema1.' +  table]
                    }
                );
            }
            catch(err){
                return "Failed: " + err;
            };
        };
        
        return "Succeded.";
    $$;
    

    检查:

    CALL create_table_sp();
    
    SELECT * FROM PROD_DB.schema1.table_a;
    SELECT * FROM PROD_DB.schema1.table_b;
    SELECT * FROM PROD_DB.schema1.table_c;
    

    ${table}(字符串插值)的建议用法也可以:

    CREATE OR REPLACE PROCEDURE create_table_sp()
    RETURNS string
    LANGUAGE JAVASCRIPT
    AS
    $$
        var tables = ['table_a', 'table_b', 'table_c'];
        
        for (var table of tables) {
            try {
               var sql = `CREATE OR REPLACE TABLE PROD_DB.schema1.${table} (ename VARCHAR);`;
                snowflake.execute(
                    { sqlText: sql }
                );
            }
            catch(err){
                return "Failed: " + err;
            };
        };
        
        return "Succeded.";
    $$;
    

    但它的安全性较低,容易受到 SQL 注入攻击。

    【讨论】:

    • 谢谢,它成功了。我刚刚意识到我没有将创建或替换语句分配给我发布的代码中的变量,感谢您将我介绍给 IDENTIFIER
    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2020-07-14
    • 2023-03-16
    • 2020-12-12
    • 2022-10-14
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多