Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Jalankan pemilihan langsung tidak mengembalikan nilai

Anda harus memilih ke sesuatu. Jika tidak, maka kueri bahkan tidak dieksekusi (meskipun sudah diurai).

create or replace procedure select_procedure
as
  l_name student.name%TYPE;
  l_surname student.name%TYPE;
begin
  execute immediate
  'select name, surname
  from student
  where id_student = 1'
  into l_name, l_surname;
end;
/

Namun, tanpa urutan tertentu:(a) Anda harus menggunakan variabel bind alih-alih memiliki nilai literal 1 yang disematkan dalam pernyataan dinamis; (b) ini tidak perlu dinamis sama sekali; dan (c) pemanggil tidak akan dapat melihat nilai yang dikembalikan oleh kueri - kecuali jika Anda memilih ke OUT sebagai gantinya, atau tampilkan dengan dbms_output() (walaupun itu seharusnya hanya digunakan untuk debugging karena Anda tidak dapat mengontrol apakah klien akan menampilkannya).

Jadi Anda bisa melakukan:

create or replace procedure select_procedure
as
  l_name student.name%TYPE;
  l_surname student.name%TYPE;
begin
  select name, surname
  into l_name, l_surname
  from student
  where id_student = 1;

  dbms_output.put_line('name=' || l_name ||', surname=' || l_surname);
end;
/

atau

create or replace procedure select_procedure (
  p_name OUT student.name%TYPE,
  p_surname OUT student.name%TYPE
)
as
begin
  select name, surname
  into p_name, p_surname
  from student
  where id_student = 1;
end;
/

dan minta penelepon Anda memasukkan nama variabelnya sendiri untuk diisi, dan kemudian lakukan apa pun yang diperlukan dengan itu. Penelepon biasanya juga akan memberikan ID yang Anda cari, jadi Anda tidak memiliki 1 hard-coded.

Tampaknya prosedur bukanlah mekanisme terbaik untuk ini.

Juga, menggunakan select ... into (statis atau dinamis) akan error jika kueri mengembalikan nol baris atau lebih dari satu baris. Ini hanya akan berfungsi jika ada tepat satu baris yang dikembalikan. Kursor akan menangani sejumlah baris - tetapi kecuali Anda hanya mencetak hasilnya (seperti yang ditunjukkan @Jayanth), Anda harus mengembalikan kursor ke pemanggil. Anda dapat melakukan bulk collect into koleksi sebagai gantinya, tetapi Anda masih harus melakukan sesuatu dengan itu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL - Cara mendapatkan penghitungan berdasarkan tanggal menjadi beberapa kolom di ORACLE

  2. Ambil data dalam rentang tanggal di Oracle

  3. Oracle SQL Developer menyalin database langkah demi langkah

  4. LISTAGG() Fungsi di Oracle

  5. Kesalahan (ORA-21700) dengan Operator Tabel setelah memperbarui ke Oracle 12.2 dari 12.1