Di Sql Server, sering kali ketika saya menguji tubuh prosedur tersimpan, saya menyalin tubuh ke dalam SSMS, DECLARE variabel di bagian atas halaman, mengaturnya ke beberapa nilai sampel, dan mengeksekusi tubuh apa adanya.
Misalnya, jika proc saya adalah
CREATE PROC MySampleProc
@Name VARCHAR(20)
AS
SELECT @Name
Maka test sql saya adalah
DECLARE @Name VARCHAR(20)
SET @Name = 'Tom'
SELECT @Name
Apa padanan Oracle PL/SQL untuk ini?
Ini adalah yang paling dekat yang saya dapatkan, tetapi saya mendapatkan "PLS-00428: klausa INTO diharapkan dalam pernyataan SELECT ini &"
DECLARE
myname varchar2(20);
BEGIN
myname := 'Tom';
select myname from DUAL;
END;
Ini adalah contoh yang lebih baik dari apa yang sebenarnya saya coba lakukan:
DECLARE
myname varchar2(20);
BEGIN
myname := 'Tom';
SELECT *
FROM Customers
WHERE Name = myname;
END;
Tapi sekali lagi, ia menginginkan 'INTO' padahal sebenarnya saya hanya ingin catatan dicetak di layar, bukan disimpan di tabel lain....
DISELESAIKAN:
Terima kasih kepada @Allan, saya sudah bisa bekerja dengan cukup baik. Oracle SQL Developer rupanya mengingat nilai parameter yang Anda berikan. PL/SQL Developer, bagaimanapun, tidak ingin ada hubungannya dengan ini....
Jika Anda "Run As Script", ia akan mematuhi default Anda, tetapi hanya akan mengembalikan hasil sebagai teks ASCI, bukan dalam grid/spreadsheet
Jawaban yang Direvisi
Jika Anda tidak memanggil kode ini dari program lain, pilihannya adalah melewatkan PL/SQL dan melakukannya secara ketat dalam SQL menggunakan variabel bind:
var myname varchar2(20);
exec :myname := 'Tom';
SELECT *
FROM Customers
WHERE Name = :myname;
Dalam banyak alat (seperti Toad dan SQL Developer), menghilangkan pernyataan var
dan exec
akan menyebabkan program meminta Anda untuk nilai.
Jawaban Asli
Perbedaan besar antara T-SQL dan PL/SQL adalah Oracle tidak mengizinkan Anda mengembalikan hasil query secara implisit. Hasilnya harus selalu dikembalikan secara eksplisit dengan cara tertentu. Cara paling sederhana adalah dengan menggunakan DBMS_OUTPUT
(kira-kira setara dengan print
) untuk mengeluarkan variabel:
DECLARE
myname varchar2(20);
BEGIN
myname := 'Tom';
dbms_output.print_line(myname);
END;
Hal ini tidak terlalu membantu jika Anda mencoba mengembalikan sebuah set hasil. Dalam hal ini, Anda ingin mengembalikan koleksi atau refcursor. Namun, menggunakan salah satu dari solusi tersebut akan membutuhkan pembungkus kode Anda dalam fungsi atau prosedur dan menjalankan fungsi/prosedur dari sesuatu yang mampu mengkonsumsi hasilnya. Fungsi yang bekerja dengan cara ini mungkin terlihat seperti ini:
CREATE FUNCTION my_function (myname in varchar2)
my_refcursor out sys_refcursor
BEGIN
open my_refcursor for
SELECT *
FROM Customers
WHERE Name = myname;
return my_refcursor;
END my_function;
Dalam Oracle PL/SQL, jika Anda menjalankan query yang mungkin mengembalikan beberapa baris, Anda memerlukan kursor untuk mengiterasi hasilnya. Cara paling sederhana adalah dengan for loop, mis:
declare
myname varchar2(20) := 'tom';
begin
for result_cursor in (select * from mytable where first_name = myname) loop
dbms_output.put_line(result_cursor.first_name);
dbms_output.put_line(result_cursor.other_field);
end loop;
end;
Jika anda memiliki query yang mengembalikan tepat satu baris, maka anda dapat menggunakan sintaks select...into...
, contoh:
declare
myname varchar2(20);
begin
select first_name into myname
from mytable
where person_id = 123;
end;
Variabel tidak didefinisikan, tetapi dideklarasikan.
Ini mungkin duplikat dari https://stackoverflow.com/questions/8469301/declare-variables-in-a-pl-sql-block
Tetapi Anda bisa melihat di sini:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#i27306
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm
UPDATE:
Lihat di sini : https://stackoverflow.com/questions/2153053/how-to-return-a-resultset-cursor-from-a-oracle-pl-sql-anonymous-block-that-exe