2011-11-07 43 views
6

Mặc dù đã dành một giờ nghiên cứu, tôi dường như không thể tìm ra cách xác định chính xác một biến và sau đó sử dụng nó trong SQL của bạn.Phân bổ SQL biến Oracle đơn giản

Đây là những gì tôi đã cho đến nay sản xuất:

DECLARE startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy');

trong đó tôi nhận được câu trả lời:

ORA-06.550: dòng 1, cột 63: PLS-00.103: Gặp biểu tượng "kết thúc tệp" khi mong đợi một trong các điều sau:

bắt đầu gói loại thủ tục phụ kiểu pragma sử dụng biểu mẫu hiện tại trỏ

Chi tiết: DECLARE STARTDATE NGÀY: = to_date ('03/11/2011' , 'dd/mm/yyyy'); Lỗi tại dòng 1 ORA-06550: dòng 1, cột 63: PLS-00103: Đã gặp phải biểu tượng "kết thúc tệp" khi mong đợi một trong số các mục sau:

bắt đầu sử dụng biểu mẫu gói kiểu thủ tục loại phụ pragma hiện tại con trỏ

Tôi rất muốn tìm hiểu cách thực hiện một tác vụ đơn giản như vậy!

+3

Biến là một cấu trúc ứng dụng khách. Bạn cần cho chúng tôi biết khách hàng nào bạn đang sử dụng. – APC

+0

@APC - Tôi đang sử dụng TOAD –

Trả lời

10

Tuyên bố biến của bạn là chính xác.

Từ khóa DECLARE được sử dụng để xác định các biến được sắp xếp trong khối PL/SQL (có phần được phân tách bằng BEGINEND;). Bạn muốn sử dụng biến này như thế nào?

Sau đây PL/SQL hoạt động tốt đối với tôi:

DECLARE 
    startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy'); 
    reccount INTEGER; 
BEGIN 
    SELECT count(*) INTO reccount 
     FROM my_table tab 
     WHERE tab.somedate < startDate; 
    dbms_output.put_line(reccount); 
END; 

Bạn cũng có thể sử dụng câu lệnh DEFINE sử dụng biến thay thế chuỗi đơn giản. Chúng phù hợp cho một khách hàng như SQL/PLUS hoặc TOAD.

DEFINE start_date = "to_date('03/11/2011', 'dd/mm/yyyy')" 
SELECT COUNT(*) from my_table tab where tab.some_date < &start_date; 
+1

Vì vậy, không có cách nào để làm điều đó một cách ngắn gọn như trong MS SQL, nơi nó đơn giản là 'khai báo @varible set @ variable'? Sau này tôi muốn sử dụng biến trong mệnh đề 'WHERE', tôi sẽ làm điều đó như thế nào? Làm thế nào tôi cũng in biến thành màn hình? –

+0

Tôi không quen thuộc với MS SQL, nhưng nếu bạn đang đề cập đến một loại biến toàn cầu, có thể xác định biến trong gói, do đó làm cho nó hiển thị cho tất cả các thành viên của gói, mặc dù các biến toàn cục là thứ bạn có lẽ sẽ muốn tránh. Bạn có thể in biến thành màn hình bằng cách sử dụng ['dbms_output.put_line'] (http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_output.htm#i1000105). –

+0

Không phải là một biến toàn cầu - chỉ là một biến bình thường mà tôi có thể gán và sau đó sử dụng sau này trên –

3

Hãy nhớ rằng Oracle PL/SQL là không SQL.

PL/SQL là ngôn ngữ thủ tục. SQL không phải là thủ tục, nhưng bạn có thể xác định "biến" mà người dùng có thể nhập thông qua cú pháp "& var" (xem http://www.orafaq.com/node/515).

5

Để thực hiện những gì bạn đang cố gắng trong Toad, bạn không cần khai báo biến nào cả. Chỉ cần bao gồm biến của bạn được bắt đầu bằng dấu hai chấm và Toad sẽ nhắc bạn về giá trị của biến khi bạn thực hiện truy vấn. Ví dụ:

select * from all_tables where owner = :this_is_a_variable; 

Nếu điều này không làm việc ban đầu, kích chuột phải vào bất cứ nơi nào trong trình soạn thảo và chắc chắn rằng "Prompt cho Biến Thay" được chọn.

Nếu bạn thực sự muốn làm điều đó tương tự như cách SQL Server xử lý các biến (hoặc bạn muốn để có thể làm điều tương tự trong SQL * Plus), bạn có thể viết nó như sau:

var this_is_a_variable varchar2(30); 

exec :this_is_a_variable := 'YOUR_SCHEMA_NAME'; 

print this_is_a_variable; 

select * from all_tables where owner = :this_is_a_variable; 

Tuy nhiên, để thực hiện công việc này trong Toad, bạn sẽ cần chạy nó thông qua "Execute as script", thay vì lệnh "Execute statement" điển hình.

0

bạn có thể vui lòng thử điều này:

DEF startDate = to_date('03/11/2011', 'dd/mm/yyyy'); 
Select &startDate from dual; 
3

Đây là một bài cũ, nhưng trong trường hợp bất cứ ai tình cờ về vấn đề này (như tôi vừa làm), bạn có thể xử lý này với một CTE:

with params as (
     select date '2011-11-03' as startdate 
     from dual 
    ) 
select . . . 
from params cross join 
    . . . 

Hầu như cùng một cú pháp hoạt động trong SQL Server (trừ các công cụ đặc biệt là datefrom dual).

Các vấn đề liên quan