首页 文章

Oracle中的错误(PLS-00103:遇到符号“=”...)尝试选择变量以在游标中使用

提问于
浏览
0

我正在创建一个程序 . 我正在从表中选择一个最大日期到var,然后打算在sql中使用该var作为游标 . 看起来像:

l_max_update_date      DATE;
--Param var
l_max_update_date := NULL;
SELECT max(pivlog.last_update_date) as maxdate into l_max_update_date
FROM piv_verification_log pivlog;

...然后...

--No data in log table?  Create a max_update_date
IF l_max_update_date IS NULL
THEN
l_max_update_date := TO_TIMESTAMP('2014/SEP/1 00:00:00', 'YYYY/MON/DD HH24:MI:SS');
END IF;

最后...

--Get affected employees (those who have certified since the max(last_update_date) listed in the log table)
CURSOR affected_employees_cursor
IS
SELECT    [columns]
FROM      [tables]
WHERE LAST_UPDATE_DATE > l_max_update_date;

但是,每当我编译,我收到此错误消息:

[错误] PLS-00103(47:22):PLS-00103:遇到以下其中一项时遇到符号“=”:常量异常表long double ref char time timestamp

在这一行指出:

l_max_update_date := NULL;

我很感激你的见解 . 我认为它与我定义var和cursor(?)的过程中的顺序或位置有关 .

谢谢 .

2 回答

  • 2

    除了Bob的回答之外,游标将使用 l_max_update_date 在游标打开时的任何值,因此在声明游标之前不必设置它 .

    如果您希望在代码中更明显,那么您也可以将日期作为参数传递给游标:

    CURSOR affected_employees_cursor (p_last_update_date DATE) IS
        SELECT    [columns]
        FROM      [tables]
        WHERE LAST_UPDATE_DATE > p_max_update_date;
    

    然后调用它:

    OPEN affected_employees_cursor (l_max_update_date);
    

    或者您可以将查找组合到游标定义中,只要您只打开一次,并跳过单独的查找并检查:

    CREATE OR REPLACE PROCEDURE SOME_PROC AS
      CURSOR affected_employees_cursor IS
        SELECT    [columns]
        FROM      [tables]
        WHERE LAST_UPDATE_DATE > (
          SELECT COALESCE(MAX(pivlog.last_update_date), DATE '2014-09-01')
          FROM piv_verification_log pivlog
        );
    
      rowAffected_employee affected_employees_cursor%ROWTYPE;
    BEGIN
      OPEN affected_employees_cursor;
    
      LOOP
        FETCH affected_employees_cursor
          INTO rowAffected_employee;
        EXIT WHEN affected_employees_cursor%NOTFOUND;
    
        -- do something useful with the data fetched from the cursor
      END LOOP;
    
      CLOSE affected_employees_cursor;
    END SOME_PROC;
    /
    

    甚至更简单地使用隐式游标循环:

    CREATE OR REPLACE PROCEDURE SOME_PROC AS
    BEGIN
      FOR rowAffected_employee In (
        SELECT    [columns]
        FROM      [tables]
        WHERE LAST_UPDATE_DATE > (
          SELECT COALESCE(MAX(pivlog.last_update_date), DATE '2014-09-01')
          FROM piv_verification_log pivlog
        )
      )
      LOOP
        -- do something useful with the data fetched from the cursor
      END LOOP;
    END SOME_PROC;
    /
    

    当然,根据您从光标中获取的数据所做的事情,这可能根本不需要PL / SQL,可以在纯SQL中完成 .

  • 1

    在第一个BEGIN之前,您不能拥有可执行代码 . 如果你发布了你的程序的所有代码,这将有所帮助,但鉴于上面可以看到它,我认为你的程序应该是这样的:

    CREATE OR REPLACE PROCEDURE SOME_PROC AS
      l_max_update_date  DATE := NULL;  -- not really needed - variables are
                                        -- initialized to NULL if no other
                                        -- initial value is given.
    
      CURSOR affected_employees_cursor IS
        SELECT    [columns]
        FROM      [tables]
        WHERE LAST_UPDATE_DATE > l_max_update_date;
    
      rowAffected_employee affected_employees_cursor%ROWTYPE;
    BEGIN
      BEGIN
        SELECT max(pivlog.last_update_date) as maxdate
          into l_max_update_date
          FROM piv_verification_log pivlog;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          l_max_update_date := NULL;
      END;
    
      --No data in log table?  Create a max_update_date
      IF l_max_update_date IS NULL THEN
        l_max_update_date := TO_DATE('2014/SEP/1 00:00:00', 'YYYY/MON/DD HH24:MI:SS');
      END IF;      
    
      OPEN affected_employees_cursor;
    
      LOOP
        FETCH affected_employees_cursor
          INTO rowAffected_employee;
        EXIT WHEN affected_employees_cursor%NOTFOUND;
    
        -- do something useful with the data fetched from the cursor
      END LOOP;
    
      CLOSE affected_employees_cursor;
    END SOME_PROC;
    

    分享和享受 .

相关问题