Oracle Stored Procedure Oluşturma

Oracle veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
FXERKAN
Üye
Mesajlar: 178
Kayıt: 26 Tem 2003 11:06
Konum: Sivas - Konya
İletişim:

Oracle Stored Procedure Oluşturma

Mesaj gönderen FXERKAN »

merhaba arkadaşlar PL-SQL Developer kullanarak basit bir şekilde oracle veritabanına fonksiyonlar ve stored procedurler yazarak öğrenmeye çalışıyorum. yalnız bişeyi beceremedim biraz yardıma ihtiyacım var.

yapmak istediğim bir stored procedure oluşturmak (içerisinde birkaç parametre alan) örnek olarak şöyle bişey mesela

Kod: Tümünü seç

CREATE OR REPLACE PROCEDURE "FX_DENEME"(NO NUMBER) IS
BEGIN
	SELECT * FROM BGS_TAHAK BT WHERE BT.NO = NO;
END;
yapmak istediğim şey aslında oldukça basit, aynı işlevi gerçekleştirecek kodu SQL Server ile yapıp çalıştırınca bana güzel güzel o tabloyu gösteriyor ancak plsql de yada oracle da bana bu kodcuğu derletmiyor. bu kod aslında bu kadar kısa olmayacak tabiiki, bazı işlemleri yaptıktan sonra bana en sonda bu tabloyu getirmesi gerekli. bunu nasıl yaparım
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Oracle da ancak pl/sql tablolar sp den return edilebilirler. Bir dataset geri döndüremezsiniz. Bunun yerine sql i ve parametreleri client da join eder ve gönderirsiniz. Yada view oluşturur için public değişkenler kullanırsınız.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
FXERKAN
Üye
Mesajlar: 178
Kayıt: 26 Tem 2003 11:06
Konum: Sivas - Konya
İletişim:

Mesaj gönderen FXERKAN »

hocam cevabınız için teşekkür ederim ancak oracle konusunda oldukça yeni olduğum için bu dediklerinizin açıkcası nasıl yapılacağını bilemiyorum bu nedenle biraz açıklamalı şekilde tarif ederseniz çok sevinirim. ayrıca sql server 2000 bu işi yapabilirken oracle gibi veritabanı bu kadar basit bir şeyi neden yapamıyor. benim amacım başka bir sql cümlesiyle bu sp yi bir tablo gibi kullanmaktı ör: select * from sp_deneme gibi.
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Önce kendinize şu soruyu sorun;

select * from aa where x='birsey' and y='ikisey'

yerine neden

select * from sp_xxx('birsey','ikisey')

diye yazıyorsunuz... Beni bu şekilde kullanmaya iten birkaç neden var ama sizin öncelikli nedeniniz nedir ? Önce gereksinimi tam belirleyelim, ona göre oracle tarafında birkaç yoldan hangisini seçeceğimizi bilebiliriz.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

doganzorlu yazdı:Selam,

Oracle da ancak pl/sql tablolar sp den return edilebilirler. Bir dataset geri döndüremezsiniz. Bunun yerine sql i ve parametreleri client da join eder ve gönderirsiniz. Yada view oluşturur için public değişkenler kullanırsınız.
Hocama ilaveten listeleme işlemleri için cursor tanımlayabilirsin wiev lere göre daha işlevli olur...

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
FXERKAN
Üye
Mesajlar: 178
Kayıt: 26 Tem 2003 11:06
Konum: Sivas - Konya
İletişim:

Mesaj gönderen FXERKAN »

doğan hocam galiba ben tam olarak sorunumu anlatamamışım. benimburda yazdığım örnek sp nin içerisindeki o tek satır normalde bu sp nin içerisinde bulunacak olan son satır(bundan önce en az 20-25 satırlık bir hesaplama, kayıt girme, yenileme vb. gibi kod var) benim istediğim bu işlem bittikten sonra bana verdiğim parametrelere göre (burdaki örnekteki sp ye verilenden çok daha fazla parametre ile) istediğim tablonun verisini döndermek. açıkcası sizin yazdığınız
Oracle da ancak pl/sql tablolar sp den return edilebilirler. Bir dataset geri döndüremezsiniz. Bunun yerine sql i ve parametreleri client da join eder ve gönderirsiniz. Yada view oluşturur için public değişkenler kullanırsınız.
konularıda bilmiyorum çünkü ben zaten yeni başlayan birisiyim biraz daha açıklayıcı bir şekilde cevap verirseniz ben bir çözüm bulmaya çalışırım kendim. cevaplarınız içinde ayrıca teşekkür ederim.
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Oracle üzerinden sql serverdaki gibi bir procedure den dataset döndüremezsiniz. Fakat yine de çözümsüz değilsiniz. Yöntem olarak şunu önerebilirim.. Öncelikle SQL server da yazacağınız procedure u iki kısım olarak düşünün. Birisi query öncesi işlemler olacaktır. Belki de bir değişken değer alacak ve query de kullanacaksınız. Oracle da da bir procedure yazıp işlemleri yapın. Bir package tanımlayıp içinde gereken public değişkenlerinizi oluşturun. Veri kaynağı olarak view i göstermeden önce procedure u çağırın ve işlemlerinizi yapın. Gerekiyorsa daha önce oluşturduğunuz package içindeki değişkenlerinize değerlerini koyunuz ve view içinde kriter olarak bunlara referans veriniz.

