【问题标题】:Executing anonymous block PlSQL fail执行匿名块 PlSQL 失败
【发布时间】:2015-06-01 09:58:49
【问题描述】:

我想通过终端执行一个 pl/sql 脚本,但我无法让它工作。它首先检查用户是否存在,如果存在,则从该用户的某个表中复制数据。

当没有用户时出现问题 - 脚本不起作用,因为它说表或视图不存在,这意味着它以某种方式预编译它,而我希望它逐行执行。

这里是:

DECLARE
    v_count INTEGER := 0;
BEGIN
    SELECT COUNT (1) INTO v_count FROM SYS.DBA_USERS WHERE username = UPPER ('B');

    if v_count = 0 then
        DBMS_OUTPUT.put_line ('Fail');
    else
        insert into A.some_table (some_column)
            select some_column from B.some_table
                where some_column = "x";
    end if;
END;
/

它会在select some_column from B.some_table 行抛出表不存在的错误,因为虽然它确实不存在(用户不存在),但脚本实际上不会去那里。

【问题讨论】:

    标签: sql oracle plsql sqlplus


    【解决方案1】:

    您需要使用动态 PL/SQL 进行插入,以便在编译时不验证,而仅在运行时验证:

    DECLARE
        v_count INTEGER := 0;
    BEGIN
        SELECT COUNT (1) INTO v_count FROM SYS.DBA_USERS WHERE username = UPPER ('B');
    
        if v_count = 0 then
            DBMS_OUTPUT.put_line ('Fail');
        else
            EXECUTE IMMEDIATE
            'insert into A.some_table (some_column)
                select some_column from B.some_table
                    where some_column = ''x''';
        end if;
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 2014-11-28
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多