My Blog was migrated to http://sungur.wordpress.com
If redirection is not working, click here
Blogum Wordpress tasindi : http://sungur.wordpress.com
Yönlendirme çalışmaz ise : Buradan Ulasabilirsiniz.
1 Mart 2009 Pazar
19 Ekim 2008 Pazar
Oracle Apex 3.1 Sunumu
18 Ekimde, OracleTURK grubuna, Oracle Akademi sponsorluğunda, Kadıköy Bireysel Eğitim Merkezinde gerçekleştirmiş olduğum, Oracle Application Express v3.1 sunumu ve workshop esnasında gösterdiğim bazı özelliklere ait kodlar için tıklayın.
For english:
I present the Oracle Application Express v3.1 to OracleTurk Group, at Kadıköy Bireysel Eğitim Merkezi, sponsored by Oracle Turkiye Akademi. To access this presentation click here.
For english:
I present the Oracle Application Express v3.1 to OracleTurk Group, at Kadıköy Bireysel Eğitim Merkezi, sponsored by Oracle Turkiye Akademi. To access this presentation click here.
26 Eylül 2008 Cuma
Asynchronous Ajax in Apex
We use Ajax for rapid query processing without submitting page. In apex, you can build ajax within your pages. For this purposes, we use "Application Process" under the Shared Components.
Sometimes, Application Process can not response rapidly. For example, if you query a count from very large table, it takes for minutes or hours. If you put a text field for table name and if user can query number of records of input big table, also if you perform this operation with ajax in apex as synchronously, the BROWSER will freeze and consumes %100 cpu time. Everything will go bad.
In this situation, you have to use "Asynchronous Ajax" opposite of Synchoronous, so you can more than one job on same time. To perform this, give an eye to this example:
Firstly, you can build your ajax javascript :
This code is used to connect your apex page with your application process. ( By the way, Application Processes are need to created as On Demand ). In normally, synchronous method, you call get() method of ajaxRequest object. Pay attention to this, in asynchronous method, you need to call GetAsync() method by passing an Object. What is the f_AsyncReturn ? :
If you coded ajax in other languages such as php,jsp; probably you coded as above. There are 4 states to deal with ajax. One of them (state 1) is "Loading", one of them (state 4) is "Success". Result of ajax is written in 4. states. Before ajax Request is completed, you can write "Loading" message in first state.
The other operations are the same with Synchronous method. You need to create an Application Process, it's running time must be "On Demand" as well.
So, by performing this Asynchronous method, your browser will not be freezed. And, not consuming all of CPU time. But disadvantage of this ( may be not seemed apparently ), your job is take much time rather than synchronous method. But, it is worth!
Sometimes, Application Process can not response rapidly. For example, if you query a count from very large table, it takes for minutes or hours. If you put a text field for table name and if user can query number of records of input big table, also if you perform this operation with ajax in apex as synchronously, the BROWSER will freeze and consumes %100 cpu time. Everything will go bad.
In this situation, you have to use "Asynchronous Ajax" opposite of Synchoronous, so you can more than one job on same time. To perform this, give an eye to this example:
Firstly, you can build your ajax javascript :
function getNumberOfRecords(){
var ajaxRequest = new htmldb_Get(null,&APP_ID.,'APPLICATION_PROCESS=GetCount',0);
ajaxRequest.add('P6_TABLE_NAME',html_GetElement('P6_TABLE_NAME').value);
ajaxRequest.GetAsync(f_AsyncReturn);
ajaxRequest = null;
}
This code is used to connect your apex page with your application process. ( By the way, Application Processes are need to created as On Demand ). In normally, synchronous method, you call get() method of ajaxRequest object. Pay attention to this, in asynchronous method, you need to call GetAsync() method by passing an Object. What is the f_AsyncReturn ? :
function f_AsyncReturn(){
if(p.readyState == 1){
$x('P6_TEXTAREA').value = '';
}else if(p.readyState == 2){
}else if(p.readyState == 3){
}else if(p.readyState == 4){
$x('P6_TEXT_AREA').value = p.responseText;
// you can add other things add this area
}else{return false;}
}
If you coded ajax in other languages such as php,jsp; probably you coded as above. There are 4 states to deal with ajax. One of them (state 1) is "Loading", one of them (state 4) is "Success". Result of ajax is written in 4. states. Before ajax Request is completed, you can write "Loading" message in first state.
The other operations are the same with Synchronous method. You need to create an Application Process, it's running time must be "On Demand" as well.
So, by performing this Asynchronous method, your browser will not be freezed. And, not consuming all of CPU time. But disadvantage of this ( may be not seemed apparently ), your job is take much time rather than synchronous method. But, it is worth!
1 Eylül 2008 Pazartesi
Running DDL Statements on Remote Database
You cannot run any DDL statement on a remote databases via using our custom remote sqls.
CREATE TABLE EMP@DB1 ...
This causes an error. Instead of this you can use the Dynamic Sql to produce ddl statement to execute it when it is called.
For example, There are two DB. A_DB and B_DB. We write this function in A_DB:
When you call this procedure as "exec dyn_sql('CREATE TABLE EMP (EMPNO INTEGER)');" in B_DB database, an EMP table will be created in A_DB database.
CREATE TABLE EMP@DB1 ...
This causes an error. Instead of this you can use the Dynamic Sql to produce ddl statement to execute it when it is called.
For example, There are two DB. A_DB and B_DB. We write this function in A_DB:
CREATE OR REPLACE PROCEDURE dyn_sql( v_Sql_in VARCHAR2 )
IS
curName INTEGER;
iRet INTEGER;
BEGIN
curName := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(curName, v_sql_in, DBMS_SQL.NATIVE);
iret := DBMS_SQL.EXECUTE(curName);
DBMS_SQL.CLOSE_CURSOR(curName);
END;
When you call this procedure as "exec dyn_sql('CREATE TABLE EMP (EMPNO INTEGER)');" in B_DB database, an EMP table will be created in A_DB database.
31 Ağustos 2008 Pazar
About Returning Into Clause on Remote DB - ORA-22816
We use PL/SQL RETURNING INTO clause for returning value(s) after dml commands(INSERT,UPDATE,DELETE). Assume that you would insert row a employee table with employee_id value. Likely, you type this sql statement:
After this statement you need this employee_id to add another table. You can use RETURNING INTO clause to get employee_id value after an insert statement as follows:
After these, iEmpId variable has employee_id value.
There is no problem if you perform these on one database.
If you want to perform this between databases, likely you would get :
ORA-22816: unsupported feature with RETURNING clause
This error may be pothering and discouraging you to what do you want. We can use other tactic to perform our willings.
Assume that you have two databases A_DB, B_DB and in B_DB databases you want to add a row in Employee Table that table in A_DB. In this situation you take advantage of functions. Write a function that returns the sequence number of just added row.
Also you have add function parameter to whether the returning into is used or not. May be this sequence number is need only once and after you would use that sequence to insert employee. So, there are lots of need why you do it.
INSERT INTO TEMPLOYEES (EMP_ID,EMP_NAME) VALUES( SEQ_TEMPLOYEES.NEXTVAL,'FUAT SUNGUR');
After this statement you need this employee_id to add another table. You can use RETURNING INTO clause to get employee_id value after an insert statement as follows:
INSERT INTO TEMPLOYEES (EMP_ID,EMP_NAME) VALUES( SEQ_TEMPLOYEES.NEXTVAL,'FUAT SUNGUR') RETURNING EMP_ID INTO iEmpId;
After these, iEmpId variable has employee_id value.
There is no problem if you perform these on one database.
If you want to perform this between databases, likely you would get :
ORA-22816: unsupported feature with RETURNING clause
This error may be pothering and discouraging you to what do you want. We can use other tactic to perform our willings.
Assume that you have two databases A_DB, B_DB and in B_DB databases you want to add a row in Employee Table that table in A_DB. In this situation you take advantage of functions. Write a function that returns the sequence number of just added row.
FUNCTION INSERT_EMPLOYEE_AND_GET_SEQ(vEmpName_in IN VARCHAR2)
RETURN INTEGER
IS
iEmpId INTEGER;
BEGIN
INSERT INTO TEMPLOYEES (EMP_ID,EMP_NAME) VALUES (SEQ_TEMPLOYEES.NEXTVAL,vEmpName_in) RETURNING EMP_ID INTO iEmpId;
RETURN iEmpId;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
Also you have add function parameter to whether the returning into is used or not. May be this sequence number is need only once and after you would use that sequence to insert employee. So, there are lots of need why you do it.
10 Ağustos 2008 Pazar
Google Syntax Highlighter for PL/SQL
Google Syntax Highlighter App. provides us to show code in our blogs or other html pages. This application shows code of C,Java,Jscript,C#,SQL,XML,Ruby,Phyton. But as you predicted, Oracle PL/SQL is missing. So, i decided to develop a code to highlight our Oracle/PLSQL code. Things you have to do them are as follows :
Download shBrushPlSql.js
(This is compatible with reserver words and keywords of Oracle Latest Version )
After all of these step, now you can test your plsql code. Like this :)
- Download the Google Syntaxlighter to your pc: http://code.google.com/p/syntaxhighlighter/
- Then upload the folder that is extracted from zip file, to your server.
- For blogger, go to your template page and edit.
- After first head tag and before the closed head tag you should write some javascript code to template page.
- The template page should look alike this page :
<link type="text/css" rel="stylesheet" href="http://xxx.googlepages.com/SyntaxHighlighter.css"></link>
<script language="javascript" src="http://xxx.googlepages.com/shCore.js"></script>
<script language="javascript" src="http://xxx.googlepages.com/shPlsql.js"></script>
....
....
....
// dont modify if you dont want to change template except to show coding
....
<script language="javascript">
window.onload = function () {
dp.SyntaxHighlighter.ClipboardSwf = 'http://afsungur.googlepages.com/clipboard.swf';
dp.SyntaxHighlighter.BloggerMode();
dp.SyntaxHighlighter.HighlightAll('code');
}
</script>
-
- Then writing a post, you should write your pl sql code as follows:
<pre name="code" class="plsql">
... your pl sql code ...
</pre> -
Download shBrushPlSql.js
(This is compatible with reserver words and keywords of Oracle Latest Version )
After all of these step, now you can test your plsql code. Like this :)
CREATE OR REPLACE PACKAGE BODY PKG_RULE_CONTROL IS
-- CREATED BY A. FUAT SUNGUR
-- afsungur@gmail.com
--
--
-- Kural ile ilgili islemleri gerceklestiren pakettir
------------------------------------------------------------------------------------------
-- DBMS_SCHEDULER tarafindan cagrilacak pl sql blogunun dinamik olarak uretilmesini saglar
-- RUN_JOB prosedurune gonderilecek parametreler dinamik olarak ayarlanir.
FUNCTION PRODUCE_JOB_SQL
(
vExpr_1 VARCHAR2,
vExpr_2 VARCHAR2,
nCond_Id NUMBER,
iRuleId NUMBER
) RETURN VARCHAR2 IS
vJobSql VARCHAR2(2000);
iSqlCode INTEGER;
vSqlErrMsg VARCHAR2(250);
BEGIN
-- CHR(39) = ' ( tek tirnak )
IF (vExpr_2 IS NOT NULL)
THEN
vJobSql := 'BEGIN PKG_JOB_CONTROL.RUN_JOB(' || CHR(39) ||
vExpr_1 || CHR(39) || ',' || CHR(39) || VExpr_2 ||
CHR(39) || ',' || nCond_Id || ',' || iRuleId ||
'); END;';
ELSE
vJobSql := 'BEGIN PKG_JOB_CONTROL.RUN_JOB(' || CHR(39) ||
vExpr_1 || CHR(39) || ',NULL,' || nCond_Id || ',' ||
iRuleId || '); END;';
END IF;
RETURN vJobSql;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
INSERT INTO TERRORS
VALUES
(SEQ_TERRORS.NEXTVAL,
iSqlCode,
vSqlErrMsg,
CURRENT_TIMESTAMP,
'FUNCTION PKG_RULE_CONTROL.PRODUCE_JOB_SQL()');
COMMIT;
RETURN NULL;
END;
END;
3 Ağustos 2008 Pazar
Creating your own authentication method in Apex
With this operation, you can do your own login page instead of default apex login page.
Firstly, you need to create a package that deal with user login operations. PKG_APP_SECURITY package name is appropriate for this need.
The P_USERS table has two columns, types of both columns are varchar2 and first of them is username and second of them is password.
Secondly, you should use an authentication schema. To perform this, in Shared Components, click Authentication Schemas. Then Create Button.
1-> Click "Create Schema" Button.
2-> Write your own authentication schema name, such as "MY AUTH METHOD".
3-> Then "Create Scheme" button.
4-> After scheme is created, click your authentication schema icon in authentication schemas page.
5-> Then Login Processing tab, in "Authentication Function" textarea, type this:
"RETURN PKG_APP_SECURITY.valid_user"
6-> If this method return false in application the authentication is not successfullied.
7-> Don't forget, you should set your own authentication schema to as current used.
Last thing we need to do, edit your login page (genrally page 101). Then, in processes tab ( in page processing tab ), click login process. And, type this to process textarea in source tab:
"pkg_app_security.login (P_UNAME => :P101_USERNAME, P_PASSWORD => :P101_PASSWORD, P_SESSION_ID => v('APP_SESSION'), P_FLOW_PAGE => :APP_ID );".
After performed these 3 steps, you can use your own login page with your own user tables in Apex Applications.
Firstly, you need to create a package that deal with user login operations. PKG_APP_SECURITY package name is appropriate for this need.
CREATE OR REPLACE PACKAGE BODY PKG_APP_SECURITY
AS
PROCEDURE login
(p_uname IN VARCHAR2,
p_password IN VARCHAR2,
p_session_id IN VARCHAR2,
p_flow_page IN VARCHAR2)
IS
BEGIN
-- THIS PROVIDES AUTHENTICATION
wwv_flow_custom_auth_std.login (
p_uname => p_uname,
p_password => p_password,
p_session_id => p_session_id,
p_flow_page => p_flow_page || ':' || 1);
EXCEPTION
WHEN OTHERS
THEN RAISE;
END login;
PROCEDURE add_user (p_username IN VARCHAR2, p_password IN VARCHAR2)
AS
BEGIN
INSERT INTO P_USERS (username, PASSWORD)
VALUES (UPPER (p_username),
get_hash (TRIM (p_username), p_password));
COMMIT;
EXCEPTION
WHEN OTHERS
THEN ROLLBACK; RAISE;
END add_user;
FUNCTION get_hash (p_username IN VARCHAR2, p_password IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN DBMS_OBFUSCATION_TOOLKIT.md5 (
input_string => UPPER (p_username) || '/' || UPPER (p_password));
END get_hash;
PROCEDURE valid_user2 (p_username IN VARCHAR2, p_password IN VARCHAR2)
AS
v_dummy VARCHAR2 (1);
BEGIN
SELECT '1' INTO v_dummy
FROM P_USERS
WHERE UPPER (username) = UPPER (p_username)
AND PASSWORD = get_hash (p_username, p_password);
EXCEPTION
WHEN NO_DATA_FOUND
THEN raise_application_error (-20000, 'Invalid username / password.');
END valid_user2;
FUNCTION valid_user (p_username IN VARCHAR2, p_password IN VARCHAR2)
RETURN BOOLEAN
AS
BEGIN
valid_user2 (UPPER (p_username), p_password);
RETURN TRUE;
EXCEPTION
WHEN OTHERS
THEN RETURN FALSE;
END valid_user;
END PKG_APP_SECURITY;
The P_USERS table has two columns, types of both columns are varchar2 and first of them is username and second of them is password.
Secondly, you should use an authentication schema. To perform this, in Shared Components, click Authentication Schemas. Then Create Button.
1-> Click "Create Schema" Button.
2-> Write your own authentication schema name, such as "MY AUTH METHOD".
3-> Then "Create Scheme" button.
4-> After scheme is created, click your authentication schema icon in authentication schemas page.
5-> Then Login Processing tab, in "Authentication Function" textarea, type this:
"RETURN PKG_APP_SECURITY.valid_user"
6-> If this method return false in application the authentication is not successfullied.
7-> Don't forget, you should set your own authentication schema to as current used.
Last thing we need to do, edit your login page (genrally page 101). Then, in processes tab ( in page processing tab ), click login process. And, type this to process textarea in source tab:
"pkg_app_security.login (P_UNAME => :P101_USERNAME, P_PASSWORD => :P101_PASSWORD, P_SESSION_ID => v('APP_SESSION'), P_FLOW_PAGE => :APP_ID );".
After performed these 3 steps, you can use your own login page with your own user tables in Apex Applications.
2 Ağustos 2008 Cumartesi
Installing Application Express 3.1 on Oracle 10g 10.2.0.1.0
In installing apex on Oracle 10g 10.2.0.1.0, i was getting a XDB Login Problem. I setup apex and entering the url path of apex, then browser ask me repeatedly xdb username and password. I tried lots of things that could not solve this problem. Especially this problem take place in Oracle 10g 10.2.0.1.0. I searched lots of web pages, forum, blogs then i found the solution.
Firstly, download the apex_3.1.1.zip in Oracle Web page. Then extract this file to Oracle Home.
When you type "dir /b" or "ls -la" in Oracle Home, you should see same this :
G:\oracle\product\10.2.0\db_3>dir /b
1907-b75f9673d7_orcl
admin
apex
assistants
BIN
cdata
cfgtoollogs
clone
com
config
....
So, type "cd apex" to enter this folder. Then run sqlplus as sysdba.
And execute the @apexins (apexins.sql).
Then, to change the ADMIN user password type the @apxxepwd.
After these, you should configure the Embedded PL SQL Gateway ( if you wont use the oracle http server like me).
Type @apex_epg_config to configure the plsql gateway.
Then, unlock the ANONYMOUS user, type "ALTER USER ANONYMOUS ACCOUNT UNLOCK".
After these, now we are at the last point.
To enable XML DB HTTP SERVER :
exec dbms_xdb.sethttpport(7780);
// if you enter a port of used service, you can't run the apex.
// so do not enter the Apache Tomcat Port : 8080
If XDB username and password is questioned, you should run this command:
( I found it after lots of searching )
EXEC DBMS_EPG.authorize_dad ( dad_name => 'APEX', user => 'ANONYMOUS' );
Now, you can try to login the Apex page via typing "http://localhost:7780/apex/apex_admin".
If it asks still XDB username and password, you should read this blog and comments carefully.
http://jeffkemponoracle.blogspot.com/2007/07/apex-30-via-embedded-plsql-gateway.html
If you encounter any problem, send an email or comments.
Firstly, download the apex_3.1.1.zip in Oracle Web page. Then extract this file to Oracle Home.
When you type "dir /b" or "ls -la" in Oracle Home, you should see same this :
G:\oracle\product\10.2.0\db_3>dir /b
1907-b75f9673d7_orcl
admin
apex
assistants
BIN
cdata
cfgtoollogs
clone
com
config
....
So, type "cd apex" to enter this folder. Then run sqlplus as sysdba.
And execute the @apexins (apexins.sql).
Then, to change the ADMIN user password type the @apxxepwd.
After these, you should configure the Embedded PL SQL Gateway ( if you wont use the oracle http server like me).
Type @apex_epg_config to configure the plsql gateway.
Then, unlock the ANONYMOUS user, type "ALTER USER ANONYMOUS ACCOUNT UNLOCK".
After these, now we are at the last point.
To enable XML DB HTTP SERVER :
exec dbms_xdb.sethttpport(7780);
// if you enter a port of used service, you can't run the apex.
// so do not enter the Apache Tomcat Port : 8080
If XDB username and password is questioned, you should run this command:
( I found it after lots of searching )
EXEC DBMS_EPG.authorize_dad ( dad_name => 'APEX', user => 'ANONYMOUS' );
Now, you can try to login the Apex page via typing "http://localhost:7780/apex/apex_admin".
If it asks still XDB username and password, you should read this blog and comments carefully.
http://jeffkemponoracle.blogspot.com/2007/07/apex-30-via-embedded-plsql-gateway.html
If you encounter any problem, send an email or comments.
16 Temmuz 2008 Çarşamba
Materialized View
Oracle DW uygulamalarında sıkça rastlayabileceğimiz bir yapı olan Materialized Viewları, saklı tablo sonuçları olarak düşünebiliriz. Normal Viewlardan farkı, bir sql sorgusu olarak değil de sql sorgusu + data olarak saklanmasıdır. Yani MV diskte yer kaplar.
Peki neler yapılıyor MVlerle, milyonlarca kayıt bulunan tabloda belli sorguları önceden çalıştırıp bunun sonuçlarını saklama işlemini yapıyoruz.
Örneğin, bir satış tablomuz var, 5 milyar kaydımız var bu tabloda, 100 id'li müşterinin o günkü toplam harcamalarını öğrenmek istiyoruz. Bu öğrenme işi çok fazla kez tekrar ediliyor diyelim. 5 milyar kayıt içinde group by, sum() gibi sql özelliklerini kullanmak çok fazla kaynak kullanımına sebebiyet vereceğinden dolayı, bu işlemlerin önceden bir yerde tutulması bizim işimize yarayacaktır.
Yazının başında belirtildiği gibi, Data Warehouse sistemlerde özellikle kullanılan bir yapı, biraz real-time uygulamaların dışında gerçekleştirilebilir diyebiliriz. Örneğin salı günkü verilerden yola çıkarak, çarşamba günü rapor hazırlama işlemleri bu şekilde daha hızlı gerçekleştirilebilir. Salı akşamı sorgular çalıştırılır, MV'ler güncellenir, çarşamba günü sorgular çalıştırıldığında Ana tablo yerine bu MV'lerden ilgili bilgiler çekilmiş olur. Yani 5 milyar kayıt içinde arayacağımıza, çok daha az miktarda veri içinde arama yapmış olacağız. Bu da bizim kaynakları kullanma performansımızı arttıracak. Fakat bu durumda güncel verilerden yararlanmamış oluyoruz, sadece önceki güne ait verilerden yararlanmış oluyoruz. Bunu önleme yöntemleri de mevcut, MV'de.
MV'de bilinmesi gereken en önemli özelliklerden birisi de Query Rewriting özelliği. Bu özellik Session bazında ve MV oluştururken enable yapıldığı takdirde, MV 'in sql sorgusu çalıştırıldığında ana tablo yerine MV'den veriler çekilmiş oluyor. Şöyle ki, MV yi oluştururken "SELECT * FROM SALES" olarak oluşturduğumuz zaman, Query Rewriting özelliği enable olur ise, "SELECT * FROM SALES" sorgusu çalıştırıldığında, CBO ( Cost Based Optimizer ) bu sorgunun aslında MV'den çekilmesine karar verir ve yazılan sorguyu MV'yi işaret edecek şekilde ( örn : "SELECT * FROM MV_SALES" ) değiştirirr ve sorguyu yapan farkında olmadan MV kullanılmış olur.
Eğer bu özellik enable edilmez ise, MV'den yararlanmak için sorgu yazılırken MV direk işaret edilmelidir. "SELECT * FROM MV_SALE" gibi, aksi takdirde direk ana tablodan veriler çekilir.
Peki neler yapılıyor MVlerle, milyonlarca kayıt bulunan tabloda belli sorguları önceden çalıştırıp bunun sonuçlarını saklama işlemini yapıyoruz.
Örneğin, bir satış tablomuz var, 5 milyar kaydımız var bu tabloda, 100 id'li müşterinin o günkü toplam harcamalarını öğrenmek istiyoruz. Bu öğrenme işi çok fazla kez tekrar ediliyor diyelim. 5 milyar kayıt içinde group by, sum() gibi sql özelliklerini kullanmak çok fazla kaynak kullanımına sebebiyet vereceğinden dolayı, bu işlemlerin önceden bir yerde tutulması bizim işimize yarayacaktır.
Yazının başında belirtildiği gibi, Data Warehouse sistemlerde özellikle kullanılan bir yapı, biraz real-time uygulamaların dışında gerçekleştirilebilir diyebiliriz. Örneğin salı günkü verilerden yola çıkarak, çarşamba günü rapor hazırlama işlemleri bu şekilde daha hızlı gerçekleştirilebilir. Salı akşamı sorgular çalıştırılır, MV'ler güncellenir, çarşamba günü sorgular çalıştırıldığında Ana tablo yerine bu MV'lerden ilgili bilgiler çekilmiş olur. Yani 5 milyar kayıt içinde arayacağımıza, çok daha az miktarda veri içinde arama yapmış olacağız. Bu da bizim kaynakları kullanma performansımızı arttıracak. Fakat bu durumda güncel verilerden yararlanmamış oluyoruz, sadece önceki güne ait verilerden yararlanmış oluyoruz. Bunu önleme yöntemleri de mevcut, MV'de.
MV'de bilinmesi gereken en önemli özelliklerden birisi de Query Rewriting özelliği. Bu özellik Session bazında ve MV oluştururken enable yapıldığı takdirde, MV 'in sql sorgusu çalıştırıldığında ana tablo yerine MV'den veriler çekilmiş oluyor. Şöyle ki, MV yi oluştururken "SELECT * FROM SALES" olarak oluşturduğumuz zaman, Query Rewriting özelliği enable olur ise, "SELECT * FROM SALES" sorgusu çalıştırıldığında, CBO ( Cost Based Optimizer ) bu sorgunun aslında MV'den çekilmesine karar verir ve yazılan sorguyu MV'yi işaret edecek şekilde ( örn : "SELECT * FROM MV_SALES" ) değiştirirr ve sorguyu yapan farkında olmadan MV kullanılmış olur.
Eğer bu özellik enable edilmez ise, MV'den yararlanmak için sorgu yazılırken MV direk işaret edilmelidir. "SELECT * FROM MV_SALE" gibi, aksi takdirde direk ana tablodan veriler çekilir.
3 Temmuz 2008 Perşembe
Tablespace - Datafile Oluşturma
Oracle'da verilerimiz fiziksel olarak datafile'larda saklanır ve bu datafile'ları barındıran lojiksel olarak Tablespace adını verdiğimiz yapılar bulunur. Tablespace'ler, data fileların toplu olarak yönetimini kolaylaştırmıştır. Bir Tablespacei read only yaparak, onu içeren dosyaları da read only yapmış oluruz, hepsini teker teker yapacağımıza.
Şimdi bu tablespace oluşturma işlemini manuel olarak yapalım.
İlk olarak konsoldan bir dosya oluşturalım.
Daha sonra bu dosyaya yazma işlemlerinin gerçekleşebilmesi için:
Şimdi fuat_ts_2 adli tablespacimizi fuat_3.dbf dosyasini içerecek şekilde oluşturalım:
Kontrol etmek için:
Görüldüğü gibi fuat_3.dbf dosyası 10MB olarak oluşturuldu.
Şimdi, başka bir dosyayı var olan tablespace'e ekleme işlemini gerçekleştirelim.
Yine bir dosya oluşturalım, fuat_4.dbf diye, chmod ayarlarını yapalım,
ve sql plus 'ta su komutu yazalım:
Çok basit komutlarla datafile'larımızı ve tablespace'lerimizi oluşturmuş olduk.
Şimdi bu tablespace oluşturma işlemini manuel olarak yapalım.
İlk olarak konsoldan bir dosya oluşturalım.
root@fuat-laptop:/home/oracle/datafiles# touch fuat_3.dbf
root@fuat-laptop:/home/oracle/datafiles# ls -la
Daha sonra bu dosyaya yazma işlemlerinin gerçekleşebilmesi için:
root@fuat-laptop:/home/oracle/datafiles# chmod 777 fuat_3.dbf
Şimdi fuat_ts_2 adli tablespacimizi fuat_3.dbf dosyasini içerecek şekilde oluşturalım:
CREATE TABLESPACE FUAT_TS_1 DATAFILE '/home/oracle/datafiles/fuat_1.dbf' SIZE 10M;
Tablespace altered.
Kontrol etmek için:
root@fuat-laptop:/home/oracle/datafiles# ls -la
total 20536
drwxr-xr-x 2 root root 4096 2008-06-03 13:35 .
drwxrwxrwx 3 root root 4096 2008-06-03 10:11 ..
-rwxrwxrwx 1 root root 10493952 2008-06-03 11:49 fuat_3.dbf
...
...
...
Görüldüğü gibi fuat_3.dbf dosyası 10MB olarak oluşturuldu.
Şimdi, başka bir dosyayı var olan tablespace'e ekleme işlemini gerçekleştirelim.
Yine bir dosya oluşturalım, fuat_4.dbf diye, chmod ayarlarını yapalım,
ve sql plus 'ta su komutu yazalım:
alter tablespace fuat_ts_1 add datafile '/home/oracle/datafiles/fuat_4.dbf' SIZE 10M
Çok basit komutlarla datafile'larımızı ve tablespace'lerimizi oluşturmuş olduk.
2 Temmuz 2008 Çarşamba
Linux Üzerinde Oracle 10g XE ve Oracle SQL Developer
Merhaba, Linux'e uygulama kurmak bazı durumlarda gerçekten güç olabiliyor ( yeteri kadar bilgi sahibi değilseniz ). Çok araştırma yapmak, forumları gözden geçirmek, döküman okumak gerekiyor. Veya deneme/yanılma yöntemi ile de çözüm bulabiliyorsunuz. Aarama motorlarından arama yapıp bazılarının blogundan bunları elde etmek de mumkun oluyor.
Oracle 10g XE Linux'e kurulumu için aşağıdaki linki inceleyebilirsiniz:
http://www.oracle.com/technology/software/products/database/xe/htdocs/102xelinsoft.html
Ubuntu'ya kurulumu cok kolay, indirilecek .deb dosyasının çift tıklama ile yükleyebiliyorsunuz.
Tabi yükleme ile bitmiyor, configure etmemiz gereken bazı şeyler var. Bunun için aşağıdaki adresten yararlanabilrsiniz :
http://susedim.blogspot.com/2008/03/suse-103-zerine-oracle-xe-kurulumu.html
SQL Developer
http://www.oracle.com/technology/software/products/sql/index.html
rpm li dosyayı acma sekli linkte yazıyor. Icini acip icindeki klasoru masaustune kopyleyip, /opt/sqldeveloper/sqldeveloper.sh dosyasını çalıştırarak uygulamayı başlatabilirsiniz.
Oracle 10g XE Linux'e kurulumu için aşağıdaki linki inceleyebilirsiniz:
http://www.oracle.com/technology/software/products/database/xe/htdocs/102xelinsoft.html
Ubuntu'ya kurulumu cok kolay, indirilecek .deb dosyasının çift tıklama ile yükleyebiliyorsunuz.
Tabi yükleme ile bitmiyor, configure etmemiz gereken bazı şeyler var. Bunun için aşağıdaki adresten yararlanabilrsiniz :
http://susedim.blogspot.com/2008/03/suse-103-zerine-oracle-xe-kurulumu.html
SQL Developer
http://www.oracle.com/technology/software/products/sql/index.html
rpm li dosyayı acma sekli linkte yazıyor. Icini acip icindeki klasoru masaustune kopyleyip, /opt/sqldeveloper/sqldeveloper.sh dosyasını çalıştırarak uygulamayı başlatabilirsiniz.
26 Haziran 2008 Perşembe
Linux Shell Scripting
Windowsta yazdığımız BAT dosyalarını yani toplu işlem yapma dosyalarının benzerini Linux için de yazabiliriz. Linux Shell Scripting denilen bu işlemde programlama diline yakın bir biçimde shell programlama yapabiliyorsunuz.
İlgili tutorial için : http://www.freeos.com/guides/lsst/index.html
İlgili tutorial için : http://www.freeos.com/guides/lsst/index.html
MPI Api Kurulumu
MPi Apisinin Linux üzerinde kurulumu nasıl oluyor?
Bu apiyi, linux'e kurmak için epey uğraştım, sonunda başardım, okulda bazı arkadaşlar da benim gibi kuramayıp, okulun serverine uzaktan bağlanıp, kod derlemeye çalışmıştık.
İlk olarak buradan apiyi Linux işletim sistemine indiriyoruz. Daha sonra indirilen sıkıştırılmış dosyayı bir klasöre açıyoruz ve daha sonra terminal'den bu klasöre giriyoruz.
Terminal'e
"./configure CC=cc CXX=CC --without-fc -prefix=/directory/to/install/in" yazarak apinin configurasyonunu sağlıyoruz ( --without-fc FORTRAN uygulaması yazmayacağımızı belirtmek için ). Eğer hata çıkarsa, gcc nin yeni versiyonunun yüklenmesi gerekebilir. Bunu da "sudo apt-get install build-essential" dan yapabiliriz. Bu konfigurasyon işlemi sisteme bağlı olarak 5-10 dakika sürebilir, bu işlem bittikten sonra aynı klasörde terminale "make" daha sonra "make install" yazarak, apinin kurulmasını sağlıyoruz. Daha sonra terminale "mpicc" yazarak apinin yüklenip yüklenmediğini kontrol ediyoruz. Eğer şu şekilde bir hata alırsak :
lam4-dev package'ını yüklememiz gerekbilir. Yüklemek için "sudo apt-get install lam4-dev" yazıyoruz terminal'e. Daha sonra mpicc yi tekrar deniyoruz ve "gcc no input files" hatası alırsak apinin doğru yüklendiğini görmüş oluyoruz.
Sırada mpirun var. Terminal'e mpirun yazıp mpirun uygulamasını kontrol ediyoruz, eğer yine bulunamazsa, "sudo apt-get install lam-runtime" yazarak bu package'in yüklenmesini sağlıyoruz.
Sıra geldi apiyi çalıştırmaya, "lamboot" yazıyoruz terminale, eğer şu şekild bir çıktı alırsak :
apimiz, başarıyla kurulmuştur...
Bu apiyi, linux'e kurmak için epey uğraştım, sonunda başardım, okulda bazı arkadaşlar da benim gibi kuramayıp, okulun serverine uzaktan bağlanıp, kod derlemeye çalışmıştık.
İlk olarak buradan apiyi Linux işletim sistemine indiriyoruz. Daha sonra indirilen sıkıştırılmış dosyayı bir klasöre açıyoruz ve daha sonra terminal'den bu klasöre giriyoruz.
Terminal'e
"./configure CC=cc CXX=CC --without-fc -prefix=/directory/to/install/in" yazarak apinin configurasyonunu sağlıyoruz ( --without-fc FORTRAN uygulaması yazmayacağımızı belirtmek için ). Eğer hata çıkarsa, gcc nin yeni versiyonunun yüklenmesi gerekebilir. Bunu da "sudo apt-get install build-essential" dan yapabiliriz. Bu konfigurasyon işlemi sisteme bağlı olarak 5-10 dakika sürebilir, bu işlem bittikten sonra aynı klasörde terminale "make" daha sonra "make install" yazarak, apinin kurulmasını sağlıyoruz. Daha sonra terminale "mpicc" yazarak apinin yüklenip yüklenmediğini kontrol ediyoruz. Eğer şu şekilde bir hata alırsak :
root@fuat-laptop:/home/fuat/Desktop/lam-7.1.4# mpicc
The program 'mpicc' can be found in the following packages:
* lam4-dev
* libmpich1.0-dev
* libopenmpi-dev
* libmpich-mpd1.0-dev
* libmpich-shmem1.0-dev
Try: apt-get install
bash: mpicc: command not found
lam4-dev package'ını yüklememiz gerekbilir. Yüklemek için "sudo apt-get install lam4-dev" yazıyoruz terminal'e. Daha sonra mpicc yi tekrar deniyoruz ve "gcc no input files" hatası alırsak apinin doğru yüklendiğini görmüş oluyoruz.
Sırada mpirun var. Terminal'e mpirun yazıp mpirun uygulamasını kontrol ediyoruz, eğer yine bulunamazsa, "sudo apt-get install lam-runtime" yazarak bu package'in yüklenmesini sağlıyoruz.
Sıra geldi apiyi çalıştırmaya, "lamboot" yazıyoruz terminale, eğer şu şekild bir çıktı alırsak :
fuat@fuat-laptop:~/Desktop/lam-7.1.4/myexamples$ lamboot
LAM 7.1.2/MPI 2 C++/ROMIO - Indiana University
apimiz, başarıyla kurulmuştur...
25 Haziran 2008 Çarşamba
Linux'te Babylon Sözlük
Windows'tan aşina olduğumuz, yanımızdan ayıramadığımız bir parçadır Babylon. Şahsen, ingilizce kelime haznemi geliştirmede en faydası dokunan bir araç oldu bu uygulama. Peki bu araç sadece Windows'ta mı?
Sırf bu yüzden linux kullanmayanlar olduğunu biliyorum, şahsen benim de uzun süredir linux kullanmamamın sebeplerinden bir tanesi de buydu. Linux'te bu programı nasıl kullanacağız?
Babylon sadece Windows sürümleri için var fakat aynı işlemi gören bir Linux uygulaması da var : Stardict. Kelimelerin üstüne gelip kolayca farklı dilde olan anlamlarını görebilirsiniz.
Yapmamız gerekenler:
1 - İlk olarak Stardict adlı uygulamayı bilgisayarımıza kuruyoruz.
Ubuntu için : http://downloads.sourceforge.net/stardict/stardict_3.0.1-1_i386.deb
Diğer linux : http://linux.softpedia.com/progDownload/StarDict-Download-1162.html
2 - Daha sonra Babylon sözlüklerinin Stardicte kullanılması için Converter uygulaması kurmamız gerekiyor. Bu program .BGL uzantılı dosyaları, Stardict uygulamasının okuyabileceği .IFO uzantılı dosyaya çeviriyor. Programın adı : Dict Convert
http://linux.softpedia.com/get/Education/Dictconv-23446.shtml
adresinden programı indirebilirsiniz.
Programı indirdikten sonra zipli dosyayı bir klasöre açın ve daha sonra klasörün içine terminalden girdikten sonra :
"./configure" yazarak configurasyonu sağlayın. Eğer C++ Compiler hatası alırsanız terminale "sudo apt-get install build-essential" yazın ve ilgili paketlerin yüklenmesini sağlayın. Eğer libxml2 hatası alırsanız terminale "sudo apt-get install libxml2-dev" yazıp libxml2 paketinin yüklenmesini sağlayın. Daha sonra bu işlemi de sorunsuz hallederseniz, "make all install" yazarak programın kurulmasını sağlayın.
3 - Çevirme işleminin yapılması
http://www.babylon.com/category/30/Turkish.html adresinden türkçe sözlüklerden ilgilendiklerinizi indirin.
Daha sonra terminalde "dictconv babylonsozluk.bgl -o stardictsozluk.ifo" yazıp çevirme işlemini gerçekleştirin. Daha sonra bu komutu yazdığınız klasöre olusacak 3 dosyayı stardictsozluk.ifo, stardictsozluk.idx, stardictsozluk.dict; stardict'in kurulduğu dizindeki dic klasörünün içine kopyalayın. Eğer nereye kurulduğunu bilmiyorsanız, "updatedb" yazın terminale, daha sonra "locate stardict" yazın ve stardict klasörünün nerede olduğunu öğrenmiş olun.
Sırf bu yüzden linux kullanmayanlar olduğunu biliyorum, şahsen benim de uzun süredir linux kullanmamamın sebeplerinden bir tanesi de buydu. Linux'te bu programı nasıl kullanacağız?
Babylon sadece Windows sürümleri için var fakat aynı işlemi gören bir Linux uygulaması da var : Stardict. Kelimelerin üstüne gelip kolayca farklı dilde olan anlamlarını görebilirsiniz.
Yapmamız gerekenler:
1 - İlk olarak Stardict adlı uygulamayı bilgisayarımıza kuruyoruz.
Ubuntu için : http://downloads.sourceforge.net/stardict/stardict_3.0.1-1_i386.deb
Diğer linux : http://linux.softpedia.com/progDownload/StarDict-Download-1162.html
2 - Daha sonra Babylon sözlüklerinin Stardicte kullanılması için Converter uygulaması kurmamız gerekiyor. Bu program .BGL uzantılı dosyaları, Stardict uygulamasının okuyabileceği .IFO uzantılı dosyaya çeviriyor. Programın adı : Dict Convert
http://linux.softpedia.com/get/Education/Dictconv-23446.shtml
adresinden programı indirebilirsiniz.
Programı indirdikten sonra zipli dosyayı bir klasöre açın ve daha sonra klasörün içine terminalden girdikten sonra :
"./configure" yazarak configurasyonu sağlayın. Eğer C++ Compiler hatası alırsanız terminale "sudo apt-get install build-essential" yazın ve ilgili paketlerin yüklenmesini sağlayın. Eğer libxml2 hatası alırsanız terminale "sudo apt-get install libxml2-dev" yazıp libxml2 paketinin yüklenmesini sağlayın. Daha sonra bu işlemi de sorunsuz hallederseniz, "make all install" yazarak programın kurulmasını sağlayın.
3 - Çevirme işleminin yapılması
http://www.babylon.com/category/30/Turkish.html adresinden türkçe sözlüklerden ilgilendiklerinizi indirin.
Daha sonra terminalde "dictconv babylonsozluk.bgl -o stardictsozluk.ifo" yazıp çevirme işlemini gerçekleştirin. Daha sonra bu komutu yazdığınız klasöre olusacak 3 dosyayı stardictsozluk.ifo, stardictsozluk.idx, stardictsozluk.dict; stardict'in kurulduğu dizindeki dic klasörünün içine kopyalayın. Eğer nereye kurulduğunu bilmiyorsanız, "updatedb" yazın terminale, daha sonra "locate stardict" yazın ve stardict klasörünün nerede olduğunu öğrenmiş olun.
19 Haziran 2008 Perşembe
MPI ile Paralel Programlama
Message Passing Interface kısaca MPI, C programlama dili ile paralel programlamayı sağlayan bir C apisidir. Bu apiyi uygulamalarımızda kullanarak programlarımızı birçok işlemci üzerinde çalıştırmayı sağlayabiliriz.
Apinin bize sağladığı en önemli özellik processler arası haberleşmeyi sağlama imkanını sunması. Bu sayede zaten paralel programlama işlemini kusursuz yapmış oluyoruz. Genel kullanım alanları biyolojik modeller, uzay problemleri, dna modelleme gibi çok yoğun işlemleri gerektiren durumlarda kullanılıyor.
Bu apiyi kullanabilmek için en önemli şart, programımızı aynı işlemleri yapacak parçalara bölebilmek. Örneğin SMS Server'ınız var, 100 adet mesajı sıra ile okuyup, her sms'e bir cevap üreteceksiniz. Bunun için normal programlama ( seri programlama diyebiliriz aslında ) ile ne yaparız, 1 den 100 e kadar iterasyon şeklinde sms okuyup, cevaplandırırız. Fakat paralel programlama da ise örneğin 4 process kullansak, her birine 25 sms veririz. Her biri bir sms okur aynı anda, yani aynı anda 4 sms okur ( tam aynı anda olmaz aslında çünkü I/O cihazına aynı anda sadece bir process ulaşabilir ) gibi bir durum oluşur.
Fakat bilgisayar mimarisi ve işletim sistemleri konularından da bildiğimiz üzere bu işlemde 4 prcess kullanacağımız zaman 4 kat hızlanma gerçekleşmez. Çünkü programın bir kısmı yine seri olarak yapılacaktır ( zorunludur diyebiliriz). Bunun için Amdahl's Law incelenebilir.
En çok kullanılan durumlardan bir tanesi de matris üzerinde işlem yapma olayıdır. Örneğin matris çarpımı, matris toplamı veya 2 arrayin toplamı gibi işlemler paralel programlama ile çok daha hızlı bir şekilde yapılabilir.
Vereceğim linkte Game Of Life probleminin paralel programlama ile çözülmüş örneği var. Rar dosyası içerisinde Bilgisayar Mimarisi dersi için yapmış olduğum Game Of Life oyunun kodu ve raporu bulunmakta.
Yakın zamanda metodların kullanımı ile ilgili yazı da yazacağım.
Not : Program Linux üzerinde çalışmaktadır. Ve MPI apisi kurulu olmalıdır.
MPI Apisini indirip kurmak için : http://www.lam-mpi.org/using/docs/
Dosyayı indir
Apinin bize sağladığı en önemli özellik processler arası haberleşmeyi sağlama imkanını sunması. Bu sayede zaten paralel programlama işlemini kusursuz yapmış oluyoruz. Genel kullanım alanları biyolojik modeller, uzay problemleri, dna modelleme gibi çok yoğun işlemleri gerektiren durumlarda kullanılıyor.
Bu apiyi kullanabilmek için en önemli şart, programımızı aynı işlemleri yapacak parçalara bölebilmek. Örneğin SMS Server'ınız var, 100 adet mesajı sıra ile okuyup, her sms'e bir cevap üreteceksiniz. Bunun için normal programlama ( seri programlama diyebiliriz aslında ) ile ne yaparız, 1 den 100 e kadar iterasyon şeklinde sms okuyup, cevaplandırırız. Fakat paralel programlama da ise örneğin 4 process kullansak, her birine 25 sms veririz. Her biri bir sms okur aynı anda, yani aynı anda 4 sms okur ( tam aynı anda olmaz aslında çünkü I/O cihazına aynı anda sadece bir process ulaşabilir ) gibi bir durum oluşur.
Fakat bilgisayar mimarisi ve işletim sistemleri konularından da bildiğimiz üzere bu işlemde 4 prcess kullanacağımız zaman 4 kat hızlanma gerçekleşmez. Çünkü programın bir kısmı yine seri olarak yapılacaktır ( zorunludur diyebiliriz). Bunun için Amdahl's Law incelenebilir.
En çok kullanılan durumlardan bir tanesi de matris üzerinde işlem yapma olayıdır. Örneğin matris çarpımı, matris toplamı veya 2 arrayin toplamı gibi işlemler paralel programlama ile çok daha hızlı bir şekilde yapılabilir.
Vereceğim linkte Game Of Life probleminin paralel programlama ile çözülmüş örneği var. Rar dosyası içerisinde Bilgisayar Mimarisi dersi için yapmış olduğum Game Of Life oyunun kodu ve raporu bulunmakta.
Yakın zamanda metodların kullanımı ile ilgili yazı da yazacağım.
Not : Program Linux üzerinde çalışmaktadır. Ve MPI apisi kurulu olmalıdır.
MPI Apisini indirip kurmak için : http://www.lam-mpi.org/using/docs/
Dosyayı indir
6 Haziran 2008 Cuma
JSP - Oracle - Array Gonderme
Bazı durumlarda JSP sayfamızdan Oracledaki procedurumuze array gondermek isteyebiliriz. Bunun icin ilk olarak yapmamız gereken Oracle'da bir array type tanımlamak.
Daha sonra Procedurumuzun parametre kismina bu array tipinde bir degisken yazacagiz:
Daha sonra JSP sayfamızdan Array ile ilgili işlemleri yapmamız gerekiyor.
İlk olarak jsp sayfamızda ilgili sınıfları import edelim:
Daha sonra arrayimizi olusturup, import ettigimiz sinifa ait nesneleri olusturalim.
ArrayDescriptor nesnesi olustururken, createDescriptor metodunu kullaniyoruz. Bu metod 2 parametre aliyor. İlki bizim Oracle da olusturdugumuz integer array tipi, digeri ise jspden oracle'a baglanirken kullandigimiz Connection sınıfından türetilmis Conn nesnesi.
Conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:XE",
"IETT","****");
Buraya kadar olan islemlerde arrayimiz jsp sayfamizda olustu. Sirada, bunu gonderme islemi var.
CallableStatement kullaniyoruz burada. Bu sinifin setArray fonksiyonunu cstmt nesnesinden cagiriyoruz. Bu metod 2 parametre aliyor. Ilki parametre sirasi, insert_line oracle fonksiyonunun 2.parametresi oluyor bu array. Return degeri ilk parametre oldugu icin dogal olarak sirasi 3 oluyor. setArray metodunun 2.parametresi ise ARRAY sınıfından türetilen nesne oluyor. Bu da yukarıda önceden ürettiğimiz ARRAY sınıfına ait input1 nesnesi.
Bu sekilde arrayimizi oracleda bir fonksiyona gondermis olduk. Biraz zahmetli bir ise benziyor. Eger daha performansli ve kolay bir yol bulursam yine paylasacagim.
CREATE OR REPLACE TYPE INTEGERARRAYTYPE_TY AS TABLE OF INTEGER
Daha sonra Procedurumuzun parametre kismina bu array tipinde bir degisken yazacagiz:
CREATE OR REPLACE FUNCTION INSERT_LINE(vLineCode IN VARCHAR, arrStations IN INTEGERARRAYTYPE_TY)
Daha sonra JSP sayfamızdan Array ile ilgili işlemleri yapmamız gerekiyor.
İlk olarak jsp sayfamızda ilgili sınıfları import edelim:
<%@page language="java" import="oracle.sql.ARRAY"%>
<%@page language="java" import="oracle.sql.ArrayDescriptor">
Daha sonra arrayimizi olusturup, import ettigimiz sinifa ait nesneleri olusturalim.
Integer arrStations[] = new Integer[3];
arrStations[0]= 0;
arrStations[1]= 1;
arrStations[2]= 2;
ArrayDescriptor desc1 = ArrayDescriptor.createDescriptor("INTEGERARRAYTYPE_TY",Conn);
ARRAY input1 = new ARRAY(desc1, Conn, arrStations);
ArrayDescriptor nesnesi olustururken, createDescriptor metodunu kullaniyoruz. Bu metod 2 parametre aliyor. İlki bizim Oracle da olusturdugumuz integer array tipi, digeri ise jspden oracle'a baglanirken kullandigimiz Connection sınıfından türetilmis Conn nesnesi.
Conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:XE",
"IETT","****");
Buraya kadar olan islemlerde arrayimiz jsp sayfamizda olustu. Sirada, bunu gonderme islemi var.
CallableStatement cstmt = null;
String sql = "{call ? := INSERT_LINE(?,?)}";
try
{
cstmt = Conn.prepareCall(sql);
cstmt.setString(2,strLineCode_tr);
cstmt.setArray(3,input1);
cstmt.registerOutParameter(1,Types.INTEGER);
int b = cstmt.executeUpdate();
int sonuc = cstmt.getInt(1);
}
catch(Exception e) {}
finally {}
CallableStatement kullaniyoruz burada. Bu sinifin setArray fonksiyonunu cstmt nesnesinden cagiriyoruz. Bu metod 2 parametre aliyor. Ilki parametre sirasi, insert_line oracle fonksiyonunun 2.parametresi oluyor bu array. Return degeri ilk parametre oldugu icin dogal olarak sirasi 3 oluyor. setArray metodunun 2.parametresi ise ARRAY sınıfından türetilen nesne oluyor. Bu da yukarıda önceden ürettiğimiz ARRAY sınıfına ait input1 nesnesi.
Bu sekilde arrayimizi oracleda bir fonksiyona gondermis olduk. Biraz zahmetli bir ise benziyor. Eger daha performansli ve kolay bir yol bulursam yine paylasacagim.
1 Haziran 2008 Pazar
Google Map Api - Ders 8 - Bir koordinata Odaklan
Bu özellik zaten önceden bahsettiğim özelliklerden bir kaç fonksiyonu kullanılarak yapılabilir. 2 Textfield'a kullanıcıdan enlem ve boylam değerleri istenilerek haritada istenilen koordinata odaklanılabilir. Hareket halindeki nesne takibinde bu özellik işe yarayacaktır.
Kullanılan 2 fonskyionumuz var:
İlgili Örnek için :
http://afsungur.googlepages.com/map_ornek_10.html
Kullanılan 2 fonskyionumuz var:
map.setCenter(new GLatLng(enlem,boylam));
map.setZoom(zoomSeviyesi);
İlgili Örnek için :
http://afsungur.googlepages.com/map_ornek_10.html
22 Mayıs 2008 Perşembe
Google Map Api - Ders 7 - PolyLine Oluşturmak
Bazı durumlarda 2 nokta arasındaki mesafeyi yolu belli etmek amacıyla çizgi çizeriz. Bu bazen 2 nokta ile de sınırlı kalmayabilir. Bir yerden baska bir yere giderken uğranılması gereken yerleri de belirtmek isteyebiliriz. Bu durumlarda apimizin GPolyLine sınıfından yararlanacağız.
Bunun için ilk olarak yapilmasi gereken bir GLatLng arrayi oluşturmak. Bu arrayin elemanlari birer koordinat objesi olacak ve bu arrayın pointerını GPolyLine sınıfının constructoruna parametre olarak göndereceğiz. Örnekte 10 noktalı yani 10 elemanlı bir GLatLng arrayi oluşturulmuş ve bu array GPolyLine sınıfının constructoruna parametre olarak gönderilmiştir.
GPolyLine sınıfının constructoru sırasıyla GLatLng arrayı, polyline çizgisinin rengi, kalınlığı, opaklığı ve çizgi özellikleri olacak şekilde 5 parametre alıyor. Polyoption ise geodesic ve clickable özellikleri var. True veya false değerlerini alabiliyor.
Örnek için :
http://afsungur.googlepages.com/map_ornek_9.html
Bunun için ilk olarak yapilmasi gereken bir GLatLng arrayi oluşturmak. Bu arrayin elemanlari birer koordinat objesi olacak ve bu arrayın pointerını GPolyLine sınıfının constructoruna parametre olarak göndereceğiz. Örnekte 10 noktalı yani 10 elemanlı bir GLatLng arrayi oluşturulmuş ve bu array GPolyLine sınıfının constructoruna parametre olarak gönderilmiştir.
var a = new GLatLng(41,29);
var b = new GLatLng(42,30);
koordinatlar[0] = a;
koordinatlar[1] = b;
polyOptions = {geodesic:true};
polyLine = new GPolyline(koordinatlar, "#ff0000", 5, 1, polyOptions);
map.addOverlay(polyLine);
GPolyLine sınıfının constructoru sırasıyla GLatLng arrayı, polyline çizgisinin rengi, kalınlığı, opaklığı ve çizgi özellikleri olacak şekilde 5 parametre alıyor. Polyoption ise geodesic ve clickable özellikleri var. True veya false değerlerini alabiliyor.
Örnek için :
http://afsungur.googlepages.com/map_ornek_9.html
Google Map Api - Ders 6 - Hareket eden işaretçiler oluşturmak
Belki de bu apinin en çok beğendim özelliği hareket eden işaretçiler oluşturmak. Aslında burada apinin ekstradan herhangi bir özelliğini kullanmayacağız. Sadece programlama mantığımızdan yola çıkarak temel bir kaç javascript özelliği ile hareket edebilen işaretçiler oluşturacağız.
Programımızı yine fonksiyonlara ayiriyoruz. En başta işaretçimizi oluşturduk bunda problem yok.
Şimdi 4 tane metodumuz olacak.
1-) startMarker() : Isaretciyi hareket icin tetikleyecek metod
2-) stopMarker() : Isaretcinin hareketini durduracak metod
3-) moveMarker() : Isaretciyi hareket ettirecek metod
4-) setCoords() : Isaretcinin hareket edecegi koordinatları random olarak oluşturacak metod. Ben random koordinatlar olusturdum, arzu eden buraya elle degerler girip isaretcinin bir yol üzerinde hareket etmesini sağlayabilir. Projemde ben bu sekilde kullanmıstım. Elle degerleri girip aracları belli yol üzerinde hareket ettirebiliyordum.
Javascript'te timer olaylarını biraz bilmek gerekiyor. startMarker metodunda yer alacak aşağıdaki kod , speedInterval milisaniye sonra moveMarker metodunun çalıştıracağını belirtiyor.
Peki movemarket metodunda ne yapiliyor? Random olarak urettigimiz koordinatlara işaretçinin yönlendirilmesi yapiliyyor:
Fonksyionun ilk satirinda random degerler ile doldurdugumuz coordY ve coordX arraylarindan ilgili indexteki degerler ile bir koordinat objesi oluşturuluyor ( coordObj ). Daha sonra işaretçi buraya yönlendiriliyor ( busMarker.setLatLng ). Daha sonra index değeri bir arttırılıp, aynı metod speedInterval milisaniye sonra tekrar çağırılıyor.
Örneğin tamamı için:
http://afsungur.googlepages.com/map_ornek_8.html
Programımızı yine fonksiyonlara ayiriyoruz. En başta işaretçimizi oluşturduk bunda problem yok.
Şimdi 4 tane metodumuz olacak.
1-) startMarker() : Isaretciyi hareket icin tetikleyecek metod
2-) stopMarker() : Isaretcinin hareketini durduracak metod
3-) moveMarker() : Isaretciyi hareket ettirecek metod
4-) setCoords() : Isaretcinin hareket edecegi koordinatları random olarak oluşturacak metod. Ben random koordinatlar olusturdum, arzu eden buraya elle degerler girip isaretcinin bir yol üzerinde hareket etmesini sağlayabilir. Projemde ben bu sekilde kullanmıstım. Elle degerleri girip aracları belli yol üzerinde hareket ettirebiliyordum.
Javascript'te timer olaylarını biraz bilmek gerekiyor. startMarker metodunda yer alacak aşağıdaki kod , speedInterval milisaniye sonra moveMarker metodunun çalıştıracağını belirtiyor.
function startMarker()
{
timerID = setTimeout("moveMarker()", speedInterval);
}
Peki movemarket metodunda ne yapiliyor? Random olarak urettigimiz koordinatlara işaretçinin yönlendirilmesi yapiliyyor:
function moveMarker()
{
coordObj = new GLatLng(coordY[coordSayac],coordX[coordSayac]);
busMarker.setLatLng(coordObj);
coordSayac++;
timerID = setTimeout("moveMarker()", speedInterval);
}
Fonksyionun ilk satirinda random degerler ile doldurdugumuz coordY ve coordX arraylarindan ilgili indexteki degerler ile bir koordinat objesi oluşturuluyor ( coordObj ). Daha sonra işaretçi buraya yönlendiriliyor ( busMarker.setLatLng ). Daha sonra index değeri bir arttırılıp, aynı metod speedInterval milisaniye sonra tekrar çağırılıyor.
Örneğin tamamı için:
http://afsungur.googlepages.com/map_ornek_8.html
21 Mayıs 2008 Çarşamba
Kaydol:
Kayıtlar (Atom)