Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在snowflake中使用存储过程将值插入表_Javascript_Sql_Stored Procedures_Snowflake Cloud Data Platform - Fatal编程技术网

Javascript 在snowflake中使用存储过程将值插入表

Javascript 在snowflake中使用存储过程将值插入表,javascript,sql,stored-procedures,snowflake-cloud-data-platform,Javascript,Sql,Stored Procedures,Snowflake Cloud Data Platform,我需要将一个表的列名插入到另一个表中 以下是我的尝试: 我首先创建了一个表来插入列名 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.createStatemen

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

以下是我的尝试:

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

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(tab\u name string,col\u name string);
创建或替换过程get_列(表名称VARCHAR)
返回数组
语言JAVASCRIPT
作为
$$
var stmt=snowflake.createStatement({
sqlText:“从“+表格名称+”限制1中选择*”,
});
stmt.execute();
var cols=[];

对于(i=1;i当我执行您的存储过程(假设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] + "')" + ";"
              });

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

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;
  
$$
;
如果确实需要存储过程返回输出数组中的列名,则可以使用以下方法:

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;
  
$$
;
在这方面也有其他的变化