光标不完整/格式错误

user2400394

我有一个PL / SQL脚本来执行一些聚合任务。我遇到编译错误,目前逻辑不是最重要的事情,因为一旦解决错误,就可以更改逻辑。脚本如下:

SET SERVEROUTPUT ON;
ALTER SESSION SET NLS_DATE_FORMAT = 'dd-MON-yy';
CREATE OR REPLACE PROCEDURE updateFeaturePerformanceTable
    (noOfDays IN NUMBER, runDate IN DATE, timeSpan IN VARCHAR2)
AS
    CURSOR c_feature_performance IS 
        SELECT distinct mkt_id,dow,device_type,feature_name 
        FROM gfmdev.feature_performance 
        WHERE timespan = 'ONE_DAY' 
        AND feature_performance_day >= TO_DATE('17-AUG-15','dd-MON-yy');
    rowsExtracted c_feature_performance%ROWTYPE;
    extractDate DATE;
    timespan_test varchar2(20);
BEGIN
    OPEN c_feature_performance;
    extractDate := runDate - noOfDays;
    timespan_test := timeSpan;
    LOOP
        FETCH c_feature_performance INTO rowsExtracted;
        EXIT WHEN c_feature_performance%NOTFOUND;

        dbms_output.put_line(extractDate || ' ' || timespan_test);

        INSERT INTO gfmdev.feature_performance
        SELECT  
            rowsExtracted.mkt_id,
            rowsExtracted.dow,
            rowsExtracted.device_type,
            rowsExtracted.feature_name,
            SUM(OPS),
            SUM(GV_COUNT),
            runDate,
            timespan_test
    FROM    gfmdev.feature_performance   
    WHERE   feature_performance_day BETWEEN extractDate AND runDate 
    AND timespan = 'ONE_DAY'
    AND mkt_id = rowsExtracted.mkt_id
    AND dow = rowsExtracted.dow
    AND device_type = rowsExtracted.device_type
    AND feature_name = rowsExtracted.feature_name
    group by mkt_id, dow, device_type, feature_name, timespan;      

END LOOP;
CLOSE c_feature_performance;
EXCEPTION
    WHEN TOO_MANY_ROWS THEN
        dbms_output.put_line('Trying to insert too many rows in SELECT...INTO');
        ROLLBACK;
    WHEN NO_DATA_FOUND THEN
        dbms_output.put_line('No rows returned in SELECT...INTO');
        ROLLBACK;
    WHEN STORAGE_ERROR THEN
        dbms_output.put_line('Too much data to handle! Storage error');
        ROLLBACK;
    WHEN OTHERS THEN
        dbms_output.put_line('Oops! Something went wrong');
        ROLLBACK;
        RAISE;      

END updateFeaturePerformanceTable;

显示编译错误:

SHOW ERRORS PROCEDURE updateFeaturePerformanceTable;

运行过程:

DECLARE
    runDate DATE;
BEGIN
FOR j IN 0 .. 5 LOOP
    SELECT (TO_DATE('17-AUG-15','dd-MON-yy') + j) INTO runDate FROM dual;
    updateFeaturePerformanceTable(6,runDate, 'ONE_WEEK');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' WEEKLY RECORDS UPDATED ');
FOR j IN 0 .. 28 LOOP
    SELECT (TO_DATE('17-AUG-15','dd-MON-yy') + j) INTO runDate FROM dual;
    updateFeaturePerformanceTable(29,runDate, 'ONE_MONTH');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' MONTHLY RECORDS UPDATED ');
COMMIT;
END;
/

当我执行它时,我收到以下错误消息:

Errors for PROCEDURE UPDATEFEATUREPERFORMANCETABLE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/9      PLS-00341: declaration of cursor 'C_FEATURE_PERFORMANCE' is
     incomplete or malformed

5/3      PL/SQL: SQL Statement ignored
6/15     PL/SQL: ORA-00942: table or view does not exist
8/16     PL/SQL: Item ignored
16/3     PL/SQL: SQL Statement ignored
16/36    PLS-00320: the declaration of the type of this expression is
     incomplete or malformed

21/3     PL/SQL: SQL Statement ignored

LINE/COL ERROR
-------- -----------------------------------------------------------------
36/22    PL/SQL: ORA-00904: "ROWSEXTRACTED"."FEATURE_NAME": invalid
     identifier

36/22    PLS-00320: the declaration of the type of this expression is
     incomplete or malformed

            updateFeaturePerformanceTable(6,runDate, 'ONE_WEEK');
            *

非常感谢我对哪里出了问题的帮助吗?

装甲运兵车

PL / SQL是用于以编程方式运行SQL语句的框架。因此,我们经常发现PL / SQL错误是由代码中的SQL错误引起的。

就是这种情况。您有多个PL / SQL错误,指示Cursor声明无效。为什么无效?该行包含答案:

6/15     PL/SQL: ORA-00942: table or view does not exist

所以问题是,过程UPDATEFEATUREPERFORMANCETABLE(顺便说一句丑陋的名称)的所有者没有的权利gfmdev.feature_performance

为了解决这个问题,表所有者GFMDEV需要直接将SELECT和INSERT授予拥有此过程的帐户。

SQL>  conn gfmdev/password
SQL>  grant select, insert on feature_performance to whoever;

请注意,通过视图授予特权不会削减它。Oracle安全模型仅允许我们使用直接授予用户权限的对象来构建对象-PL / SQL程序,视图。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章