2015-06-01 27 views
2

我想通过终端执行一个pl/sql脚本,但我无法设法让它工作。它首先检查用户是否存在,如果他确实存在,那么它从该用户的某个表中复制数据。执行匿名块PlSQL失败

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

这就是:

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存在(用户不)脚本实际上不会去那里。

回答

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; 
/