动态SQL:不是在Designer Time写的SQL, 而是可以在运行时临时拼接起来的SQL语句;
动态SQL可以使用Oracle 内置包 DBMS_SQL 来执行,也可以使用EXECUTE IMMEDIATE 语句来执行:
用dbms——sql执行的例子:
CREATE OR REPLACE PROCEDURE delete_all_rows (p_tab_name IN VARCHAR2, p_rows_del OUT NUMBER) IS
cursor_name INTEGER;
BEGIN cursor_name := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_name, 'DELETE FROM '||p_tab_name,
DBMS_SQL.NATIVE ); p_rows_del := DBMS_SQL.EXECUTE (cursor_name);
DBMS_SQL.CLOSE_CURSOR(cursor_name);
END;
用execute immediate执行的例子:
CREATE PROCEDURE del_rows (p_table_name IN VARCHAR2, p_rows_deld OUT NUMBER) IS
BEGIN EXECUTE IMMEDIATE 'delete from '||p_table_name;
p_rows_deld := SQL%ROWCOUNT;
END;
另外,在存储过程中新建的表,比如是table_a,如果想要在其中进行操作的话,因为在创建存储过程的时候,表还不存在,所以就会报错。过程就会显示有编译错误,因为table_a不存在必然导致过程无法执行,所以无法编译成功,而把insert into语句加如到 execute immediate之后 则oracle不会再去理会这个对象是否存在,因此可以成功编译和执行。