Netezza 存储过程 DB_NAME 作为参数

Netezza Stored procedure DB_NAME as an argument

大家好,我在 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 ;

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

BEGIN

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

END;
END_PROC;

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

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

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

从你的描述中不能 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 ;
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 ;
BEGIN
    CALL UNKNOWNDB.UNKNOWN_SCHEMA.UNKNOWN_STORED_PROC(1234,5678,7890,123456,1234567);
END;
END_PROC;

这给了我:

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

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