Cursor da kullanamazsınız zira Cursor ı ancak db içindeki kodlarda kullanabilirsiniz. Client dan cursor ı açıp manage etmek mümkün değildir.

Yine de public değişkenlerin kullanımıyla ilgili fikir vermesi için (ki bu metodu kullanan azınlıktan biriyim, daha benden başka kullanan görmedim, diğer arkadaşlarım bunun mümkün olmadığını söylüyorlar) aşağıdaki örneğe bakabilirsiniz. Siz delphi den önce bir procedure çağıracaksınız. Sonra view ı kullanan dataseti open edeceksiniz.

Kod: Tümünü seç

CREATE OR REPLACE PACKAGE pack_test
IS
   PROCEDURE set_var (p_value VARCHAR2);                                                
   FUNCTION get_var RETURN VARCHAR2;
END;
/

CREATE OR REPLACE PACKAGE BODY pack_test
IS
   global_var VARCHAR2(100) ;
   
   PROCEDURE set_var (p_value VARCHAR2)
   IS
   BEGIN
      global_var := p_value;
   END set_var;
   FUNCTION get_var RETURN VARCHAR2
   IS
   BEGIN
      RETURN global_var;
   END get_var;
END;
/
CREATE OR REPLACE VIEW test_view
AS
   SELECT *
     FROM tbl_product
    WHERE product_type = pack_test.get_var;
/	
exec pack_test.set_var('MAMUL');
/
select * from test_view
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
FXERKAN
Üye
Mesajlar: 178
Kayıt: 26 Tem 2003 11:06
Konum: Sivas - Konya
İletişim:

Mesaj gönderen FXERKAN »

Doğan hocam verdiğiniz cevap ve örnek kod için teşekkür ederim. oldukça işime yaradı ve ne demek istediğinizi anladım. ancak şu anda başka bir sorunla daha karşılaştım daha doğrusu istekle. Benden select ifadesinde kullanılacak olan tabloadi, fieldadi ve where işleminin gerçkeleştirileceği fieldadininda dinamik olarak gönderilebilineceği bir sp istendi. tabiiki yine tablo dönderen tipten. sizin verdiğiniz örnek ile ben bu işi dinamik olmayan halde gerçekleştirdim. ancak işin içine dinamiklik girince biraz beceremedim.

Kod: Tümünü seç

	SQL_STR := 'SELECT ' || FIELDADI || ' FROM ' || TABLOADI || ' WHERE ' ||
			   WHEREFIELD || '=' || BINANO;

	EXECUTE IMMEDIATE SQL_STR; 
şeklinde dinamikbirşey yaptım(tabii burda bende into deyimi istiyor fakat ben onu gerekli olmadığı için iptal ettim. çünkü benimtablomda tekbir sonuç dönmeyecek) ama bunu viewda nasıl uygulayacağım daha doğrusu uygulanabilirmiyim yada başka bir çözüm olarak ne önerirsiniz. tekrar teşekkür ederim
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
Kullanıcı avatarı
FXERKAN
Üye
Mesajlar: 178
Kayıt: 26 Tem 2003 11:06
Konum: Sivas - Konya
İletişim:

Mesaj gönderen FXERKAN »

kendi yazdığım soruya kendimce bir çözüm buldum ama ne kadar doğru bilmiyorum ama şimdilik işimi gördüğünü düşünüyorum, gerçi kullanıcı yetki kısmıyla ilgili bir hata olduğunu biliyorum ama plsql dökümanlarındaki örnekleri aynen uyguladığımda da olmadığı için böyle bir sonuca vardım.

Kod: Tümünü seç

CREATE OR REPLACE FUNCTION "OF_RESIMYOLU"(TABLOADI    VARCHAR2,
										  FIELDADLARI VARCHAR2,
										  WHEREFIELD  VARCHAR2,
										  WHERESARTI  VARCHAR2)
	RETURN VARCHAR2 IS

	SQL_STR      VARCHAR2(1000);
	SQL_USERNAME VARCHAR2(20);
BEGIN

	--SELECT USERNAME INTO SQL_USERNAME FROM USER_USERS;
	SQL_USERNAME := DBMS_STANDARD.LOGIN_USER;

	EXECUTE IMMEDIATE 'GRANT CREATE VIEW TO ' || SQL_USERNAME;

	IF ((WHEREFIELD IS NOT NULL) AND (WHERESARTI IS NOT NULL)) THEN
	
		SQL_STR := 'CREATE OR REPLACE VIEW V_RESIMYOLU AS SELECT ' ||
				   FIELDADLARI || ' FROM ' || TABLOADI || ' WHERE ' ||
				   WHEREFIELD || '=' || WHERESARTI;
	
	ELSE
	
		SQL_STR := 'CREATE OR REPLACE VIEW V_RESIMYOLU AS SELECT ' ||
				   FIELDADLARI || ' FROM ' || TABLOADI;
	
	END IF;

	EXECUTE IMMEDIATE SQL_STR;

	EXECUTE IMMEDIATE 'REVOKE CREATE VIEW FROM ' || SQL_USERNAME;

	IF SQLCODE <> 0 THEN
		RETURN 0;
	ELSE
		RETURN 1;
	END IF;
END;

dinamik bir sql ifadesi ile ihtiyacım olan yapıyı oluşturdum. belki yardımcı olur. :lol:
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
Cevapla