我正试图在雪花中创建一个存储过程,该存储过程将数据枢轴放在派生表中。枢轴柱本质上是动态的。我找到了一种通过参数传递来做到这一点的方法。我试图在不传递任何参数的情况下进行同样的操作,但是代码不起作用。
我的方法是在将列提取到变量的表上应用一个循环。然后在枢轴中传递这个变量。while循环本身似乎运行良好。当这个变量被传递到枢轴时,就会出现错误。
我使用的代码:
CREATE OR REPLACE PROCEDURE LOOP_EXMPL_5()
returns varchar
language javascript
as
$$
var column1 = 'qwerty';
var command = `SELECT ATTR_NAME FROM TBL_DIM`;
var stmt = snowflake.createStatement({sqlText: command});
var rs = stmt.execute();
while (rs.next())
{
var column1 = column1.concat(",","'",rs.getColumnValue(1),"'");
}
var column2 = column1
var command_1 = `CREATE OR REPLACE VIEW HIERARCHY_VIEW_2 AS SELECT * FROM (SELECT MSTR.PROD_CODE AS
PROD_CODE,DIM.ATTR_NAME AS ATTR_NAME,MSTR.ATTR_VALUE AS ATTR_VALUE FROM TBL_DIM DIM INNER JOIN
TBL_MSTR MSTR ON DIM.ATTR_KEY=MSTR.ATTR_KEY ) Q
PIVOT (MAX (Q.ATTR_VALUE) FOR Q.ATTR_NAME IN ('${column2}'))
AS P
ORDER BY P.PROD_CODE;`;
var stmt_1 = snowflake.createStatement({sqlText: command_1});
var rs_1 = stmt_1.execute();
return 'success'
$$; 我所犯的错误:
存储过程中的执行错误LOOP_EXMPL_5: SQL编译错误:位于73位置意外“区域”的语法错误第2行。在Statement.execute,16号线,21号位置。
正在传递的变量值:
qwerty、“区域”、“分区”、“部门”、“公司-产品”、“公司-Mfg”、“公司-从船到客户”、“业务部门”、“类别”、“子类别”、“分段”、“子部分”、“品牌”、“聚合品牌”、“次品牌”、“PPG”
我将以某种方式删除SQL中的qwerty部分。
发布于 2021-02-09 08:33:09
关于你的目标,见:
要调试当前问题:column1.concat(",","'",rs.getColumnValue(1),"'");没有正确转义和引用列名。
将UDF设置为返回该值,然后返回var command_1的值,以便您可以适当地进行调试。
一种逃避列的好方法:
select '\\''
|| listagg(distinct pivot_column, '\\',\\'') within group (order by pivot_column)
|| '\\'' 然后使用:
for pivot_column in (${col_list}))发布于 2021-02-11 11:59:19
这是工作代码。非常感谢你的帮助费利佩和格雷格。
CREATE OR REPLACE PROCEDURE LOOP_EXMPL_9()
returns varchar
language javascript
as
$$
var column1 = "";
var command = `SELECT ATTR_NAME FROM TBL_DIM`;
var stmt = snowflake.createStatement({sqlText: command});
var rs = stmt.execute();
while (rs.next())
{
if (column1 != "") column1 += ",";
column1 += `'${rs.getColumnValue (1)}'`;
}
var column2 = column1;
var command_1 = `CREATE OR REPLACE VIEW HIERARCHY_VIEW_2 AS SELECT * FROM (SELECT
MSTR.PROD_CODE AS PROD_CODE,DIM.ATTR_NAME AS ATTR_NAME,MSTR.ATTR_VALUE AS ATTR_VALUE
FROM TBL_DIM DIM INNER JOIN TBL_MSTR MSTR ON DIM.ATTR_KEY=MSTR.ATTR_KEY ) Q
PIVOT (MAX (Q.ATTR_VALUE) FOR Q.ATTR_NAME IN (${column2}))
AS P
ORDER BY P.PROD_CODE;`;
var stmt_1 = snowflake.createStatement({sqlText: command_1});
var rs_1 = stmt_1.execute();
return 'success'
$$; 发布于 2021-02-09 13:44:31
可以从空字符串开始:
var column1 = "";然后,您可以像下面这样连接列列表:
if (column1 != "") column1 += ",";
column1 += `"${rs.getColumnValue(1)}"`);获得SQL语法错误的原因是列名在单引号中,而它们应该在双引号中。
https://stackoverflow.com/questions/66114353
复制相似问题