答案 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;
希望这有助于解释错误以及如何避免错误。