sorry pak...rada2 londo dikit :) it seems couldnot using array.... one more case is the data type should match during DML by execute immediate....
l_str3 := ' l_str_var2(1),l_str_var2(2),l_ str_var2(3),l_str_var2(4),l_str_var2(5),l_str_var2(6),l_str_var2(7),l_str_var2(8)'; execute immediate l_str2 using l_str3; UPDATE emp SET ename =:b1 ,hiredate =:b2 ,sal =:b3 WHERE empno =:b4 AND deptno = :b5 AND job =:b6 AND ENAME =:b7 AND SAL =:b8 using l_str_var2(1),l_str_var2(2),l_str_var2(3),l_str_var2(4),l_str_var2(5),l_str_var2 (6),l_str_var2(7),l_str_var2(8) declare * ERROR at line 1: ORA-01008: not all variables bound ORA-06512: at line 85 this code works, but it should be hardcoded after 'USING'.... when all the string l_str_201 till l_str208 bound to a variable... got complains that missing expressions.... execute immediate l_str2 using l_str201,l_str202,l_str203,l_str204,l_str205,l_str206,l_str207,l_str208; UPDATE emp SET ename =:b1 ,hiredate =:b2 ,sal =:b3 WHERE empno =:b4 AND deptno = :b5 AND job =:b6 AND ENAME =:b7 AND SAL =:b8 using l_str201,l_str202,l_str203,l_str204,l_str205,l_str206,l_str207,l_str208 PL/SQL procedure successfully completed. 2010/3/4 yulius_wibowo <[email protected]> > > > > 1. Pada nilai parameter yg dimasukkan, seharusnya utk nilai character > digunakan tanda petik (') > Jadi pada ['UPDATE emp SET ename = xxx ,hiredate = SYSDATE ,sal = 100 WHERE > empno = 7934 AND deptno IN(10,20) AND job = CLERK AND ENAME = MILLER AND > SAL= 1300'] > seharusnya ['UPDATE emp SET ename = xxx ,hiredate = SYSDATE ,sal = 100 > WHERE empno = 7934 AND deptno IN(10,20) AND job = ''CLERK'' AND ENAME = > ''MILLER'' AND SAL= 1300'] > > 2. Utk nilai setelah USING, masukkan nilainya ke dalam varray terlebih dulu > (extendable array, pada penambahan ":bxxx"), > kemudian nantinya di LOOP dan dimasukkan ke dalam sebuah variable (mis: > v_using .Di concat dgn menggunakan tanda koma (,)), > setelah itu dimasukkan ke dalam EXECUTE IMMEDIATE ... USING v_using > > cmiiw, > Bowo > > > --- In [email protected] <indo-oracle%40yahoogroups.com>, > "ora...@..." <ora...@...> wrote: > > > > mungkin ada yg bisa bantu, potongan kode ini untuk parsing suatu text > > sebagai parameter procedure. > > ini dalam case dimana aplikasi sudah give up dgn bind variable :) > > > > sehingga mau diakali yg melakukan bind dari sisi oracle dgn procedure, > namun > > demikian text parameter nantinya dinamis, so 1 prosedur ini untuk semua > > query baik select maupun dml. > > > > code di bawah ini sudah bekerja dgn baik, tapi sayangnya masih harus > > hardcode dalam sintaks execute immediate setelah keyword USING :) > > > > jika dipaksa array yg dimasukan kedalam USING, ada masalah pula dgn > > perbedaan variable dalam runtime nantinya.... duhhhhh > > > > mungkin pak bowo mau ngasih pencerahan? :) > > > > > > set serveroutput on > > declare > > type str_var2 is varray(100) of varchar2(100); > > l_str_var2 str_var2 := str_var2(); > > cursor c1 is SELECT EXTRACTVALUE(xt.column_value,' > > e') str > > FROM TABLE(XMLSEQUENCE > > ( EXTRACT > > ( XMLTYPE('<coll><e>' || > > REPLACE('UPDATE emp SET ename = xxx ,hiredate = SYSDATE ,sal = 100 WHERE > > empno = 7934 AND deptno IN(10,20) AND job = CLERK AND ENAME = MILLER AND > SAL > > = 1300',' ','</e><e>') || > > '</e></coll>'), '/coll/e') )) xt; > > l_str1 varchar2(4000); > > l_str2 varchar2(4000); > > l_str3 varchar2(4000); > > l_str201 varchar2(400); > > l_str202 date := sysdate; > > l_str203 varchar2(400); > > l_str204 varchar2(400); > > l_str205 number; > > l_str206 varchar2(400); > > l_str207 varchar2(400); > > l_str208 varchar2(400); > > l_dummy pls_integer; > > l_flag pls_integer; > > n pls_integer; > > m pls_integer; > > p_rowid varchar2(100); > > begin > > n := 1; > > l_flag := 0; > > open c1; > > loop > > fetch c1 into l_str3; > > exit when c1%notfound; > > if l_flag = 1 then > > l_str_var2.extend(n); > > l_str_var2(n) := l_str3; > > l_str2 := l_str2||':b'||n; > > n := n+1; > > l_flag :=0; > > goto next_loop; > > end if; > > > > if trim(l_str3) = '=' or trim(substr(l_str3,1,3)) ='IN(' then > > l_flag := 1; > > end if; > > > > if trim(substr(l_str3,1,3)) ='IN(' then > > l_flag := 2; > > m := length(l_str3)-2; > > l_str_var2(n) := substr(l_str3,4,m-2); > > -- l_str2 := l_str2||' IN(:b'||n||')'; > > l_str2 := l_str2||' = :b'||n; > > l_flag := 0; > > n := n+1; > > goto next_loop; > > end if; > > > > l_str2 := l_str2 ||' '|| l_str3; > > > > <<next_loop>> > > l_dummy :=0; > > end loop; > > close c1; > > > > l_str201 := l_str_var2(1); > > l_str203 := l_str_var2(3); > > l_str204 := l_str_var2(4); > > l_str205 := substr(l_str_var2(5),1,2); > > l_str206 := l_str_var2(6); > > l_str207 := l_str_var2(7); > > l_str208 := l_str_var2(8); > > l_str3 := ' > > l_str201,l_str202,l_str203,l_str204,l_str205,l_str206,l_str207,l_str208'; > > > > dbms_output.put_line(l_str2 ||' using '||l_str3); > > execute immediate l_str2 using > > l_str201,l_str202,l_str203,l_str204,l_str205,l_str206,l_str207,l_str208; > > end; > > / > > > > > > [Non-text portions of this message have been removed] > > > > > -- thanks and regards ujang | oracle dba | mysql dba jakarta - indonesia [Non-text portions of this message have been removed] ------------------------------------ -- -----------I.N.D.O - O.R.A.C.L.E--------------- Keluar: [email protected] Website: http://indooracle.wordpress.com http://www.facebook.com/group.php?gid=51973053515 ----------------------------------------------- Bergabung dengan Indonesia Thin Client User Groups, Terminal Server, Citrix, New Moon Caneveral, di: http://indo-thin.blogspot.comYahoo! Groups Links <*> To visit your group on the web, go to: http://groups.yahoo.com/group/indo-oracle/ <*> Your email settings: Individual Email | Traditional <*> To change settings online go to: http://groups.yahoo.com/group/indo-oracle/join (Yahoo! ID required) <*> To change settings via email: [email protected] [email protected] <*> To unsubscribe from this group, send an email to: [email protected] <*> Your use of Yahoo! Groups is subject to: http://docs.yahoo.com/info/terms/

