首页 > 解决方案 > Snowflake - First Proc - 语法有什么问题

问题描述

CREATE OR REPLACE PROCEDURE "PUBLIC".PHONE_DATA_ROLLUP()
  RETURNS VARCHAR
  LANGUAGE javascript
  AS
  $$
    var rs = snowflake.execute( { sqlText: 
      'INSERT INTO PROC_LOG ("PROC_NAME","EXEC_TIME") SELECT ''value 1'' AS "PROC_NAME", CURRENT_TIMESTAMP as "EXEC_TIME";'
       });
   return 'Done.';
  $$;


CALL PHONE_DATA_ROLLUP();

错误:

SQL 错误 [100131] [P0000]:JavaScript 编译错误:未捕获的 SyntaxError:在 ''INSERT INTO PROC_LOG ("PROC_NAME","EXEC_TIME") SELECT ''VALUE 1'' AS "PROC_NAME",CURRENT_DATE as " EXEC_TIME";'' 位置 62

标签: proceduresnowflake-cloud-data-platform

解决方案


我强烈建议在 JavaScript 过程中为 SQL 字符串使用反引号,以及变量绑定,例如

var rs = snowflake.execute( {
  sqlText:  `INSERT INTO PROC_LOG ("PROC_NAME","EXEC_TIME")
             SELECT :1 AS "PROC_NAME", CURRENT_TIMESTAMP as "EXEC_TIME"`,
  binds:    ["value 1"]
});

主要优点是:

  1. 您可以同时使用“单”和“双”引号,而不会造成任何保护污染
  2. 字符串可以是多行的

这两个特性对于 SQL 代码都非常有用。


推荐阅读