执行匿名块PlSQL失败

时间:2015-06-01 09:58:50

标签: sql oracle plsql sqlplus

我想通过终端执行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中不存在,因为虽然它确实不存在(用户没有),但脚本实际上并不存在。

1 个答案:

答案 0 :(得分:3)

您需要为插入使用动态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;
/