Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Bỏ qua biến thay thế khi điều kiện không được thỏa mãn

Tập lệnh SQL * Plus dành cho 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;
/

Nếu người dùng nhập 1 ở lời nhắc đầu tiên, tập lệnh được tạo prompt_for_tablename.sql sẽ nhắc tên bảng. Đối với bất kỳ giá trị nào khác, nó sẽ không có tác dụng gì.

Sau đó, prompt_for_tablename.sql được chạy (và ngay lập tức bị xóa, vì chúng tôi không cần nó nữa). Bây giờ &mytable chứa giá trị mặc định của nó từ đầu tập lệnh hoặc bất kỳ giá trị nào mà người dùng đã nhập tại dấu nhắc.

Đã thêm:phiên bản có hai biến

Điều này tạo một truy vấn động dưới dạng:

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

Đối với mục đích demo, bạn có thể nhập tên bảng là user_objects (nơi created là một cột ngày tháng).

Rõ ràng là kiểu xây dựng này trở nên phức tạp và dễ xảy ra lỗi vì người dùng phải chỉ định một bảng có tên cột dự kiến, vì vậy tôi không chắc tôi khuyên bạn nên đi quá xa theo đường dẫn này, nhưng dù sao thì:

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

Kiểm tra vượt qua tham số là 2:

SQL> @demo
Enter option 1-9: 2

do not work

PL/SQL procedure successfully completed.

Kiểm tra vượt qua tham số là 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.

(Bạn có thể chặn successfully completed tin nhắn có 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. Làm cách nào để tạo mệnh đề WHERE động?

  2. ORA-19011:Bộ đệm chuỗi ký tự quá nhỏ

  3. ERROR- ORA-00060:deadlock được phát hiện trong khi chờ tài nguyên

  4. Chính sách vá lỗi

  5. Kết nối với cơ sở dữ liệu Oracle với Node.js Windows