createorreplaceprocedure proc_test ( table_name invarchar2, --表名 field1 invarchar2, --字段名 datatype1 invarchar2, --字段类型 field2 invarchar2, --字段名 datatype2 invarchar2--字段类型 ) as str_sql varchar2(500); begin str_sql:='create table'||''||table_name||'('||field1||''||datatype1||','||field2||''||datatype2||')'; execute immediate str_sql; --动态执行DDL语句 exception when others then null; end;
以上是编译通过的存储过程代码。下面执行存储过程动态建表。
SQL>execute proc_test('dinya_test','id','number(8) not null','name','varchar2(100)'); PL/SQL procedure successfully completed SQL>desc dinya_test; Name Type Nullable Default Comments ---- ------------- -------- ------- -------- ID NUMBER(8) NAME VARCHAR2(100) Y SQL>
createorreplaceprocedure proc_insert ( id innumber, --输入序号 name invarchar2--输入姓名 ) as str_sql varchar2(500); begin str_sql:='insert into dinya_test values(:1,:2)'; execute immediate str_sql using id,name; --动态执行插入操作 exception when others then null; end;
执行存储过程,插入数据到测试表中。
SQL>execute proc_insert(1,'dinya'); PL/SQL procedure successfully completed SQL>select*from dinya_test; ID NAME 1 dinya
在上例中,本地动态SQL执行DML语句时使用了using子句,按顺序将输入的值绑定到变量,如果需要输出参数,可以在执行动态SQL的时候,使用RETURNING INTO 子句,如:
declare p_id number:=1; v_count number; begin v_string:='select count(*) from table_name a where a.id=:id'; execute immediate v_string returning into v_count using p_id; end;
SQL>execute proc_dbms_sql('dinya_test2','id','number(8) not null','name','varchar2(100)'); PL/SQL procedure successfully completed SQL>desc dinya_test2; Name Type Nullable Default Comments ---- ------------- -------- ------- -------- ID NUMBER(8) NAME VARCHAR2(100) Y SQL>
2、使用DBMS_SQL包执行DML语句
需求:使用DBMS_SQL包根据用户输入的值更新表中相对应的记录。
查看表中已有记录:
SQL>select*from dinya_test2; ID NAME 1 Oracle 2 优快云 3 ERP SQL>
建存储过程,并编译通过:
createorreplaceprocedure proc_dbms_sql_update ( id number, name varchar2 )as v_cursor number; --定义光标 v_string varchar2(200); --字符串变量 v_row number; --行数 begin v_cursor:=dbms_sql.open_cursor; --为处理打开光标 v_string:='update dinya_test2 a set a.name=:p_name where a.id=:p_id'; dbms_sql.parse(v_cursor,v_string,dbms_sql.native); --分析语句 dbms_sql.bind_variable(v_cursor,':p_name',name); --绑定变量 dbms_sql.bind_variable(v_cursor,':p_id',id); --绑定变量 v_row:=dbms_sql.execute(v_cursor); --执行动态SQL dbms_sql.close_cursor(v_cursor); --关闭光标 exception when others then dbms_sql.close_cursor(v_cursor); --关闭光标 raise; end;
执行过程,根据用户输入的参数更新表中的数据:
SQL>execute proc_dbms_sql_update(2,'csdn_dinya'); PL/SQL procedure successfully completed SQL>select*from dinya_test2; ID NAME 1 Oracle 2 csdn_dinya 3 ERP SQL>