1

正如您很可能从以下问题中推断出的那样,我通常是 DB2 的新手。我正在尝试使用 IBM Data Studio 编写我的第二个存储过程,但在尝试部署它时遇到了错误。存储过程的重点是在不同表的字段中搜索文本字符串。注意:代码不完整,在当前形式下没有用处。我正在尝试测试每一步。

这是我到目前为止的所有代码:

CREATE OR REPLACE PROCEDURE sp_find_string (in in_search_string varchar(200), in in_schema varchar(50))
    DYNAMIC RESULT SETS 1
P1: BEGIN
    -- #######################################################################
    -- # 
    -- #######################################################################
    declare table_a varchar(200);
    declare colname varchar(200);
    declare sqlcmd  varchar(2000);
    declare eof smallint default 0;
    declare not_found condition for sqlstate '02000';

    -- Declare cursor
    DECLARE cursor1 CURSOR WITH RETURN for
        select tabname, colname from syscat.columns c
        --inner join syscat.tables t on t.tabschema = c.tabschema
        --  and t.tabname = c.tabname
        where tabname like 'MERLIN%'
        and tabschema = in_schema;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'  -- or SQLEXCEPTION

    -------------------------------------------------
    if (exists
            (
                select 1 from sysibm.systables
                where creator = 'A2815'
                and name = 'DBP_TEMP_SEARCH_RESULTS'
            )
        ) then drop table A2815.DBP_TEMP_SEARCH_RESULTS;
    end if;

    create table A2815.DBP_TEMP_SEARCH_RESULTS
    (text_to_match varchar(200)
    ,table_a varchar(200)
    ,colname varchar(200)
    ,match_count bigint);

    -- Cursor left open for client application
    OPEN cursor1;
        while eof = 0 do
            p2: begin
                declare continue handler for not_found set eof = 1;
                fetch from cursor1 into table_a, colname;
                insert into A2815.DPB_TEMP_SEARCH_RESULTS
                values(table_a, colname);
            end p2;
        end while;
    close cursor1;
    --return;

END P1 

尝试部署时出现此错误:

Deploy [TIO_D]A2815.SP_FIND_STRING(VARCHAR(200), VARCHAR(50))

Running
A2815.SP_FIND_STRING - Deploy started.
Create stored procedure returns SQLCODE: -204, SQLSTATE: 42704.
A2815.SP_FIND_STRING: 44: "A2815.DPB_TEMP_SEARCH_RESULTS" is an undefined name.. SQLCODE=-204, SQLSTATE=42704, DRIVER=4.18.60
"A2815.DPB_TEMP_SEARCH_RESULTS" is an undefined name.. SQLCODE=-204, SQLSTATE=42704, DRIVER=4.18.60
A2815.SP_FIND_STRING - Deploy failed.
A2815.SP_FIND_STRING - Roll back completed successfully.

当我注释掉插入语句时,它部署得很好(但当然,如果没有插入能力,这个过程对我没有多大好处):

OPEN cursor1;
        while eof = 0 do
            p2: begin
                declare continue handler for not_found set eof = 1;
                fetch from cursor1 into table_a, colname;
                --insert into A2815.DPB_TEMP_SEARCH_RESULTS
                --values(table_a, colname);
            end p2;
        end while;
    close cursor1;

确实,该表还不存在,因为它应该由过程创建。但是,如果我创建表然后部署该过程,我会收到此错误:

Deploy [TIO_D]A2815.SP_FIND_STRING(VARCHAR(200), VARCHAR(50))

    Running
    A2815.SP_FIND_STRING - Deploy started.
    Create stored procedure returns SQLCODE: -601, SQLSTATE: 42710.
    A2815.SP_FIND_STRING: 32: The name of the object to be created is identical to the existing name "A2815.DBP_TEMP_SEARCH_RESULTS" of type "TABLE".. SQLCODE=-601, SQLSTATE=42710, DRIVER=4.18.60
    The name of the object to be created is identical to the existing name "A2815.DBP_TEMP_SEARCH_RESULTS" of type "TABLE".. SQLCODE=-601, SQLSTATE=42710, DRIVER=4.18.60
    A2815.SP_FIND_STRING - Deploy failed.
    A2815.SP_FIND_STRING - Roll back completed successfully.

谁能告诉我如何在表存在、不存在或两者兼有时部署此过程?

非常感谢,让我知道还需要什么其他细节。此外,关于如何改进代码的建议也很好。

4

2 回答 2

0

可能有点晚了,但最好的方法是使用您的查询创建一个字符串,而不是直接使用查询,然后使用 EXECUTE IMMEDIATELY

于 2017-03-29T15:08:53.070 回答
0

最简单的解决方案是简单地创建该表,以便在编译过程之前它存在。如果只是在编译过程之前手动运行 create table 语句,则不会有问题。

评论者建议您应该使用Declare Global Temporary Table,我同意这一点,因为您似乎将其用作临时表。但是,它实际上并不能解决您的具体问题,因为如果临时表在编译时不存在,该过程仍然无法编译。所以,是的,使用临时表,但你仍然需要做同样的事情。

将语句更改insert为动态 SQL 也可以,尽管这是一个丑陋的解决方案。这里不需要,但有时需要。

于 2016-01-15T09:20:49.767 回答