在Teradata

时间:2017-10-21 09:25:38

标签: sql stored-procedures teradata

我创建了一个存储过程GRANT_TO_ARCUSER_DUMP(),以便对新数据库和用户授予DUMP访问角色ARCUSER_role的权限。

在我的存储过程中,我调用了两个过程:

  1. PDYNAMIC_SQL(执行程序):此过程执行SQL语句
  2. XSP_UDMSG(输出过程):这是调用用户定义的输出函数的存储过程
  3. 我已经声明了一个EXIT处理程序,我在其中捕获Error文本,然后将该错误文本作为输出过程XSP_UDMSG的输入参数传递。 但它不起作用。请帮助我了解如何在EXIT处理程序中调用存储过程。

    Replace PROCEDURE CWPROCS.GRANT_TO_ARCUSER_DUMP()
    MainSP: BEGIN
    DECLARE V_SQL_STMT   VARCHAR(5000) default '';
    DECLARE SQLSTR  VARCHAR(200) ;
    DECLARE LV_SQLCODE INTEGER ;
    DECLARE LV_ERR_MSG  VARCHAR (2000) DEFAULT '';
    
    
    --Exit handler when error is encountered                               
      DECLARE EXIT HANDLER FOR SQLEXCEPTION
      BEGIN
      SET LV_SQLCODE = SQLCODE;
      SELECT  ' GRANT FAILED - ERROR: ' || ERRORTEXT  
      INTO LV_ERR_MSG FROM DBC.ERRORMSGS
      WHERE ERRORCODE = LV_SQLCODE;
      call CWPROCS.XSP_UDMSG(:LV_ERR_MSG);
      END;                                            
    
     FOR c1 as a2 CURSOR FOR
     SELECT 'GRANT  DUMP  ' || 'ON ' || TRIM ( DATABASENAME ) || ' TO 
     ARCUSER_ROLE;' AS Statements FROM dbc.databasesv 
     WHERE databasename NOT IN 
     ( SELECT databasename FROM dbc.allrolerightsv WHERE rolename = 
     'ARCUSER_ROLE' ) 
     AND DATABASENAME NOT IN ( 'ALL' , 'DBC' , 'DEFAULT' , 'PUBLIC' , 'EXTUSER' 
     , 'TD_FNSYSLIB' ) 
     DO
    
     SET V_SQL_STMT = c1.Statements ;
    
     CALL SYSDBA.PDYNAMIC_SQL(:V_SQL_STMT) ; --Stored Procedure which executes 
     the SQL statements 
    
     SET V_SQL_STMT = '';
    
     END FOR;
    
     IF V_SQL_STMT ='' THEN
    
     SET SQLSTR ='Grant completed Successfully ';
    
     CALL CWPROCS.XSP_UDMSG(:SQLSTR) ; 
     END IF;
     END MainSP;
    

0 个答案:

没有答案