我创建了一个存储过程GRANT_TO_ARCUSER_DUMP()
,以便对新数据库和用户授予DUMP
访问角色ARCUSER_role
的权限。
在我的存储过程中,我调用了两个过程:
PDYNAMIC_SQL
(执行程序):此过程执行SQL语句XSP_UDMSG
(输出过程):这是调用用户定义的输出函数的存储过程我已经声明了一个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;