pl/sql de sessions kontrolü
Merhaba
Pl/Sql ile program geliştirdiğmiz her bir program bir session(oturum) üzerinde çalışır. Bazen program yeni bir session üzerinde işlemine devam eder bazen de bulunduğu session üzerinde lock sebebi ile beklemeye başlar. Yağtığımız işlemlerde ihtiyaç olması durumunda session üzerindeki bazı alanlara veri ataması da(bu işlemi ayrı bir makale olarak anlatacağıım) yapabiliriz. Bu gibi durumlarda işlem yatığımız session üzerinde bizim programın durumu nedir, lock var mı, atadığımız değerler nedir gibi sorular olacaktır. İşte bu sebeple pl/sql de var olan sessions bilgilerinin bulunduğu view ile hazırlanan bir sql yardımı sayesinde işlemlerimizi kontrol edebiliriz. v$session ve gv$session bu viewler session bilgierini barındırır.
v$session database üzerinde login olduğumuz partition içindeki session bilgierini bize verir. Fakat çalıştığımız database rac bir yapıda ise diğer partition üzerindeki session bilgilerine v$session ile ulaşamayız. Bu durumda ise gv$session view ini kullanarak rac sistemdeki tüm partitionların session bilgierini görebiliriz. Artık hangi ortamda nasıl bir session view ini kullanacağımızı öğrendiğimize göre hazırladığım pratik sql yardımı ile istediğimiz kontrolümüzü yapabiliriz. Aşağıdaki sqllerini ihtiyaç doğrultusunda istediğiniz gibi değiştirebilirsiniz.
[Login olunan partitiondaki sessions bilgileri]
select vs.sid, vs.osuser, vs.machine, vs.terminal, vs.program, vs.module, vs.action, vs.client_info, vs.lockwait, vs.final_blocking_session, 'alter system kill session ' || '''' || vs.sid || ',' || vs.serial# || ''';' session_kill from v$session vs where vs.username = 'SMT';
[Rac olan sistemlerdeki tüm partitionların sessions bilgileri]
select gvs.sid, gvs.osuser, gvs.machine, gvs.terminal, gvs.program, gvs.module, gvs.action, gvs.client_info, gvs.lockwait, gvs.final_blocking_session, 'alter system kill session ' || '''' || gvs.sid || ',' || gvs.serial# || ''';' session_kill from gv$session gvs where gvs.username = 'SMT';
Bu sqllerde ençok işimize yarayacak noktalardan birkaçı;
- SID: Her bir sessionun uniqe olarak sahip olduğu session id bilgisidir.
- MODULE: Bu alanlar sistem tarafından doldurulur.Fakat bizde bu alanlara veri atayıp kullanabiliriz.
- ACTION: Bu alanlar sistem tarafından doldurulur.Fakat bizde bu alanlara veri atayıp kullanabiliriz.
- CLIENT_INFO: İlgili session bilgisinin hangi client tarafından oluşturulduğu bilgisidir.
- LOCKWAIT: İşlem yapılan session üzerinde lock var ise hangi lock bilgisini beklediğini gösterir
- FINAL_BLOCKING_SESSION: İşlem yapılan session üzerinde oluşan lock kim tarafından oluşturulduğunu sid olarak bize verir.
- SESSION_KILL:Bu satır sqllerde görüldüğü üzere ihtiyaç anında ilgili sessionu kill etmek için ihtiyacımız olan komut bilgisini barındırır.
Yukarıdaki sqller yardımı ile herhangi bir editör üzerinden session bilgisine bakmaya gerek olmadan istediğiniz değeri sql sonucundan görebilirsiniz.
Kolay gelsin.
selected two variables that control whether the program from a fixed start and end
Hi;
This is my first English post.Sometimes we need a program for check the anything.Someday such a program was needed and I and my friend wrote this program.This program is checking the numbers between two numbers.If the number is between the start and end points of the two variables is terminating the process.If two values are given, but processing continues in the start and end values.
The syntax of program below.I hope it will be useful.
DECLARE begin_number NUMBER := 8; --first number for time line end_number NUMBER := 20; --last number for time line variable_number1 NUMBER := 22; --first variable for time line variable_number2 NUMBER := 5; --last variable for time line break NUMBER := 0; -- value:1 break,value:0 continue BEGIN --/*Condition 1*/ IF variable_number1 < begin_number AND variable_number2 < end_number THEN IF variable_number1 < begin_number AND variable_number2 > begin_number THEN break := 1; END IF; END IF; --/*Condition 2*/ IF variable_number1 < begin_number AND variable_number2 > end_number THEN break := 1; END IF; --/*Condition 3*/ IF variable_number1 > begin_number AND variable_number2 > end_number THEN IF variable_number1 < end_number AND variable_number2 > end_number THEN break := 1; END IF; END IF; --/*Condition 4*/ IF variable_number1 > begin_number AND variable_number2 < end_number THEN IF variable_number1 > end_number AND variable_number2 < begin_number THEN break := 0; ELSE IF variable_number1 = end_number AND variable_number2 < begin_number THEN break := 0; ELSE IF variable_number1 = end_number AND variable_number2 = begin_number THEN break := 0; ELSE IF variable_number1 > end_number AND variable_number2 = begin_number THEN break := 0; ELSE break := 1; END IF; END IF; END IF; END IF; END IF; --/*Condition 5*/ IF variable_number1 = begin_number AND variable_number2 = end_number THEN break := 1; END IF; --/*Condition 6*/ IF variable_number1 > begin_number AND variable_number2 = end_number THEN break := 1; END IF; --/*Condition 7*/ IF variable_number1 = begin_number AND variable_number2 < end_number THEN break := 1; END IF; --/*Condition 8*/ IF variable_number1 < begin_number AND variable_number2 = end_number THEN break := 1; END IF; --/*Condition 9*/ IF variable_number1 = begin_number AND variable_number2 > end_number THEN break := 1; END IF; IF nvl(break, 0) = 1 THEN dbms_output.put_line('Result=' || break || ' Break the program.'); ELSE dbms_output.put_line('Result=' || break || ' Continue the program.'); END IF; END;
Note:Please let me know if you have an error in my article.