pl/sql ile crypto işlemi yapmak

Merhaba
Geliştirdiğimiz ya da üzerinde düzenleme yaptığımız uygulamalar içinde ihtiyacımız olduğunda “crypto” işlemi yaparız. Bu işlem bazen şifre saklama ,bazen bir metni gizleme ,çoğu zaman için ise güvenlik sebebi ile kullanılır.PL/Sql ortamında crypto işlemi yapabilmek için birden farklı yöntemler mevcuttur. Örneğin md5,base64 gibi. Hatırlarsanız base64 ile encode ve decode işlemini size anlatmıştım. Şimdi sistemde var olan bu bu örnek crypto işlemleri yerine kendimiz bir crypto işlemi yapabiliriz.
Kendi crypto sistemimizi yapmak için ileri derecede matematik ve algoritma bilmemize gerek yok. Çok üst seviye ve çözülmesi zor olan bir güvenliğe sahip crypto işlemi yapmayacağız için bu basit ve anlaşılır olan mantığı istediğiniz zaman ve kendinize uyarlayıp kullanabilirsiniz.
Şimdi isterseniz istediğimiz metni ya da herhangi bir sayısal ifadeyi kendi hazırladığımız crypto sistemi ile şifreleyelim.
Ben bu işlem için bir package hazırladım ve package içinde istediğimiz metni ya da sayısal ifadeyi kendi oluşturduğumuz crypto sistemi ile şifrelemek ve şifreli içeriği çözmek için fonksiyonlar mevcut.
Öncelikle package spec kısmını hazırlayalım.

CREATE OR REPLACE PACKAGE smt.plsql_crypto IS

  -- Author  : CELIKBICAK
  -- Created : 01.01.2012 14:54:44
  -- Purpose : Kendi crypto işlemimiz ile veri şifrelemek ve şifreli veriyi çözmek
  FUNCTION sifrele(metin VARCHAR2, anahtar VARCHAR2) RETURN VARCHAR2;
  FUNCTION coz(metin VARCHAR2, anahtar VARCHAR2) RETURN VARCHAR2;

END plsql_crypto;

Spec kısmı hazır olduğuna göre şimdi package body kısmını hazırlayalım.

CREATE OR REPLACE PACKAGE BODY smt.plsql_crypto IS

  FUNCTION sifrele(metin VARCHAR2, anahtar VARCHAR2) RETURN VARCHAR2 IS
    crypto_str    VARCHAR2(4000);
    temp_str      VARCHAR2(30);
    crypto_length NUMBER;
  BEGIN
    crypto_length := length(anahtar);
    FOR i IN 1 .. length(metin) LOOP
      temp_str   := substr(metin, i, 1);
      crypto_str := crypto_str || chr(ascii(temp_str) - crypto_length);
    END LOOP;
    RETURN(crypto_str);
  END sifrele;
  /**-----------------------------------------------------------------------------------**/
  FUNCTION coz(metin VARCHAR2, anahtar VARCHAR2) RETURN VARCHAR2 IS
    crypto_str    VARCHAR2(4000);
    temp_str      VARCHAR2(30);
    crypto_length NUMBER;
  BEGIN
    crypto_length := length(anahtar);
    FOR i IN 1 .. length(metin) LOOP
      temp_str   := substr(metin, i, 1);
      crypto_str := crypto_str || chr(ascii(temp_str) + crypto_length);
    END LOOP;
    RETURN(crypto_str);
  END coz;

BEGIN
  NULL;
END plsql_crypto;

Artık package hazır olduğuna göre istediğimiz metni ya da sayısal ifadeyi şifreleyip, çözebiliriz.
Örnek olarak aşağıdaki şekilde bir kullanım yapabiliriz.

DECLARE
  str           VARCHAR2(4000);
  sifreli_metin VARCHAR2(4000);
  cozulen_metin VARCHAR2(4000);
  anahtar       VARCHAR2(100);
