【问题标题】:Snowflake - First Proc - What is wrong with SyntaxSnowflake - First Proc - 语法有什么问题
【发布时间】:2019-12-07 02:27:48
【问题描述】:
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 处的 PHONE_DATA_ROLLUP 中的意外字符串 INTO PROC_LOG ("PROC_NAME","EXEC_TIME") SELECT ''VALUE 1'' AS "PROC_NAME", CURRENT_DATE as "EXEC_TIME";'' 位置 62

【问题讨论】:

    标签: procedure snowflake-cloud-data-platform


    【解决方案1】:

    我强烈建议在 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 代码都非常有用。

    【讨论】:

      【解决方案2】:

      在这样的 Javascript 中,您可以使用反斜杠 (\') 代替双单引号 ('') 转义单引号

      ...
      'INSERT INTO PROC_LOG ("PROC_NAME","EXEC_TIME") SELECT \'value 1\' AS "PROC_NAME", CURRENT_TIMESTAMP as "EXEC_TIME";'
      ...
      

      【讨论】:

        猜你喜欢
        • 2011-05-17
        • 2013-04-04
        • 2016-04-11
        • 2014-07-10
        • 2015-11-30
        • 2020-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多