Неуспешно изпълнение на анонимен блок PlSQL

Искам да изпълня 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, защото макар тя наистина да не съществува (потребителят не съществува), скриптът всъщност няма да отиде там.


person PlsqlNo    schedule 01.06.2015    source източник


Отговори (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;
/
person Tony Andrews    schedule 01.06.2015