sql >> Databáze >  >> RDS >> Oracle

Oracle - kurzor používající příkaz dbms_utility.exec_ddl_statement se nespouští správně

DBMS_UTILITY.EXEC_DDL_STATEMENT spolehlivě spouští pouze DDL. Pokud se jej pokusíte spustit s blokem PL/SQL, tiše selže a nespustí nic.

To lze demonstrovat spuštěním bloku PL/SQL, který by měl zjevně selhat. Níže uvedený kód měl by vygenerovat ORA-01476:dělitel je roven nule . Ale místo toho nedělá nic.

begin
    dbms_utility.exec_ddl_statement@myself(
        q'[declare v_test number; begin v_test := 1/0; end;]'
    );
end;
/

Ke vzdálenému spuštění bloku PL/SQL použijte dočasnou proceduru. Vytvořte proceduru pomocí DBMS_UTILITY.EXEC_DDL_STATEMENT a poté jej zavolejte pomocí nativního dynamického SQL.

begin
    dbms_utility.exec_ddl_statement@myself(
        q'[
            create or replace procedure test_procedure
            is
                v_test number;
            begin
                v_test := 1/0;
            end;
        ]'
    );
    execute immediate 'begin test_procedure@myself; end;';
end;
/

RESULTS:

ORA-01476: divisor is equal to zero
ORA-06512: at "JHELLER.TEST_PROCEDURE", line 5
ORA-06512: at line 1
ORA-06512: at line 12
( q'[ vytvořit nebo nahradit proceduru testovací_procedura je číslo v_testu; begin v_test :=1/0; konec; ]' ); spustit okamžitě 'begin test_procedure@myselftest_procedure@myself
test_procedure@myselfdbms_utility.exec_ddl_statement@#DB_NAME#
            (
                q'<
                    create or replace procedure cw_drop_table is
                        sql_drop varchar2(2000);
                    begin
                        sql_drop :=
                        q'{
                            BEGIN
                                EXECUTE IMMEDIATE 'DROP TABLE iSecurity2_dupes_bak';
                            EXCEPTION WHEN OTHERS THEN
                                IF SQLCODE != -942 THEN
                                    NULL;
                                END IF;
                            END;
                        }';
                        execute immediate sql_drop;
                    end;
                >'
            );
            execute immediate 'begin cw_drop_table@#DB_NAME#; end;';
        end;
    ]', '#DB_NAME#', v_db_name);

    sql_update := 'create table iSecurity2_dupes_bak as select * from iSecurity2';
    execute immediate 'begin dbms_utility.exec_ddl_statement@'||v_db_name||
        '(:sql_update);  end;' using sql_update;
    commit;
end;
/



  1. Porovnání data MySQL

  2. připojte mysql k postgresql

  3. Jak vložit záznamy do proměnných z cte v oracle?

  4. Problém s vytvářením souboru .MDF ze sady Visual Studio 2010