BEGIN
  dbms_output.put_line('');
  dbms_output.put_line('---------------------Sayısal olmayan verilen şifrelenmesi ve çözülmesi---------------------' || chr(13));
  str           := 'A Place In The World Of Software , pl/sql ile crypto işlemi yapmak';
  anahtar       := 'crypto';
  sifreli_metin := smt.plsql_crypto.sifrele(str, anahtar);
  dbms_output.put_line('Şifrelenecek Metin:=' || str);
  dbms_output.put_line('Şifrelenmiş Hali:=' || sifreli_metin);
  dbms_output.put_line(chr(13) || '<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>' || chr(13));
  cozulen_metin := smt.plsql_crypto.coz(sifreli_metin, anahtar);
  dbms_output.put_line('Çözülecek Metin:=' || sifreli_metin);
  dbms_output.put_line('Çözülmüş Metin:=' || cozulen_metin);

  dbms_output.put_line('');
  dbms_output.put_line('---------------------Sayılar verilen şifrelenmesi ve çözülmesi---------------------' || chr(13));
  str           := '1234567890';
  anahtar       := 'crypto';
  sifreli_metin := smt.plsql_crypto.sifrele(str, anahtar);
  dbms_output.put_line('Şifrelenecek Sayısal Değer:=' || str);
  dbms_output.put_line('Şifrelenmiş Hali:=' || sifreli_metin);
  dbms_output.put_line(chr(13) || '<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>' || chr(13));
  cozulen_metin := smt.plsql_crypto.coz(sifreli_metin, anahtar);
  dbms_output.put_line('Çözülecek Sayısal Değer:=' || sifreli_metin);
  dbms_output.put_line('Çözülmüş Metin:=' || cozulen_metin);
END;

Burada sabit olarak verilen metin ve anahtar ile şifreleme ve çözme işlemi yapılıyor ve işlem sonucu aşağıdaki gibi olmaktadır.


---------------------Sayısal olmayan verilen şifrelenmesi ve çözülmesi---------------------

Şifrelenecek Metin:=A Place In The World Of Software , pl/sql ile crypto işlemi yapmak
Şifrelenmiş Hali:=;_Jf[]__Ch_Nb__Qilf^_I`_Mi`nq[l__&_jf)mkf_cf__]lsjni_cřf_gc_s[jg[e

<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>

Çözülecek Metin:=;_Jf[]__Ch_Nb__Qilf^_I`_Mi`nq[l__&_jf)mkf_cf__]lsjni_cřf_gc_s[jg[e
Çözülmüş Metin:=A Place In The World Of Software , pl/sql ile crypto işlemi yapmak

---------------------Sayılar verilen şifrelenmesi ve çözülmesi---------------------

Şifrelenecek Sayısal Değer:=1234567890
Şifrelenmiş Hali:=+,-./0123*

<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>

Çözülecek Sayısal Değer:=+,-./0123*
Çözülmüş Metin:=1234567890

Görüldüğü gibi sistemde var olan bir crypto işlemi gibi bizde kendi hazırladığımız kodlar ile crypto işlemini gerçekleştirmiş olduk.
Kolay gelsin.

oracle forms ile tnsnames.ora parse işlemi.

Merhaba

Çoğu zaman uygulama geliştirirken bir database ihtiyacımız olur. Bu database bazen bir Notepad , Access ya da Mysql vb. bazende daha Oracle gibi bir database olur.
Database bağlantılı hazırladığımız uygulamalar her zaman sabit bir db ye bağlanmak zorunda değildir. Uygulama ihtiyacına ya da çalışma durumuna göre farklı db erişimi yapmak zorunda olabilir. Bu gibi durumlar için son kullanıcının işlem yapacağı db seçimini kolaylaştırmak için bir parser yardımı ile hazırlanan db listesi işimizi görür.
Ben şuan evde Oracle 10g XE database kullanıyorum ve örneğimi bu db üzerinden vereceğim.Bilindiği gibi Oracle db erişim bilgilerini “tnsnames.ora” dosyasında tutar ve burada belirtilen database/lere bağlantı kurar.
Üzerinde çalışma yaptığım iki farklı db bulunduğu için bu parse işlemi hazırladığım uygulamalarda da bana çok kolaylık sağladı umarım sizin içinde faydalı olur.
Artık parse işlemine ve örnek kodlarımıza bakalım.Öncelikle “tnsnames.ora” dosyası içindeki db bilgilerini parse edecek ve bize sadece db bilgilerini verecek olan fonksiyonumuzu hazırlayalım.

CREATE OR REPLACE FUNCTION tns_listesi(tns VARCHAR2) RETURN VARCHAR2 IS
  tns_liste VARCHAR2(32000);
BEGIN
  tns_liste := tns;
  tns_liste := REPLACE(tns_liste, chr(10), NULL);
  tns_liste := regexp_replace(tns_liste, '\)([[:alnum:]])', chr(10) || '\1');
  tns_liste := regexp_replace(tns_liste, '=.*\)', NULL);
  tns_liste := REPLACE(REPLACE(tns_liste, chr(10), ','), chr(32), NULL);
  RETURN(tns_liste);
END tns_listesi;

Hazırladığımız bu fonksiyon “tnsnames.ora” dosyası içindeki tüm bilgileri string olarak alıp parse işlemini yapıyor. Örnek olarak fonksiyonu uygulama içinde kullanmadan önce bir declare ile test işlemimizi yapalım. Sistemimizde “DB_1″ , “DB_2″ , “DB_3″ şeklinde üç adet db olduğunu varsayalım ve doğru parse işleminin olup olmadığını kontrol edelim.

DECLARE
  tns VARCHAR2(4000);
BEGIN
  tns := '
DB_1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =10.0.0.10)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

DB_2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.20)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

DB_3 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.30)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
';

  dbms_output.put_line(tns_listesi(tns));
