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

Mengabaikan variabel substitusi ketika kondisi tidak terpenuhi

Skrip SQL*Plus untuk Windows:

set define "&"
set verify off
define mytable = dual

accept param prompt "Enter option 1-9: "

-- Generate a script named prompt_for_tablename.sql which prompts the user for a table name
-- or does nothing, depending on the value of &param:
set termout off
column mytable new_value mytable
set head off feedback off
spool prompt_for_tablename.sql
select 'accept mytable char prompt "Enter table name: "' as prompt from dual where &param = 1;
spool off
set termout on head on feedback on

@prompt_for_tablename.sql
host del prompt_for_tablename.sql

declare
    vari_axu number;
begin
    if &param = 1 then
        dbms_output.put_line ('work here');
        select count(*) into vari_axu from &mytable ;
        dbms_output.put_line('Count of &mytable: ' || vari_axu);
        return;
    end if;

    dbms_output.put_line ('do not work' );
end;
/

Jika pengguna memasukkan 1 pada prompt pertama, skrip yang dihasilkan prompt_for_tablename.sql akan meminta nama tabel. Untuk nilai lainnya, itu tidak akan menghasilkan apa-apa.

Kemudian prompt_for_tablename.sql dijalankan (dan segera dihapus, karena kami tidak membutuhkannya lagi). Sekarang &mytable berisi nilai default dari awal skrip, atau apa pun yang dimasukkan pengguna saat diminta.

Ditambahkan:versi dengan dua variabel

Ini membangun kueri dinamis sebagai:

select count(*) into vari_axu from &mytable where created > date '&busdate';

Untuk tujuan demo, Anda dapat memasukkan nama tabel sebagai user_objects (di mana created adalah kolom tanggal).

Jelas konstruksi semacam ini menjadi rumit dan rawan kesalahan karena pengguna harus menentukan tabel yang memiliki nama kolom yang diharapkan, jadi saya tidak yakin saya merekomendasikan terlalu jauh ke jalan ini, tapi bagaimanapun:

set define "&"
set verify off
define mytable = dual
define busdate = "0001-01-01"
define if_param_is_1 = "--"

accept param prompt "Enter option 1-9: "

-- Generate a script named prompt_for_tablename.sql which prompts the user for a table name
-- or does nothing, depending on the value of &param:
set termout off
column mytable new_value mytable
column if_param_is_1 new_value if_param_is_1

set head off feedback off
spool prompt_for_tablename.sql
select prompt, null as if_param_is_1  -- uncomment
from
(
  select 'accept mytable char prompt "Enter table name: "'||chr(13)||chr(10) as prompt from dual
  union all
  select 'accept busdate date format ''YYYY-MM-DD'' prompt "Enter business date (YYYY-MM-DD): "' from dual
)
where &param = 1;
spool off
set termout on head on feedback on

@prompt_for_tablename.sql
host del prompt_for_tablename.sql

declare
    vari_axu number;
begin
    &if_param_is_1 dbms_output.put_line ('work here');
    &if_param_is_1 select count(*) into vari_axu from &mytable where created > date '&busdate';
    &if_param_is_1 dbms_output.put_line('Count of &mytable created after &busdate: ' || vari_axu);
    &if_param_is_1 return;

    dbms_output.put_line ('do not work' );
end;
/

Uji kelulusan param sebagai 2:

SQL> @demo
Enter option 1-9: 2

do not work

PL/SQL procedure successfully completed.

Uji kelulusan param sebagai 1:

SQL> @demo
Enter option 1-9: 1
Enter table name: user_objects
Enter business date (YYYY-MM-DD): 2010-01-01

work here
Count of user_objects created after 2010-01-01: 93772

PL/SQL procedure successfully completed.

(Anda dapat menekan successfully completed pesan dengan set feedback off .)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-21700:objek tidak ada atau ditandai untuk dihapus untuk Associative Array sebagai parameter input yang dipanggil dari ODP.NET

  2. Menjalankan Total oleh Grup SQL (Oracle)

  3. Permintaan Oracle menggunakan 'suka' pada kolom nomor yang diindeks, kinerja buruk

  4. Dapatkan waktu eksekusi skrip sql di Oracle sqlplus

  5. ORA-00054:sumber daya sibuk dan dapatkan dengan SEKARANG ditentukan