Netezza 存储过程 DB_NAME 作为参数

Posted

技术标签:

【中文标题】Netezza 存储过程 DB_NAME 作为参数【英文标题】:Netezza Stored procedure DB_NAME as an argument 【发布时间】:2016-06-30 19:15:57 【问题描述】:

大家好,我在 Aginity(Netezza) 中写了一个简单的程序。存储过程基本上必须将数据从一个 db.table1 加载到 db2.table2。简单吧?然后过程 - 过程 1 接受一个参数,即数据库 (db) 的名称。

这是我尝试运行程序时收到的错误消息: /* 错误 [HY000] 错误:语法错误,意外变量,期望在“db_arg”或附近开始 */

过程如下所示:

CREATE OR REPLACE PROCEDURE LOAD_data_proc(CHARACTER VARYING(15))
RETURNS INTEGER
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE 
db_arg CHARACTER VARYING(15);

/* 如果我删除上述声明,我会收到以下错误消息: ERROR [HY000] ERROR: ResolveCatalog: error retrieving database 'STG_DB_NAME' */

db_arg ALIAS FOR $1;

/* 和一堆其他参数和声明 */

BEGIN

/* 这里的逻辑 if then else 语句 */

END;
END_PROC;

以前有人遇到过这个问题吗?

【问题讨论】:

【参考方案1】:

您的描述不是 100% 清楚实际的 NZPLSQL 代码是什么,但我可以使用以下方法重现您的第一个错误:

CREATE OR REPLACE PROCEDURE LOAD_DATA_PROC(CHARACTER VARYING(15))
RETURNS INTEGER
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE 
    db_arg CHARACTER VARYING(15);
    db_arg alias for $1;
BEGIN
    db_arg := 'SYSTEM';
    RAISE NOTICE '%', db_arg;
    RETURN 0;
END;
END_PROC;

注意在 DECLARE 块中有一个相同变量名的双重声明。这是不允许的,这会导致:

ERROR [HY000] ERROR:  syntax error, unexpected VARIABLE, expecting BEGIN at or near "db_arg"

删除其中一个声明将允许该过程完成。

在 NZPLSQL 上有关将参数传递给存储过程的 IBM 文档可在此处获得:https://www.ibm.com/support/knowledgecenter/SSULQD_7.2.0/com.ibm.nz.sproc.doc/c_sproc_parameter_passing.html 和这里: https://www.ibm.com/support/knowledgecenter/SSULQD_7.2.0/com.ibm.nz.sproc.doc/c_sproc_arg_list.html

至于:

ERROR [HY000] ERROR: ResolveCatalog: error retrieving database 'STG_DB_NAME' 

当我尝试在不存在的数据库的不存在架构中调用不存在的存储过程时会发生这种情况,例如:

CREATE OR REPLACE PROCEDURE LOAD_DATA_PROC(CHARACTER VARYING(15))
RETURNS INTEGER
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE 
    db_arg alias for $1;
BEGIN
    CALL UNKNOWNDB.UNKNOWN_SCHEMA.UNKNOWN_STORED_PROC(1234,5678,7890,123456,1234567);
END;
END_PROC;

这给了我:

ERROR [HY000] ERROR:  ResolveCatalog: error retrieving database 'UNKNOWNDB'

希望这有助于解释错误以及如何避免它们。

【讨论】:

您在第一条错误消息中的位置,双重声明只是解决问题的绝望尝试。第二个错误,传递了参数'bd_name',但netezza没有将其视为'database_name',所以每当我使用db_name参数时我都必须运行动​​态查询【参考方案2】:

好的,我想通了...您可以将 db_names 作为参数传递给 netezza 存储过程,但是每次在过程中使用参数时,您都必须使用动态查询...

希望有一天这对某人有所帮助。

【讨论】:

以上是关于Netezza 存储过程 DB_NAME 作为参数的主要内容,如果未能解决你的问题,请参考以下文章

Netezza 存储过程错误

Netezza/SQL 列别名将文本与参数值连接起来

从 SAS 调用 Netezza 存储过程

如何将 Netezza 存储过程的返回值捕获到变量中?

使用存储过程将值插入到 netezza

Netezza 存储过程中是不是有任何方法可以将输出放入文件中