END;

Örnek declare komutumuzu çalıştırdığımızda ise dbms_output ile çıktıyı görebiliriz. Çıktı sonucu olarak ise bize aşağıdaki sonuç gelecektir.

DB_1,DB_2,DB_3

Ben bir sonraki işlemde kullanım için db isimlerini “,” ile ayırdım. Bu işlemi siz istediğiniz şekilde değiştirebilirsiniz. Şimdi Oracle Forms uygulaması içinde bir prosedür oluşturup parse işlemimizi uygulamamıza dahil edelim.

PROCEDURE db_listele IS
  i            NUMBER;
  tnsstr       VARCHAR2(4000);
  tns          VARCHAR2(100);
  text_file    text_io.file_type;
  text_buffer  VARCHAR2(32000);
  text_buffer2 VARCHAR2(32000);
  uzun         NUMBER;
BEGIN

  i := 1;
  clear_list('BLOCK_TNS.TNS_LIST');

  text_file := text_io.fopen('C:\ORACLEXE\APP\ORACLE\PRODUCT\10.2.0\SERVER\NETWORK\ADMIN\TNSNAMES.ORA', 'r');

  BEGIN
    LOOP
      text_io.get_line(text_file, text_buffer);
      text_buffer2 := text_buffer2 || text_buffer || chr(10);
    END LOOP;
  EXCEPTION
    WHEN no_data_found THEN
      NULL;
  END;

  tnsstr := tns_listesi(text_buffer2);

  WHILE instr(tnsstr, ',') > 0 LOOP
    tns    := substr(tnsstr, 1, instr(tnsstr, ',') - 1);
    tnsstr := substr(tnsstr, instr(tnsstr, ',') + 1, 2048);
    add_list_element('BLOCK_TNS.TNS_LIST', i, tns, tns);
    i := i + 1;
  END LOOP;

END;

Yazdığımız prosedür içini inceleyecek olursak öncelikle db nin kurulu olduğu lokasyondan “tnsnames.ora” içindeki metini okuyup bir değişkene attıktan sonra bu değeri parse işlemi için yazdığımız fonksiyona gönderiyoruz. Parse işleminden sonra bize gelen db isimlerini ise sırası ile gezerek ve ayrıştırma işlemi için kullandığmız “,” yardımı ile her db ismini ayrı ayrı uygulamamızda bulunan “TNS_LIST” nesnesi içine ekliyoruz.
Artık bu işlemden sonra sistemde bulunan tüm db adlarını elde ettiğimize göre uygulamız üzerinde son kullanıcı ve hatta kendimiz için bu seçimi kullanarak istediğimiz db için bağalntı işlemi oluşturabiliriz.

