sql - 执行匿名 block PlSQL 失败

标签 sql oracle plsql sqlplus

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

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

这里是:

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 行不存在因为虽然它确实不存在(用户不存在),但脚本实际上不会去那里。

最佳答案

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

关于sql - 执行匿名 block PlSQL 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30570537/

相关文章:

c# - Dapper 参数化查询导致问题的字符串值?

sql - 在一个sql命令中从一个数据库表中选择多个计数

sql - Oracle SQLPlus : How to display the output of a sqlplus command without having to first issue the spool off command?

sql - 同时更新父子表

oracle - 使用 dbms_scheduler 运行作业的 PLSQL block 收集 30 个模式的统计信息

mysql - 如何让 mysql 查询这种情况

sql - 将 ASPNETDB.mdf 上传到共享主机?

sql - postgres 中是否有任何等效的 sp_help

sql - 在 Oracle 中使用计数作为条件

java.sql.SQLException : Invalid argument(s) in call: Use setNull for user-defined types and REF types