oracle 存储过程中的循环块未执行

zengzsys  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(205)

我创建了以下PL/SQL过程:

CREATE OR REPLACE PROCEDURE "REF_COPY_DB"()
AS
   concept varchar2(10000);
BEGIN
    dbms_output.put_line('hello test 1');
    FOR concept IN (
        SELECT
            table_name
        FROM
            all_tables
        WHERE
                owner = 'WLCR_DEV08'
            AND table_name LIKE '%_REF'
            AND table_name IN (
'CURRENCY_ROLE_WS_REF')
  
    ) LOOP
       
        dbms_output.put_line('hello test 2'); -- not getting printed
       
    END LOOP;
END;
/

并使用以下语句执行它:call ref_copy_db()
我在script output-〉hello test 1 call completeddbms output窗口-〉hello test 1下看到以下内容
WLCR_DEV02数据库调用该过程。hello test 2没有被打印。不知道为什么会发生这种情况。因为我在WLCR_DEV02上运行了内部语句

SELECT
                table_name
            FROM
                all_tables
            WHERE
                    owner = 'WLCR_DEV08'
                AND table_name LIKE '%_REF'
                AND table_name IN (
    'CURRENCY_ROLE_WS_REF')

脚本输出窗口将打印出以下内容:
表名
----------------------------------------------------------------------
货币角色WS参考
这意味着循环有数据要迭代,但由于某种原因,它没有进入循环块,可能是因为DBMS输出行没有被打印出来。
这可能是什么原因呢?有什么办法来调试它吗?

ijnw1ujt

ijnw1ujt1#

您可以通过检查过程中有多少行匹配来开始调试问题:

CREATE OR REPLACE PROCEDURE "REF_COPY_DB"()
AS
  v_count PLS_INTEGER;
BEGIN
  dbms_output.put_line('hello test 1');

  SELECT COUNT(*)
  INTO   v_count
  FROM   all_tables
  WHERE  owner = 'WLCR_DEV08'
  AND    table_name LIKE '%_REF'
  AND    table_name IN ('CURRENCY_ROLE_WS_REF');

  dbms_output.put_line(v_count);
END;
/

如果你发现你得到0行或一个异常,那么你可以更深入地研究。

  • 运行该过程的用户是否有权访问ALL_TABLES视图?
  • 正如@markalex所提到的,WLCR_DEV08用户是否只能通过授予的角色访问ALL_TABLES视图?在这种情况下,过程将没有访问权限,因为它不会应用来自角色的权限。
  • 是否有人创建了WLCR_DEV08用户拥有的ALL_TABLES表或视图来隐藏SYS.ALL_TABLES视图?在这种情况下,请尝试SELECT ... FROM SYS.ALL_TABLES ...
  • SQL是否在字符串字面量中包含不可见的字符,从而阻止过滤器进行匹配?
  • 等等

相关问题