Alexey Gaidukov wrote :

>
>I wrote
>
>
>CREATE TABLE TEMP.INTS (
>       element Integer
>);
>
>
>CREATE DBPROC GIS.SPLIT_INT(IN str varchar) as
>VAR
>i1 smallint;
>i2 smallint;
>el Integer;
>BEGIN
>    TRY
>        CREATE TABLE TEMP.INTS (
>            element Integer
>        );
>    CATCH BEGIN
>        IF ($rc = -6000) THEN
>            EXECUTE 'DELETE FROM TEMP.INT'
>        ELSE
>            STOP($rc, $errmsg);
>    END;
>    SET i1 = 0;
>    SET i2 = 1;
>    WHILE i2 > 0 do BEGIN
>        SET i2 = index(str,',',i1+1,1);
>        if i2 > 0 then BEGIN
>            SET el = num(substr(str, i1+1,i2-i1-1));
>            insert into TEMP.INTS values (:el);
>        END
>        else BEGIN
>            SET el = num(substr(str, i1+1));
>            if length(el)>0 then
>                insert into TEMP.INTS values (:el);
>        END;
>        SET i1 = i2;
>    END;
>END;
>
>
>CREATE DBPROC GIS.notePrintedRes(IN count_list varchar) as
>BEGIN
>    CALL split_ints(:count_list);
>    update gis.did_doc set is_print=true where counter in (select 
>element from TEMP.INTS) and forma is not null;
>END;
>
>
>
>Auto Commit: On, SQL Mode: Internal, Isolation Level: Committed
> Base table not found;-4004 POS(173) Unknown table name:INTS
>
>
>
>As I understand I should in each DBPROC where I want to use split_ints 
>write something like the following?
>
>
>CREATE DBPROC GIS.notePrintedRes(IN count_list varchar) as
>BEGIN
>    TRY
>        CREATE TABLE TEMP.INTS (
>            element Integer
>        );
>    CATCH BEGIN
>    END;
>    CALL split_ints(:count_list);
>    update gis.did_doc set is_print=true where counter in (select 
>element from TEMP.INTS) and forma is not null;
>END;
>
>
>Anhaus, Thomas пишет:
>
>>Alexey Gaidukov wrote :
>>  
>>
>>>I have a table temp.printinfo created before in the same session.
>>>
>>>
>>>When I perfrom
>>>
>>>CREATE DBPROC GIS.GetPrintInfo(IN p_counter Integer)
>>>BEGIN
>>>     TRY
>>>             CREATE TABLE temp.printinfo (
>>>                     ID Integer
>>>             );
>>>     CATCH BEGIN
>>>             IF ($rc = -6000) THEN
>>>                     DELETE FROM TEMP.printinfo
>>>             ELSE
>>>                     STOP($rc, $errmsg);
>>>     END;
>>>     INSERT INTO temp.printinfo
>>>             SELECT min(id) id from gis.did_log;
>>>END;
>>>
>>>
>>>
>>>I get
>>>
>>>Auto Commit: On, SQL Mode: Internal, Isolation Level: Committed
>>> Base table not found;-4004 POS(338) Unknown table name:PRINTINFO
>>>
>>>
>>>But the follwing works well
>>>
>>>
>>>CREATE DBPROC GIS.GetPrintInfo(IN p_counter Integer)
>>>BEGIN
>>>     TRY
>>>             CREATE TABLE temp.printinfo (
>>>                     ID Integer
>>>             );
>>>     CATCH BEGIN
>>>             IF ($rc = -6000) THEN
>>>                     EXECUTE 'DELETE FROM TEMP.printinfo'
>>>             ELSE
>>>                     STOP($rc, $errmsg);
>>>     END;
>>>     INSERT INTO temp.printinfo
>>>             SELECT min(id) id from gis.did_log;
>>>END;
>>>
>>>
>>>It's very strange. Why I can't delete from temp.printinfo but I can 
>>>insert into temp.printinfo?
>>>
>>>
>>>
>>>-- 
>>>    
>>>
>>
>>When MaxDB compiles a db-procedure the sql statements are normally
>>prepared in the
>>order of their occurrence, i.e. from top to bottom of the definition
>>text. 
>>But there is one exception. In case of a catch statement the 
>catch block
>>is 
>>compiled before the try block. This means that in you example 
>the table
>>temp.printinfo
>>doesn't exist, when the delete statement becomes prepared. This causes
>>error -4004.
>>I recommend to do without the try/catch statement :
>>
>>CREATE DBPROC GIS.GetPrintInfo(IN p_counter Integer)
>>BEGIN
>>    CREATE TABLE temp.printinfo (ID Integer);
>>    IF $rc <> 0
>>    THEN
>>        IF ($rc = -6000) THEN
>>            DELETE FROM TEMP.printinfo
>>        ELSE
>>            STOP($rc, $errmsg);
>>
>>    INSERT INTO temp.printinfo
>>        SELECT min(id) id from gis.did_log;
>>END;
>>
>>Best Regards,
>>Thomas
>>
>>
>>  
>>
>
>
>-- 
>MaxDB Discussion Mailing List
>For list archives: http://lists.mysql.com/maxdb
>To unsubscribe:    
>http://lists.mysql.com/[EMAIL PROTECTED]
>
>
Whenever your db-procedure contains a static sql statement (let's say S)
referencing a TEMP table, a create statement for that table must be contained
in that db-procedure and the create statement must have been evaluated 
before S is prepared by the compiler.
Alternatively you can use dynamic sql statements referencing the TEMP table.

Best Regards,
Thomas 

 

--
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to