sql >> Database >  >> RDS >> Oracle

Substitutievariabele negeren wanneer niet aan de voorwaarde is voldaan

SQL*Plus-script voor 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;
/

Als de gebruiker 1 . invoert bij de eerste prompt, het gegenereerde script prompt_for_tablename.sql zal om een ​​tabelnaam vragen. Voor elke andere waarde doet het niets.

Dan prompt_for_tablename.sql wordt uitgevoerd (en onmiddellijk verwijderd, omdat we het niet meer nodig hebben). Nu &mytable bevat ofwel de standaardwaarde vanaf het begin van het script, of wat de gebruiker bij de prompt heeft ingevoerd.

Toegevoegd:versie met twee variabelen

Dit bouwt een dynamische query op als:

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

Voor demo-doeleinden kunt u de tabelnaam invoeren als user_objects (waar created is een datumkolom).

Het is duidelijk dat dit soort constructie ingewikkeld en foutgevoelig wordt, omdat de gebruiker een tabel moet specificeren met de verwachte kolomnaam, dus ik weet niet zeker of ik aanraad om te ver op dit pad te gaan, maar hoe dan ook:

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

Test geslaagd param als 2:

SQL> @demo
Enter option 1-9: 2

do not work

PL/SQL procedure successfully completed.

Test geslaagd param als 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.

(U kunt de successfully completed onderdrukken berichten met set feedback off .)




  1. Hoe make_interval() werkt in PostgreSQL

  2. Genummerde typen in SQL Server 2008?

  3. Ondersteunt de MySQLdb-module voorbereide instructies?

  4. Optimaliseer MySQL self-join-query