Kolay gelsin.

İzmir’deki yazılımcılar bu etkinlikte buluşuyor

Merhaba

10-11 Aralık 2011 günlerinde İzmir’deki yazılımcılar bir araya geliyor.

Kayıt olmak için bu fırsatı kaçırmayın. Konuşmacılar ve içerik hakkındaki bilgi aşağıdaki resimde mevcuttur.

Hemen Kayıt Olun

Kaynak

Categories: Kategorisiz

android dört işlem uygulaması

Merhaba,
Daha önce Android merhaba dünya uygulamasını anlatmıştım.
Şimdi sırada android ile yapılmış olan bir dört işlem uygulaması var. Bunun için öncelikle eclipse üzerinde bir android projesi açmamız gerekiyor. Açtığımız proje altında res klasörü altından layout klasörü içindeki main.xml içinde uygulamamızın ekran dizaynını yapabiliriz. Aşağıdaki xml kodlarını main.xml içine eklediğimizde uygulamamızın ekran görüntüsü hazır olacaktır.

Xml(main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="@string/hello"
		android:height="40dip" />
	<LinearLayout android:id="@+id/linearLayout3"
		android:layout_width="wrap_content" android:layout_height="wrap_content">
		<TextView android:width="70dip" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text="İlk Sayı"
			android:id="@+id/viewilksayi"></TextView>
		<TextView android:width="70dip" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text="İkinci Sayı"
			android:id="@+id/viewikincisayi"></TextView>
		<TextView android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text="Sonuç" android:id="@+id/viewsonuc"></TextView>
	</LinearLayout>
	<LinearLayout android:id="@+id/linearLayout1"
		android:layout_width="wrap_content" android:layout_height="wrap_content">
		<EditText android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:id="@+id/txtsayi1"
			android:inputType="number" android:width="70dip"></EditText>
		<EditText android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:id="@+id/txtsayi2"
			android:inputType="number" android:width="70dip"></EditText>
		<EditText android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:id="@+id/txtsonuc"
			android:width="175dip" android:inputType="number"></EditText>
	</LinearLayout>
	<LinearLayout android:id="@+id/linearLayout2"
		android:layout_width="wrap_content" android:layout_height="wrap_content">
		<Button android:id="@+id/btntopla" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text=" + "
			android:onClick="topla" android:width="60dip"></Button>
		<Button android:id="@+id/btncikar" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text=" - "
			android:onClick="cikar" android:width="60dip"></Button>
		<Button android:id="@+id/btncarp" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text=" * "
			android:onClick="carp" android:width="60dip"></Button>
		<Button android:id="@+id/btnbol" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text=" / "
			android:onClick="bol" android:width="60dip"></Button>
		<Button android:id="@+id/btntemizle" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text="Temizle"
			android:onClick="temizle" android:width="80dip"></Button>
	</LinearLayout>
	<TextView android:text="İşlem Geçmişi :" android:id="@+id/txtislemgecmisi"
		android:layout_height="wrap_content" android:layout_width="wrap_content"></TextView>
</LinearLayout>

Artık uygulamamızın ekran dizaynını yaptığımıza göre uygulamamızın kodlarını yazabiliriz.
Uygulama kodlarımız aşağıdaki gibidir.

Java(AndCalculator.java)

package smt.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class AndroidDortIslem extends Activity {
	/** Called when the activity is first created. */

	Integer sayi1, sayi2, genelsonuc;
	EditText edittxt1, edittxt2, edittxt3;
	TextView txtview;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		edittxt1 = (EditText) findViewById(R.id.txtsayi1);
		edittxt2 = (EditText) findViewById(R.id.txtsayi2);
		edittxt3 = (EditText) findViewById(R.id.txtsonuc);
		txtview = (TextView) findViewById(R.id.txtislemgecmisi);
	}

	public void topla(View view) {
		genelsonuc = (int) islemyap(1);
		edittxt3.setText(genelsonuc.toString());
		txtview.setText(txtview.getText() + "\n" + edittxt1.getText() + "+"
				+ edittxt2.getText() + "=" + edittxt3.getText());
	}

	public void cikar(View view) {
		genelsonuc = (int) islemyap(2);
		edittxt3.setText(genelsonuc.toString());
		txtview.setText(txtview.getText() + "\n" + edittxt1.getText() + "-"
				+ edittxt2.getText() + "=" + edittxt3.getText());
	}

	public void carp(View view) {
		genelsonuc = (int) islemyap(3);
		edittxt3.setText(genelsonuc.toString());
		txtview.setText(txtview.getText() + "\n" + edittxt1.getText() + "*"
				+ edittxt2.getText() + "=" + edittxt3.getText());
	}

	public void bol(View view) {
		genelsonuc = (int) islemyap(4);
		edittxt3.setText(genelsonuc.toString());
		txtview.setText(txtview.getText() + "\n" + edittxt1.getText() + "/"
				+ edittxt2.getText() + "=" + edittxt3.getText());
	}

	public void temizle(View view) {
		edittxt1.setText("");
		edittxt2.setText("");
		edittxt3.setText("");
		txtview.setText("İşlem Geçmişi :");
	}

	public float islemyap(int tip) {

		float sonuc;
		sonuc = 0;

		if (!edittxt1.getText().toString().equals("")
				&& !edittxt2.getText().toString().equals("")) {

			sayi1 = Integer.parseInt(edittxt1.getText().toString());
			sayi2 = Integer.parseInt(edittxt2.getText().toString());

			switch (tip) {
			case 1:
				// toplama
				sonuc = sayi1 + sayi2;
				break;
			case 2:
				// çıkarma
				sonuc = sayi1 - sayi2;
				break;
			case 3:
				// çarpma
				sonuc = sayi1 * sayi2;
				break;
			case 4:
				// bölme
				if (sayi2.toString().equals("0")) {
					Toast.makeText(getBaseContext(),
							"Sıfıra Bölme İşlemi Yapamazsınız !",
							Toast.LENGTH_LONG).show();
				} else {
					sonuc = sayi1 / sayi2;
				}
				break;
			default:
				break;
			}

		} else {
			Toast.makeText(getBaseContext(),
					"Sayı Girişi Yapmadan İşlem Yapamazsınız !",
					Toast.LENGTH_LONG).show();
		}

		return (sonuc);
	}
}

