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

Khai báo &thiết lập các biến trong một câu lệnh được chọn

Qua tìm kiếm mà tôi đã thực hiện, có vẻ như bạn không thể khai báo và đặt các biến như thế này trong câu lệnh Chọn. Điều này đúng hay tôi đang thiếu thứ gì đó?

Trong Oracle PL / SQL và SQL là hai ngôn ngữ riêng biệt với hai công cụ riêng biệt. Bạn có thể nhúng SQL DML trong PL / SQL và điều đó sẽ giúp bạn có được các biến. Chẳng hạn như khối PL / SQL ẩn danh sau đây. Lưu ý / ở phần cuối không phải là một phần của PL / SQL, nhưng yêu cầu SQL * Plus gửi khối trước đó.

declare 
    v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
    v_Count number;
begin
    select count(*) into v_Count
    from Usage
    where UseTime > v_Date1;
    dbms_output.put_line(v_Count);
end;
/

Vấn đề là một khối tương đương với mã T-SQL của bạn sẽ không hoạt động:

SQL> declare 
  2      v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
  3  begin
  4      select VisualId
  5      from Usage
  6      where UseTime > v_Date1;
  7  end;
  8  /
    select VisualId
    *
ERROR at line 4:
ORA-06550: line 4, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement

Để chuyển kết quả của một truy vấn ra khỏi PL / SQL, một khối ẩn danh, thủ tục được lưu trữ hoặc hàm được lưu trữ, một con trỏ phải được khai báo, mở và sau đó quay trở lại chương trình gọi. (Ngoài phạm vi trả lời câu hỏi này. CHỈNH SỬA: xem Nhận tập hợp kết quả từ quy trình được lưu trữ oracle)

Công cụ khách kết nối với cơ sở dữ liệu có thể có các biến liên kết riêng của nó. Trong SQL * Plus:

SQL> -- SQL*Plus does not all date type in this context
SQL> -- So using varchar2 to hold text
SQL> variable v_Date1 varchar2(20)
SQL>
SQL> -- use PL/SQL to set the value of the bind variable
SQL> exec :v_Date1 := '02-Aug-2010';

PL/SQL procedure successfully completed.

SQL> -- Converting to a date, since the variable is not yet a date.
SQL> -- Note the use of colon, this tells SQL*Plus that v_Date1
SQL> -- is a bind variable.
SQL> select VisualId
  2  from Usage
  3  where UseTime > to_char(:v_Date1, 'DD-Mon-YYYY');

no rows selected

Lưu ý ở trên là trong SQL Plus, có thể không (có thể sẽ không) hoạt động trong nhà phát triển Toad PL / SQL, v.v. Các dòng bắt đầu bằng biến và thực thi là SQL Các lệnh cộng. Chúng không phải là các lệnh SQL hoặc PL / SQL. Không có hàng nào được chọn vì bảng trống.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm JSON_QUERY () trong Oracle

  2. Cập nhật câu lệnh bằng mệnh đề

  3. Chọn mà không có mệnh đề FROM trong Oracle

  4. Chọn hàng thứ N từ một bảng trong Oracle

  5. Truy vấn tổng hợp Oracle SQL