Netezza存储过程DB_NAME作为参数

时间:2016-06-30 19:15:57

标签: sql stored-procedures netezza

大家好我在Aginity(Netezza)写了一个简单的程序。存储过程基本上必须将数据从一个db.table1加载到db2.table2。简单吧?然后程序 - 过程1接受一个参数,它是数据库(db)的名称。 这是我尝试运行我的过程时收到的错误消息: / * 错误[HY000]错误:语法错误,意外VARIABLE,期望BEGIN在或接近" db_arg" * / 该过程看起来像这样: 创建或替换过程LOAD_data_proc(字符变化(15)) 退货整数 LANGUAGE NZPLSQL AS BEGIN_PROC 宣布 db_arg CHARACTER VARYING(15); / *如果我删除上面的声明我收到以下错误消息:错误[HY000]错误:ResolveCatalog:错误检索数据库' STG_DB_NAME' * / db_arg ALIAS $ 1; / *和一堆其他参数和声明* / 开始 / *逻辑在这里if then else语句* / 结束; END_PROC; 以前有人遇到过这个问题吗?

2 个答案:

答案 0 :(得分:0)

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

希望有一天能帮助某人。

答案 1 :(得分:0)

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

    IEnumerable<string> partial = Enumerable.Range(0, 10000).Select(i => System.IO.Path.GetRandomFileName()).ToList();
    IEnumerable<string> full = partial.Select(i => System.IO.Path.Combine( System.IO.Path.GetTempPath(),i)).ToList();

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

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;

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

有关参数传递给存储过程的关于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:  syntax error, unexpected VARIABLE, expecting BEGIN at or near "db_arg"

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

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;

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