Kodlarımızı yazıp derledikten sonra artık uygulamamızı başlatabiliriz. Uygulamamız başlatıldığında aşağıdaki gibi adımlar oluşacaktır.

Kolay gelsin.

pl/sql de public,private procedure ve function kullanımı

Merhaba,
Pl/Sql ile geliştirdiğimiz projelerde çoğu zaman procedure, function, type, package vb. sistemler kullanırız. Kullanmış olduğumuz bu yapılar içinde bazen yazdığımız kodları ve scriptleri sadece kendimizin müdahale etmesini isteriz. İşte bu gibi durumlar public ve private yapısı karşımıza çıkıyor.
Hazırlamış olduğumuz bir package içindeki function ya da procedure lerden sadece bizim belirlediğimiz işlemleri diğer kişilerin kullanmasını istiyorsak public ve kendimize özel scriptler yazmak istiyorsak private yapısını kullanabiliriz.
Bu işlemleri daha anlaşılır olarak örneklemek için bir tane package hazırlayalım ve bu package içinde hem private hem de public scriptler hazırlayarak işlemlerimizi kontrol edelim. Burada dikkat etmemiz gereken hususlar öncelikle hazırlayacak olduğumuz package içinde spec kısmına yazacağımız tanımlamalara ait procedure ya da function ların public olarak kullanılacağı ve body kısmında yazacağımız procedure ya da function ların private olarak kullanılacağıdır.
Şimdi paketimizi hazırlayalım ve public, private scriptleri paket üzerinden inceleyelim.

