存储过程未使用' Set'

时间:2017-04-26 09:46:34

标签: stored-procedures ibm-midrange

我有一个存储过程,我无法编译。

CREATE PROCEDURE FINGOODSCH(IN STRDATE DATE,           
                                 IN prodln Char(5))                                                  
        LANGUAGE SQL                                        
        RESULT SETS 1                                       
        SET OPTION DBGVIEW =*SOURCE                                                                          
    BEGIN                                                   
     Declare IN_DATE NUMERIC(7,0);
SET IN_DATE = 0;                                                          
/*     SET IN_DATE = (DECIMAL(CHAR(SUBSTR(CHAR(STRDATE),1,4);       */    
/*                   SUBSTR(CHAR(STRDATE),6,2) CONCAT               */    
 /*                  SUBSTR(CHAR(STRDATE),9,2))) - 19000000)  ;     */    

Declare FinGoodSCH Cursor for                                             
  Select TRIM(ORDNO) as OrderNumber,                                      
          ( '20' || SUBSTR(CHAR(ODUDT),2,2) || '-' ||                     
          SUBSTR(CHAR(ODUDT),4,2) || '-' ||                               
           SUBSTR(CHAR(ODUDT),6,2))  as OrderDueDate,                 
          TRIM(FITEM) as ModelNumber,                                 
          TRIM(DPTNO) as ProductionLine                               
   From ORMAST                                                        
   Where                                                              
    DPTNO = prodln                                                    

      OPEN FinGoodSCH ;    

 END                                                 

问题在于声明' SET IN_DATE = 0; (我知道我可以使用Default将其设置为0,但那不是我想要的)'。如果我删除此语句,它将编译。编译错误是:  SQL0104 30 3位置33令牌FINGOODSCH无效。有效
                      代币:GLOBAL。

另外,我尝试用十进制声明它但是它不起作用

1 个答案:

答案 0 :(得分:2)

您必须在任何可执行代码之前在SQL中执行声明....

CREATE PROCEDURE FINGOODSCH(IN STRDATE DATE,           
                                 IN prodln Char(5))                                                  
        LANGUAGE SQL                                        
        RESULT SETS 1                                       
        SET OPTION DBGVIEW =*SOURCE                                                                          
BEGIN                                                   
   Declare IN_DATE NUMERIC(7,0);

   Declare FinGoodSCH Cursor for                                             
      Select TRIM(ORDNO) as OrderNumber,                                      
          ( '20' || SUBSTR(CHAR(ODUDT),2,2) || '-' ||                     
          SUBSTR(CHAR(ODUDT),4,2) || '-' ||                               
           SUBSTR(CHAR(ODUDT),6,2))  as OrderDueDate,                 
          TRIM(FITEM) as ModelNumber,                                 
          TRIM(DPTNO) as ProductionLine                               
      From ORMAST                                                        
      Where                                                              
        DPTNO = prodln;                                                    

     -- Executable code starts here....
     SET IN_DATE = (DECIMAL(CHAR(SUBSTR(CHAR(STRDATE),1,4);       
                   SUBSTR(CHAR(STRDATE),6,2) CONCAT                   
                  SUBSTR(CHAR(STRDATE),9,2))) - 19000000)  ;         

     OPEN FinGoodSCH ;    

 END   

请注意,如果您碰巧想在光标中使用IN_DATE,那么您仍然可以像上面那样使用它。在DB2中打开游标之前,不会评估DECLARE CURSOR语句中使用的任何变量的值。