在存储过程中:1。p_sql varchar2(1000);
2。p_sql := 'insert into ' || p_TABLE ||
'(ID,NAME,SEQ,FLAG)VALUES (:1,:2 , :3 , :4 )';
3. execute immediate p_sql
using p_ID, p_NAME, p_SEQ, p_FLAG;这都没问题。
我想在第2步 使用using 把p_sql 拼接完整,但是一直搜不到具体的用法。
2。p_sql := 'insert into ' || p_TABLE ||
'(ID,NAME,SEQ,FLAG)VALUES (:1,:2 , :3 , :4 )';
3. execute immediate p_sql
using p_ID, p_NAME, p_SEQ, p_FLAG;这都没问题。
我想在第2步 使用using 把p_sql 拼接完整,但是一直搜不到具体的用法。
另外还有N多的限制,就不说了
using一般只能代替有确切SQL类型的变量,字面量,复杂表达式等。
其实我的目的是想得到execute immediate 执行的具体SQL语句。
另外问个问题,按照我这种在存储过程中使用动态SQL的方法,效率会不会有什么大的问题?
使用动态的 我觉得效率要高些
declare
v_id number:=2;
v_name varchar2(10):='bb';
p_seq number:=3;
p_flag number:=4;
begin
insert into testtest values(v_id,v_name,p_seq,p_flag);
commit;
end;上面的变量假设是外界传入的,那么SQL完全能使用绑定变量,达到一次硬分析,以后全是软分析的目的。如果不相信可以用sql_trace跑一下,因为PLSQL中的变量是自动会转为绑定变量的。动态SQL或动态PLSQL幸好还有个绑定变量的using或dbms_sql.bin..使用,否则性能肯定很差。当然DDL就无所谓绑定变量了,因为总是硬分析,你动态SQL DDL也无法使用绑定变量using的,会报错。
对绑定变量的详细了解,可以参考tom的oracle高效设计以及其他相关书