带有动态 SQL 语句错误的 Snowflake 存储过程

Snowflake Stored procedure with dynamic SQL statement Error

我在测试 sp 之后进行测试,Proc 正在抱怨 sql 命令

JavaScript compilation error: Uncaught SyntaxError: Unexpected string in TEST_PROC at ' var sqlCommand

我想在此过程中完成的是,运行 select 在 table 上准备更改语句并执行所有语句。

CREATE OR REPLACE PROCEDURE test_proc()
RETURNS STRING
LANGUAGE javascript 
AS
$$
    
            var sqlCommand =  "select ''ALTER EXTERNAL TABLE''|| '' '' || SCHEMA_NAME ||''.'' || TABLE_NAME ||'' ''|| ''REFRESH'' ||'' ''''''|| LOCATION ||''''''''
                               from EXT_TABLE_CONGIG 
                               where TABLE_NAME =''TABLEXYZ'';"

            var stmt = snowflake.createStatement({ sqlText: sqlCommand } );
            
            stmt.execute();
            return 'success'
  

$$;```

您不能在 JavaScript 中使用双引号定义 multi-line 字符串。还有一个报价余额问题。

使用反引号 (backticks) 允许 multi-line 个字符串并使用单引号或双引号而无需将它们加倍。

CREATE OR REPLACE PROCEDURE test_proc()
RETURNS STRING
LANGUAGE javascript 
AS
$$

var sqlCommand =  `select 'ALTER EXTERNAL TABLE' || ' ' || SCHEMA_NAME || '.' || TABLE_NAME || ' ' || 'REFRESH' || '''' || LOCATION || ''''
                               from EXT_TABLE_CONGIG 
                               where TABLE_NAME = 'TABLEXYZ';`

var stmt = snowflake.createStatement({ sqlText: sqlCommand } );

var rs = stmt.execute();

rs.next();

var sql = rs.getColumnValue(1);

stmt = snowflake.createStatement({ sqlText: sql });

stmt.execute();

return 'success';

$$;

call test_proc();

下面的例子是在程序中演示运行动态SQL - @Greg 的回答已经在 java 脚本中找到了 multi-line。

CREATE OR REPLACE PROCEDURE test_proc()
RETURNS STRING
LANGUAGE javascript 
AS
$$
  var sqlCommand =  "select 'alter table '||tname||' add (id number)' from t_name where tname in ('t1','t2','t3')";

  var stmt = snowflake.createStatement({ sqlText: sqlCommand } );
  
  var v_result = stmt.execute();
  while(v_result.next()) {
  var stmt1 = snowflake.createStatement({ sqlText: v_result.getColumnValue(1) } );
  stmt1.execute();
  var f_result = v_result.getColumnValue(1);
  };
  return 'success';
$$
;

还有refer-

通读 - “这是一个检索 ResultSet 并遍历它的示例:”