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
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
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)
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.
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)
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...
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.
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.
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)
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.
ş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
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.
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.