存储过程抛出“缺少列规范”

Posted

技术标签:

【中文标题】存储过程抛出“缺少列规范”【英文标题】:Stored procedure throwing "Missing Column Specification" 【发布时间】:2020-12-16 19:26:02 【问题描述】:

我正在使用 javascript 创建一个雪花存储过程。 我收到程序抛出的 SQL 异常,说“缺少列规范”。

堆栈跟踪指向这部分:

var cmd_outputCreation = `CREATE OR REPLACE TABLE $TBL_OUTPUT AS(
                                    SELECT A.*, B.RESULT[0], B.RESULT[1]
                                    FROM(
                                      SELECT $API_FUNCTION(joined.*) AS result
                                      FROM (
                                          SELECT $c_id, $c_location_name, 
                                          $c_street_address, $c_city, $c_region, 
                                          $c_postal_code, $c_latitude, $c_longitude,
                                          $c_country_code
                                          FROM $TBL_INPUT 
                                      ) AS joined
                                    ) AS B
                                    INNER JOIN $TBL_INPUT AS A
                                    ON A.RECID = B.RESULT[0]
                                  )`;
var stmt_outputCreation = snowflake.createStatement( sqlText: cmd_outputCreation );
var result_outputCreation = stmt_outputCreation.execute();

但是,我在这里看不到任何错误。如果我在没有 SP 的情况下使用它,则查询本身在 SQL 上运行(显然用实际的 SQL 表/列替换变量名)

而且我知道“缺少列规范”的意思是“列没有名称”,但情况似乎并非如此。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

您需要为您的 B.RESULT[0] 和 B.RESULT[1] 赋予别名,以便为列提供唯一名称:

create temp table bar as select array_construct(1, 2) as b;

-- This gets missing column specification
create temp table foo as select b[0], b[1] from bar;

-- This does not
create temp table foo as select b[0] as B0, b[1] as B1 from bar;

【讨论】:

以上是关于存储过程抛出“缺少列规范”的主要内容,如果未能解决你的问题,请参考以下文章

九、存储过程中异常的处理

调用存储过程抛出错误时如何使任务失败

从 SQL Server 函数向存储过程抛出异常

db2 存储过程 异常处理

Java存储过程中的getOutputStream抛出错误

第二次调用存储过程抛出ORA异常