日期:2014-05-17 浏览次数:21227 次
-- 就1楼的思想效率最高,又不会出错! -- 给你个例子: CREATE OR REPLACE PROCEDURE sp_resource2_in_proc ( v_province_id IN VARCHAR2, v_mobiletype IN VARCHAR2, v_productid IN VARCHAR2, v_goodsname IN VARCHAR2, v_spname IN VARCHAR2, v_messagecode IN VARCHAR2, v_content IN VARCHAR2, v_recontent IN VARCHAR2, v_percharge IN NUMBER, v_sendtimes IN NUMBER, v_ishide IN NUMBER, v_paytype IN NUMBER ) IS sqlstr1 VARCHAR2(4000); sqlstr2 VARCHAR2(4000); sqlstr3 VARCHAR2(4000); v_sub_goodsname VARCHAR2(20); v_goodsname_str VARCHAR2(4000); v_dot_var NUMBER(18,0); v_spid NUMBER(18,0); v_province_id2 VARCHAR2(1000); BEGIN v_province_id2 := replace(v_province_id,',',''','''); v_goodsname_str := v_goodsname||','; select sp_chargeBusiness_seq.nextval into v_spid from dual; Insert into sp_chargebusiness(spid, spname,MESSAGECODE,CONTENT,RECONTENT,PERCHARGE) values(v_spid,v_spname,v_messagecode,v_content,v_recontent,v_percharge); sqlstr1 := 'Insert into sp_resource2(countryid,province_id,area_id,mobile_type, productid,goodsname,spid,sendtimes,ishide,paytype)'; sqlstr1 := sqlstr1||' SELECT DISTINCT m.countryid, m.province_id, m.area_id, m.mobile_type, '''||v_productid||''''; sqlstr2 := to_char(v_spid)||', '||to_char(v_sendtimes)||','||to_char(v_ishide)||', '||to_char(v_paytype)||' FROM mobileareamap m '; sqlstr2 := sqlstr2||' WHERE m.province_id in ('''||v_province_id2||''')'; sqlstr2 := sqlstr2||' AND m.mobile_type in ('||v_mobiletype||') '; while length(v_goodsname_str)>1 loop v_dot_var := instr(v_goodsname_str,',',1,1); v_sub_goodsname := substr(v_goodsname_str,1,v_dot_var-1); v_goodsname_str := substr(v_goodsname_str,v_dot_var+1,length(v_goodsname_str)-v_dot_var); sqlstr3 := sqlstr1||','''||v_sub_goodsname||''','||sqlstr2; execute immediate sqlstr3; end loop; COMMIT; END sp_resource2_in_proc; /
------解决方案--------------------
控制对程序当前变量值的访问
------解决方案--------------------
SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。 nbsp; ; IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。 @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。 SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。 例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。 假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。 @@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。 SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是