2010-06-23 19 views
16

H2 veritabanını kullanarak saklanan prosedürleri oluşturmak isteyen var mı?H2 veritabanını kullanarak saklı yordam nasıl oluşturulur?

+0

Java işlevlerini kullanmayla ilgili sorunum, [bu birinden] farklıdır (http://stackoverflow.com/questions/3098905/how-to-create-stored-procedure-using-h2-database). Böyle bir fonksiyonda tablolara nasıl erişeceğimi bilmiyorum (bağlantı oluşturmak hiç mantıklı değil, değil mi)? – maaartinus

+0

Her zaman kılavuza bakmaya yardımcı olur: [H2: Kullanıcı Tanımlı İşlevler ve Saklı Prosedürler] (http://www.h2database.com/html/features.html#user_defined_functions) – NullUserException

cevap

9

Bir Java işlevindeki veritabanına erişmek için bir bağlantıya ihtiyacınız vardır.

Çözüm 1: H2 için, böyle bir bağlantı elde etmek için iki yol vardır Java işlevi ilk parametre sonra veritabanı bağlantısı sağlayan bir java.sql.Connection ise. SQL için bu, 'gizli' bir parametredir, yani bunu yapamazsınız ve bunu açıkça ayarlamanıza gerek yoktur. Bu belgelenmiştir: User-Defined Functions and Stored Procedures, "Bağlantı Gerektiren İşlevler". Örnek: Apache Derby ve Oracle ile uyumluluk için Sen DriverManager.getConnection("jdbc:default:connection") kullanarak Java fonksiyonu içinde yeni bir bağlantı açabilirsiniz: 2

CREATE ALIAS QUERY AS $$ 
ResultSet query(Connection conn, String sql) throws SQLException { 
    return conn.createStatement().executeQuery(sql); 
} $$; 
CALL QUERY('SELECT * FROM DUAL'); 

Çözüm. Bu özellik H2 sürüm 1.3.151 ve daha yeni sürümlerde mevcuttur ve varsayılan olarak devre dışıdır. Bunu etkinleştirmek için ;DEFAULT_CONNECTION=TRUEto the database URL'u ekleyin. Sorunlu bir özellik çünkü Oracle JDBC sürücüsü, H2 sürücüsünden önce yüklüyse bu veritabanı URL'sini çözümlemeye çalışacaktır. Temel olarak, Oracle sürücüsü yüklüyse, özelliği kullanamazsınız (Bunu, Oracle sürücüsünde bir hata olarak görüyorum).

+0

Onlarla bittiğinde ifadelerinizi her zaman kapatın ... Açıklama s = conn.createStatement(); {return s.executeQuery (sql);} nihayet {s.close();} – jcalfee314

+0

H2 için (ve bu H2 ile ilgilidir) kapatıp kapatmamanız önemli değil ifade ya da değil. Ancak evet, genellikle ifade kapatılmalıdır. –

+0

@Thomas Mueller dökümantasyon örnekleriniz çok fakir bir CRUD örneği koyarsanız – Dunken

İlgili konular