Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Ignorowanie zmiennej podstawienia, gdy warunek nie jest spełniony

Skrypt SQL*Plus dla 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;
/

Jeśli użytkownik wpisze 1 przy pierwszym monicie wygenerowany skrypt prompt_for_tablename.sql zapyta o nazwę tabeli. Dla każdej innej wartości nic nie da.

Następnie prompt_for_tablename.sql jest uruchamiany (i natychmiast usuwany, ponieważ już go nie potrzebujemy). Teraz &mytable zawiera albo swoją domyślną wartość od początku skryptu, albo cokolwiek, co użytkownik wprowadził w zgłoszeniu.

Dodano:wersja z dwiema zmiennymi

To tworzy dynamiczne zapytanie jako:

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

W celach demonstracyjnych możesz wpisać nazwę tabeli jako user_objects (gdzie created to kolumna daty).

Oczywiście tego rodzaju konstrukcja staje się skomplikowana i podatna na błędy, ponieważ użytkownik musi określić tabelę, która ma oczekiwaną nazwę kolumny, więc nie jestem pewien, czy zalecam pójście za daleko tą ścieżką, ale i tak:

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;
/

Przetestuj przekazywanie parametru jako 2:

SQL> @demo
Enter option 1-9: 2

do not work

PL/SQL procedure successfully completed.

Przetestuj przekazywanie param jako 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.

(Możesz pominąć successfully completed wiadomości z 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. Błąd:Ta funkcja nie jest dostępna dla używanej bazy danych

  2. Oracle SQL, aby zmienić typ kolumny z numeru na varchar2, gdy zawiera dane

  3. Najlepszy sposób na okresowe uruchamianie zapytań Oracle

  4. Jak znaleźć numer linii, nazwę procedury w PL/SQL w przypadku błędu?

  5. Plsql, aby przeliterować numer (waluta) na włoską walutę bez zakodowanego numeru tłumaczenia