Apakah standar SQL mendefinisikan fungsi dengan efek samping?
Sebagai contoh, apakah mereka memiliki fungsi untuk menulis ke file * atau untuk memperbarui nilai di kolom tertentu dari sebuah tabel ketika Anda melakukan sesuatu seperti
SELECT myfunction(params...);
Saya pernah melihat ini kadang-kadang, tetapi saya hanya ingin tahu apakah standar SQL melakukan hal yang sama.
* Ini bukan pertanyaan tentang PostgreSQL secara khusus. Saya hanya menggunakan contoh efek samping yang saya lihat di PostgreSQL.
functions
sql-standard
tinlyx
sumber
sumber
Jawaban:
Anda memiliki beberapa pertanyaan berbeda di sini.
T: Apa fungsi SQL standar ANSI?
Fungsi standar ANSI adalah hal-hal seperti AVG, COUNT, MIN, MAX. Mereka dicakup dalam standar ANSI 1992 , tetapi itu adalah heck yang membosankan dan membosankan.
T: Apakah fungsi SQL standar ANSI mengubah data dalam database?
Tidak. Anda dapat menggunakannya untuk mengubah data - misalnya, saya dapat mengatakan:
Tetapi dengan sendirinya, hanya penggunaan AVG, COUNT, MIN, MAX, dll yang seharusnya tidak mengubah data secara permanen di dalam basis data Anda.
T: Apakah standar ANSI memungkinkan saya untuk menulis fungsi saya sendiri?
Ya, tetapi implementasi yang tepat bervariasi dari vendor ke vendor. Fungsi yang Anda tulis mungkin sesuai dengan standar bahasa ANSI, tetapi apa yang Anda lakukan di dalam fungsi Anda bisa sangat mengerikan, seperti membuat efek samping.
T: Dapatkah saya membuat fungsi saya sendiri untuk menulis data?
Mengapa yakin, jika Anda kreatif. Saya seorang Microsoft SQL Server, jadi saya akan fokus pada platform itu. Halaman fungsi Books Online mengatakan:
Yang saya katakan:
Jadi, inilah cara saya melanggar aturan. Peringatan: ikuti ide yang sangat buruk.
Semua contoh ini memiliki kelemahan besar dalam bentuk kinerja dan konsistensi transaksional. Anda hanya bertanya apakah secara teoritis bisa dilakukan, dan jawabannya ada ya. Saya tidak akan pernah menggunakan salah satu dari mereka dalam kode saya sendiri - Saya akan mundur dan bertanya, "Apa tujuan bisnis yang saya coba capai di sini, dan apakah ada cara saya bisa melakukannya untuk mencapai kinerja dan konsistensi transaksional ? " Jika Anda menginginkan saran khusus untuk itu, saya akan mengajukan pertanyaan Stack terpisah dengan spesifik.
sumber
Saya hanya dapat berbicara secara definitif mengenai SQL Server, dan tampaknya ini tidak konsisten di semua implementasi basis data. Tetapi dalam SQL Server, fungsi mungkin tidak menghasilkan efek samping. Ini adalah aturan yang keras dan cepat yang telah saya coba hindari beberapa kali tanpa hasil.
Jika Anda berpikir tentang fungsi dalam pengertian umum, ada modul SQL yang memungkinkan efek samping (misalnya prosedur tersimpan) tetapi fungsi yang ditentukan pengguna tidak.
Ada pepatah "Solusi Pintar Jangan Skala" yang terutama berlaku untuk produk Microsoft. Saya telah melihat sejumlah solusi cerdas di versi awal SQL Server yang menjadi usang di versi yang lebih baru, karena MS menambahkannya sebagai fitur yang sebenarnya.
Orang-orang yang tidak pernah menjadi fitur, jujur, tidak pernah menjadi fitur karena mereka secara mendasar merusak beberapa aspek pengembangan T-SQL. Efek samping dalam fungsi adalah salah satunya.
sumber