CREATE OR REPLACE PACKAGE public_private_package IS

  -- Author  : SAMETCELIKBICAK
  -- Created : 18.04.2011 16:35:55
  -- Purpose : Public ve Private Package Kullanımı Örneği

  PROCEDURE public_procedure(param1 NUMBER, param2 VARCHAR2);
  FUNCTION public_function(param1 NUMBER, param2 VARCHAR2, param3 NUMBER) RETURN VARCHAR2;

END public_private_package;

Paketimizin spec kısmını hazırladık ve burada belirtmiş olduğumuz procedure ve function public olarak tanımlanır ve bu paketi kullanmak isteyen herkes tarafından erişilebilirler.
Şimdi paketimizin body kısmını hazırlayalım ve burada da private şeklinde procedure ve funtion hazırlayalım ve kullanalım.

CREATE OR REPLACE PACKAGE BODY public_private_package IS

  PROCEDURE private_procedure(param1 NUMBER, param2 VARCHAR2) IS
  BEGIN
    dbms_application_info.set_action('Private Proc., P1=' || param1 || ' , P2=' || param2);
  END;
  ---------------------------------------------------------------------------------------
  FUNCTION private_function(param1 NUMBER, param2 VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
    RETURN('Private Function , Param1=' || param1 || ' , Param2=' || param2);
  END;
  ---------------------------------------------------------------------------------------
  PROCEDURE public_procedure(param1 NUMBER, param2 VARCHAR2) IS
  BEGIN
    dbms_application_info.set_action('Public Proc., P1=' || param1 || ' , P2=' || param2);
  END;
  ---------------------------------------------------------------------------------------
  FUNCTION public_function(param1 NUMBER, param2 VARCHAR2, param3 NUMBER) RETURN VARCHAR2 IS
    private_func VARCHAR2(100);
  BEGIN
    IF nvl(param3, 0) = 0 THEN
      RETURN('Public Function , Param1=' || param1 || ' , Param2=' || param2);
    ELSE
      private_func := private_function(456, 'Private Function,Public Function İçinden Çağırıldı.');
      RETURN(private_func);
    END IF;
  END;
  ---------------------------------------------------------------------------------------
BEGIN
  NULL;
END public_private_package;

Paketimizin body kısmını da hazırladığımıza göre artık örnek kullanımlara geçebiliriz. Örnek olarak public function bilgisini kullanalım.

SELECT public_private_package.public_function(123, 'SAMET', 0) p1,
       public_private_package.public_function(123, 'SAMET', 1) p2
  FROM dual;

Burada iki farklı parametre ile public function kullanımı yaptık ve package body kısmında da görüleceği gibi public function ile private function kullanımını da yaptık.

P1 P2
Public Function , Param1=123 , Param2=SAMET Private Function , Param1=456 , Param2=Private Function,Public Function İçinden Çağırıldı.

Örnek olarak public procedure kullanımı ile de session action bilgisine parametre değerlerimizi atalım.

BEGIN
  public_private_package.public_procedure(789, 'SAMET');
END;

Bu işlemler sonucunda private olan procedure ya da function kullanılmak istenildiğinde ise sistem tarafından hata alınacaktır.
Bu gibi durumlar dikkat etmeniz gereken bir durumda package body kısmında tanımlayacağımız private nesnelerin kod bloğunda ilk önce yazılmasıdır. Bu hem package içinde okunurluğu hem de program içinde kod çalışma hiyerarşisinde düzeni sağlayacaktır.
Bu işlemlerde en sık yaşanan sorun private bir procedure ya da funtion bilgisinin kendisinden önce tanımlanan başka bir procedure ya da function içerisinden çağırılarak çalıştırılmak istenmesidir. Program akış hiyerarşisinde bu daha tanımlanmamış olan bir nesne çağırılmak istenildiği içinde sistem hata verecektir.
Kolay gelsin.

Follow

Get every new post delivered to your Inbox.

Join 46 other followers