sql >> Databasteknik >  >> RDS >> Oracle

Ignorerar substitutionsvariabel när villkoret inte är uppfyllt

SQL*Plus-skript för 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;
/

Om användaren anger 1 vid den första prompten, det genererade skriptet prompt_for_tablename.sql kommer att fråga efter ett tabellnamn. För något annat värde gör det ingenting.

Sedan prompt_for_tablename.sql körs (och raderas omedelbart, eftersom vi inte behöver det längre). Nu &mytable innehåller antingen dess standardvärde från början av skriptet, eller vad användaren angav vid prompten.

Tillagt:version med två variabler

Detta skapar en dynamisk fråga som:

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

För demoändamål kan du ange tabellnamnet som user_objects (där created är en datumkolumn).

Uppenbarligen blir den här typen av konstruktion komplicerad och felbenägen eftersom användaren måste ange en tabell som har det förväntade kolumnnamnet, så jag är inte säker på att jag rekommenderar att gå för långt på den här vägen, men ändå:

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

Testa att klara param som 2:

SQL> @demo
Enter option 1-9: 2

do not work

PL/SQL procedure successfully completed.

Testa att klara param som 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.

(Du kan undertrycka koden successfully completed meddelanden med set feedback off .)




  1. Hur man tar bort inläggsrevisioner med WP-CLI

  2. Relationen hittades inte med Postgres i en Eclipse Hibernate-applikation

  3. hur man får liknande objekt baserat på taggar

  4. Hur kan jag räkna antalet rader som en MySQL-fråga returnerade?