我想通过终端执行 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/