我在存储过程中具有以下动态sql代码。通过传递下面列出的不同参数,我可以得到不同的结果。有人可以帮助我吗,更改您想要的任何内容,但请确保它可以传递这些参数。非常感谢!
CREATE PROCEDURE DV_CIMAUSER_DB.spDataValidationDynamicSQL (
sourceDB VARCHAR(255),
sourceDate VARCHAR(255),
sourceColumn VARCHAR(255),
sourceTable VARCHAR(255),
destinationDB VARCHAR(255),
destinationDate VARCHAR(255),
destinationColumn VARCHAR(255),
destinationTable VARCHAR(255)
)
DYNAMIC RESULT SETS 1
BEGIN
DECLARE SqlStr VARCHAR(2000);
DECLARE C1 CURSOR FOR S1;
SET SqlStr =
'SELECT a.EVENT_DATE, a.source_value, b.destination_value
FROM (
SELECT CAST('||sourceDate||' AS DATE format ''YYYY-MM-DD'') AS EVENT_DATE, CAST(SUM('||sourceColumn||') AS DECIMAL(38, 2)) AS source_value
FROM '||sourceDB||'.'||sourceTable||'
GROUP BY EVENT_DATE
) AS a
FULL OUTER JOIN (
SELECT '||destinationDate||', CAST(SUM('||destinationColumn||') AS DECIMAL(38, 2)) AS destination_value
FROM '||destinationDB||'.'||destinationTable||'
GROUP BY EVENT_DATE
) AS b
ON a.EVENT_DATE = b.EVENT_DATE
WHERE a.source_value <> b.destination_value OR a.source_value IS NULL OR b.destination_value IS NULL
ORDER BY a.EVENT_DATE';
PREPARE S1 FROM SqlStr;
OPEN C1 USING sourceDB, sourceDate, sourceColumn, sourceTable, destinationDB, destinationDate, destinationColumn, destinationTable;
CLOSE C1;
END;
并且我使用CALL DV_CIMAUSER_DB.spDataValidationDynamicSQL ('PD_CIMAPROD_VMDB', 'timeperiod', 'IMPRESSIONS', 'BASE_PS_BING', 'PD_CIMAPROD_VMDB', 'EVENT_DATE', 'IMPRESSIONS', 'BASE_PS_BING');
并且我收到以下错误:enter image description here
没有存储过程中的动态sql,我有权选择timeperiod
中的PD_CIMAPROD_VMDB.BASE_PS_BING
列。因此,我不知道存储过程中什么时候出错。有人可以帮我提供代码吗?非常感谢!
您是否要在与执行常规选择查询的用户相同的用户下创建过程?
如果不是,那么您在其下创建过程的用户很可能具有不同的权限集,并且无权访问PD_CIMAPROD_VMDB。
默认情况下,过程从创建它的用户那里继承了一组权限。
为了使过程继承创建它的用户的权限,必须在过程主体中指定“ SQL安全调用程序”(https://docs.teradata.com/reader/scPHvjfglIlB8F70YliLAw/bnfuLvcCbLoSyrgiu~_j_w)