【问题标题】:Inserting values into a table using stored procedure in snowflake使用雪花中的存储过程将值插入表中
【发布时间】:2020-09-11 13:48:19
【问题描述】:

我需要将一个表的列名插入到另一个表中。

这是我的尝试:

我首先创建了一个表来插入列名

create or replace table TABLE1 (tab_name string, col_name string);

CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
    var stmt = snowflake.createStatement({
    sqlText: "SELECT * FROM " + TABLE_NAME + " LIMIT 1;",    
    });
    stmt.execute();

    var cols=[];
    for (i = 1; i <= stmt.getColumnCount(); i++) {
        cols.push(stmt.getColumnName(i));
    }

    //Values not being inserted into the table
    for(i=0; i<cols.length;i++)
    {
         var stmt2 = snowflake.createStatement({
         sqlText: "INSERT INTO TABLE1 VALUES(" + TABLE_NAME + "," + cols[i] + ")" + ";"
              });
         stmt2.execute();
    }
    return cols
    $$;

当我打印出 TABLE1 时,我没有得到任何输出。我不明白我在哪里做错了

【问题讨论】:

    标签: javascript sql stored-procedures snowflake-cloud-data-platform


    【解决方案1】:

    当我执行你的存储过程时(假设 TABLE_NAME = FOO),它返回一个错误:

    Execution error in store procedure GET_COLUMNS: SQL compilation error: error line 1 at position 26 invalid identifier 'FOO' At Statement.execute, line 18 position 15
    

    如果您查看 SQL 历史记录,您将看到您正在生成以下 INSERT 语句:

    INSERT INTO TABLE1 VALUES(FOO,COL1);
    

    字面值周围缺少单引号;应该是:

    INSERT INTO TABLE1 VALUES('FOO','COL1');
    

    要更正此问题,您可以更改:

             var stmt2 = snowflake.createStatement({
             sqlText: "INSERT INTO TABLE1 VALUES(" + TABLE_NAME + "," + cols[i] + ")" + ";"
                  });
    

    到这里:

             var stmt2 = snowflake.createStatement({
             sqlText: "INSERT INTO TABLE1 VALUES('" + TABLE_NAME + "','" + cols[i] + "')" + ";"
                  });
    
    

    也就是说,我会完全从不同的角度来处理这个问题。检索元数据信息(例如列名)的更有效方法是通过INFORMATION_SCHEMA 视图。如果您不需要将列名数组作为存储过程的输出返回,则可以使用如下内容:

    CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
    RETURNS ARRAY
    LANGUAGE JAVASCRIPT
    AS
    $$
      let sql_insert = `
    INSERT INTO TABLE1 (
      tab_name
     ,col_name
    )
    SELECT TABLE_NAME
          ,COLUMN_NAME
      FROM INFORMATION_SCHEMA.COLUMNS
     WHERE TABLE_NAME = ?
    `;
    
      snowflake.execute({"sqlText" : sql_insert, "binds" : [TABLE_NAME]});
      
      return [];
    $$
    ;
    

    如果您确实要求存储过程在输出数组中返回列名,那么您可以使用如下内容:

    CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
    RETURNS ARRAY
    LANGUAGE JAVASCRIPT
    AS
    $$
      let sql_get_cols = `
    SELECT COLUMN_NAME
      FROM INFORMATION_SCHEMA.COLUMNS
     WHERE TABLE_NAME = ?
     ORDER BY ORDINAL_POSITION
    `;
    
      let sql_insert = `
    INSERT INTO TABLE1 (
      tab_name
     ,col_name
    )
    VALUES (?, ?)
    `;
    
      let rs_get_cols = snowflake.execute({"sqlText" : sql_get_cols, "binds" : [TABLE_NAME]});
      
      let cols = [];
      while (rs_get_cols.next()) {
        let column_name = rs_get_cols.getColumnValue(1);
        snowflake.execute({"sqlText" : sql_insert, "binds" : [TABLE_NAME, column_name]});
        cols.push(column_name);
      }
      
      return cols;
      
    $$
    ;
    

    这方面还有其他变体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多