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

Oracle membuat prosedur yang memanggil fungsi

Anda harus memilih hasil yang mengembalikan menjadi sesuatu . Apa? Variabel lokal, misalnya.

SQL> CREATE OR REPLACE PROCEDURE date_test (start_date DATE, end_date DATE)
  2  IS
  3     l_res  nt_Date;
  4  BEGIN
  5     SELECT generate_dates_pipelined (start_date, end_date)
  6       INTO l_res
  7       FROM DUAL;
  8
  9     FOR i IN l_res.FIRST .. l_res.LAST
 10     LOOP
 11        DBMS_OUTPUT.put_line (l_res (i).date_val);
 12     END LOOP;
 13  END;
 14  /

Procedure created.

SQL> set serveroutput on
SQL> EXEC date_test(DATE '2021-08-01', DATE '2021-08-10');
01.08.21
02.08.21
03.08.21
04.08.21
05.08.21
06.08.21
07.08.21
08.08.21
09.08.21
10.08.21

PL/SQL procedure successfully completed.

SQL>

[EDIT] Jika ingin menghapus tanggal yang ada di holiday tabel, maka ini adalah salah satu opsi:gunakan delete metode pengumpulan.

Karena koleksi sekarang jarang, Anda tidak dapat menggunakan FOR loop untuk menampilkan nilainya (seperti yang Anda dapatkan no_data_found kesalahan) - gunakan WHILE sebagai gantinya.

SQL> CREATE OR REPLACE PROCEDURE date_test (start_date DATE, end_date DATE)
  2  IS
  3     l_res  nt_date;
  4     i      NUMBER;
  5     l_cnt  NUMBER;
  6  BEGIN
  7     SELECT generate_dates_pipelined (start_date, end_date)
  8       INTO l_res
  9       FROM DUAL;
 10
 11     DBMS_OUTPUT.put_line ('contents of L_RES (all dates) ------------');
 12
 13     FOR i IN l_res.FIRST .. l_res.LAST
 14     LOOP
 15        DBMS_OUTPUT.put_line (l_res (i).date_val);
 16     END LOOP;
 17
 18     DBMS_OUTPUT.put_line ('removing holidays -------------------------');
 19
 20     FOR i IN l_res.FIRST .. l_res.LAST
 21     LOOP
 22        SELECT MAX (1)
 23          INTO l_cnt
 24          FROM holidays
 25         WHERE holiday_date = l_res (i).date_val;
 26
 27        DBMS_OUTPUT.put_line (
 28           l_res (i).date_val || ': cnt = ' || l_cnt || ' - delete it!');
 29
 30        IF l_cnt = 1
 31        THEN
 32           l_res.delete (i);
 33        END IF;
 34     END LOOP;
 35
 36     DBMS_OUTPUT.put_line ('contents of L_RES (holidays excluded) ----');
 37
 38     i := l_res.FIRST;
 39
 40     WHILE i IS NOT NULL
 41     LOOP
 42        DBMS_OUTPUT.put_line (l_res (i).date_val);
 43        i := l_res.NEXT (i);
 44     END LOOP;
 45  END;
 46  /

Procedure created.

Lihat itu berhasil:

SQL> SELECT * FROM holidays;

HOLIDAY_DA HOLIDAY_NAME
---------- --------------------
01.08.2021 August 01 2021
05.08.2021 August 05 2021

SQL> EXEC date_test(date '2021-08-01', date '2021-08-10');
contents of L_RES (all dates) ------------
01.08.2021
02.08.2021
03.08.2021
04.08.2021
05.08.2021
06.08.2021
07.08.2021
08.08.2021
09.08.2021
10.08.2021
removing holidays -------------------------
01.08.2021: cnt = 1 - delete it!
02.08.2021: cnt =  - delete it!
03.08.2021: cnt =  - delete it!
04.08.2021: cnt =  - delete it!
05.08.2021: cnt = 1 - delete it!
06.08.2021: cnt =  - delete it!
07.08.2021: cnt =  - delete it!
08.08.2021: cnt =  - delete it!
09.08.2021: cnt =  - delete it!
10.08.2021: cnt =  - delete it!
contents of L_RES (holidays excluded) ----
02.08.2021
03.08.2021
04.08.2021
06.08.2021
07.08.2021
08.08.2021
09.08.2021
10.08.2021

PL/SQL procedure successfully completed.

SQL>

[EDIT]

Jika Anda ingin menggunakan NOT EXISTS , maka begini caranya:

SQL> SELECT date_val
  2    FROM TABLE (
  3            generate_dates_pipelined (DATE '2021-08-01', DATE '2021-08-10'))
  4   WHERE NOT EXISTS
  5            (SELECT 1
  6               FROM holidays h
  7              WHERE date_val = h.holiday_date);

DATE_VAL
----------
02.08.2021
03.08.2021
04.08.2021
06.08.2021
07.08.2021
08.08.2021
09.08.2021
10.08.2021

8 rows selected.

SQL>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa GETDATE() merupakan pengidentifikasi yang tidak valid

  2. Tidak ada lagi data untuk dibaca dari soket

  3. Kueri Perhitungan Jarak Lat Lon di Oracle

  4. Mengapa tidak ada output saat blok PLSQL Anonymous selesai?

  5. JDBC - Oracle ArrayIndexOutOfBoundsException