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 ¶m:
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 ¶m = 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 ¶m = 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 ¶m:
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 ¶m = 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
.)