微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在雪花中创建表的 Javascript 程序

如何解决在雪花中创建表的 Javascript 程序

我尝试了以下代码来创建列在表数组中的表,但出现错误

JavaScript 编译错误:未捕获的 SyntaxError:在 CREATE_TABLES_SP 中出现意外的输入结束 '

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.
        }
    $$; 

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

解决方法

使用 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_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 注入攻击。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。