kzen.dev
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 Joshua1729
Joshua1729
Question

Solusi untuk "tidak dapat melakukan operasi DML di dalam kueri"?

Saya menggunakan alat Analisis Data dan persyaratan yang saya miliki adalah menerima nilai dari pengguna, meneruskannya sebagai parameter dan menyimpannya dalam tabel. Cukup mudah sehingga saya duduk untuk menulis ini

create or replace
procedure complex(datainput in VARCHAR2)
is
begin
insert into dumtab values (datainput);
end complex;

Saya mengeksekusi ini di SQL Developer menggunakan pernyataan berikut

begin
complex('SomeValue');  
end;

Ini bekerja dengan baik, dan nilainya dimasukkan ke dalam tabel. Namun, pernyataan di atas tidak didukung dalam alat Analisis Data, jadi saya menggunakan fungsi sebagai gantinya. Berikut ini adalah kode fungsi, itu dikompilasi.

create or replace
function supercomplex(datainput in VARCHAR2)
return varchar2
is
begin
insert into dumtab values (datainput);
return 'done';
end supercomplex;   

Sekali lagi saya mencoba mengeksekusinya di SQL Developer, tetapi saya mendapatkan tidak dapat melakukan operasi DML di dalam kueri setelah mengeksekusi kode berikut ini

select supercomplex('somevalue') from dual;

Pertanyaan saya adalah

  • Saya membutuhkan pernyataan yang dapat menjalankan fungsi yang disebutkan di SQL Developer atau
  • Fungsi yang dapat melakukan apa yang saya cari yang dapat dijalankan oleh pernyataan pilih.
  • Jika tidak mungkin untuk melakukan apa yang saya minta, saya ingin alasannya sehingga saya dapat memberi tahu manajer saya karena saya masih sangat baru (seperti seminggu?) Untuk PL / SQL jadi saya tidak mengetahui aturan dan sintaksisnya.

P.S. Betapa saya berharap ini adalah C ++ atau bahkan Java :(

EDIT

Saya perlu menjalankan fungsi pada SQL Developer karena sebelum menjalankannya di DMine (yang merupakan alat) untuk menguji apakah itu valid atau tidak. Apa pun yang tidak valid di SQL juga tidak valid di DMine, tetapi tidak sebaliknya.

Terima kasih atas bantuannya, saya mengerti situasinya dan mengapa hal itu ilegal/tidak direkomendasikan

25 2012-01-04T15:20:16+00:00 3
 Joshua1729
Joshua1729
Pertanyaan edit 5 Januari 2012 в 7:50
Pemrograman
sql
oracle
function
stored-procedures
plsql
Solution / Answer
Vincent Malgrat
Vincent Malgrat
4 Januari 2012 в 3:42
2012-01-04T15:42:00+00:00
Lebih
Sumber
Sunting
#15107564

Anda bisa menggunakan arahan pragma autonomous_transaction. Ini akan menjalankan fungsi ke dalam transaksi independen yang akan dapat melakukan DML tanpa memunculkan ORA-14551.

Ketahuilah bahwa karena transaksi otonom bersifat independen, hasil DML akan dikomit di luar lingkup transaksi induk. Dalam kebanyakan kasus, hal itu tidak akan menjadi solusi yang dapat diterima.

SQL> CREATE OR REPLACE FUNCTION supercomplex(datainput IN VARCHAR2)
  2     RETURN VARCHAR2 IS
  3     PRAGMA AUTONOMOUS_TRANSACTION;
  4  BEGIN
  5     INSERT INTO dumtab VALUES (datainput);
  6     COMMIT;
  7     RETURN 'done';
  8  END supercomplex;
  9  /

Function created

SQL> SELECT supercomplex('somevalue') FROM dual;

SUPERCOMPLEX('SOMEVALUE')
--------------------------------------------------------------------------------
done

SQL> select * from dumtab;

A
--------------------------------------------------------------------------------
somevalue

Tom Kyte memiliki penjelasan yang bagus tentang mengapa kesalahan itu muncul di tempat pertama. Ini tidak aman karena mungkin tergantung pada urutan baris yang diproses. Lebih jauh lagi, Oracle tidak menjamin bahwa fungsi tersebut akan dieksekusi setidaknya sekali dan paling banyak sekali per baris.

Vincent Malgrat
Vincent Malgrat
Jawaban edit 4 Januari 2012 в 4:29
44
0
John Doyle
John Doyle
4 Januari 2012 в 3:26
2012-01-04T15:26:53+00:00
Lebih
Sumber
Sunting
#15107563

Deklarasikan saja sebuah variabel untuk menerima nilai balik, misalnya:

declare
    retvar varchar2(4);
begin
    retvar := supercomplex('somevalue');
end;

Pilih tidak berfungsi karena fungsi tersebut melakukan penyisipan, jika yang dilakukannya hanyalah mengembalikan nilai maka itu akan berfungsi.

John Doyle
John Doyle
Jawaban edit 4 Januari 2012 в 5:45
12
0
 0xdb
0xdb
3 November 2019 в 2:47
2019-11-03T14:47:52+00:00
Lebih
Sumber
Sunting
#15107565

Jalankan saja fungsi dalam pernyataan if ... end if; dummy untuk mengabaikan nilai balik:


exec if supercomplex('somevalue') then null; end if;
~~~
Atau jalankan sebagai parameter untuk prosedur `put_line` untuk mengeluarkan nilai balik:
~~~~sql
exec dbms_ouput ('result of supercomplex='||supercomplex('somevalue'));

hasil superkompleks = selesai
~~~
1
0
Related communities 3
Oracle Indonesia
Oracle Indonesia
710 pengguna
Group belajar, diskusi, dan berbagi tentang berbagai produk dan teknologi Oracle. Disclaimer: This group is not in any affilation nor maintained by the Oracle.
Buka telegram
OrcV2 🇲🇨Indonesia🇮🇩
OrcV2 🇲🇨Indonesia🇮🇩
98 pengguna
Website : https://orcv2token.tech/ Tg Global : https//t.me/orcv2
Buka telegram
Oracle_id
Oracle_id
57 pengguna
Oracle_id adalah komunitas Penikmat Oracle seluruh Indonesia, fokus membahas product2 Oracle
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Daniel Gogov
Terdaftar 6 hari yang lalu
2
工藤 芳則
Terdaftar 1 minggu yang lalu
3
Ирина Беляева
Terdaftar 2 minggu yang lalu
4
Darya Arsenyeva
Terdaftar 2 minggu yang lalu
5
anyta nuam-nuam (LapuSiK)
Terdaftar 2 minggu yang lalu
ID
JA
© kzen.dev 2023
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi