2011-09-26 33 views
26

Trong SQL Server chúng ta có thể sử dụng này:Khai báo một biến và thiết lập giá trị của nó từ một truy vấn SELECT trong Oracle

DECLARE @variable INT; 
SELECT @variable= mycolumn from myTable; 

Làm thế nào tôi có thể làm điều tương tự trong Oracle? Tôi hiện đang làm như sau:

DECLARE COMPID VARCHAR2(20); 
SELECT companyid INTO COMPID from app where appid='90' and rownum=1; 

Tại sao đây không phải là làm việc?

enter image description here

+0

Bất kỳ ý tưởng làm thế nào điều này có thể làm việc cho các loại như các đối tượng? – Avias

Trả lời

54

SELECT INTO

DECLARE 
    the_variable NUMBER; 

BEGIN 
    SELECT my_column INTO the_variable FROM my_table; 
END; 

Hãy chắc chắn rằng các truy vấn chỉ trả về một hàng duy nhất:

Theo mặc định, một tuyên bố SELECT INTO phải trả lại chỉ có một hàng. Nếu không, PL/SQL sẽ tăng ngoại lệ được xác định trước là TOO_MANY_ROWS và các giá trị của các biến trong mệnh đề INTO là không xác định. Đảm bảo mệnh đề WHERE của bạn đủ cụ thể để chỉ khớp một hàng

Nếu không có hàng nào được trả về, PL/SQL tăng NO_DATA_FOUND. Bạn có thể bảo vệ chống lại ngoại lệ này bằng cách chọn kết quả của một hàm tổng hợp, chẳng hạn như COUNT (*) hoặc AVG(), khi thực tế. Các hàm này được đảm bảo trả lại một giá trị duy nhất, ngay cả khi không có hàng nào khớp với điều kiện.

Lệnh SELECT ... BULK COLLECT INTO statement có thể trả về nhiều hàng. Bạn phải thiết lập các biến tập hợp để giữ kết quả. Bạn có thể khai báo mảng kết hợp hoặc bảng lồng nhau phát triển khi cần để giữ toàn bộ tập kết quả.

SQL con trỏ ẩn và thuộc tính của nó% NOTFOUND,% FOUND,% ROWCOUNT và% ISOPEN cung cấp thông tin về việc thực hiện câu lệnh SELECT INTO.

+0

DECLARE COMPID VARCHAR2 (20); CHỌN companyid INTO COMPID từ sasapplication nơi appid = '90 'và rownum = 1; Bạn có thể nói lý do tại sao sql này đang ném lỗi – user960567

+0

và thông báo lỗi sẽ là? – Thilo

+0

chỉ xem ở trên. – user960567

4

Không hoàn toàn chắc chắn những gì bạn đang sau nhưng trong PL/SQL bạn sẽ chỉ đơn giản là

DECLARE 
    v_variable INTEGER; 
BEGIN 
    SELECT mycolumn 
    INTO v_variable 
    FROM myTable; 
END; 

Ollie.

+0

Như @Thilo nói, có nhiều hơn để xem xét xung quanh chỉ synatx cụ thể này. Một chút thông tin về những gì bạn đang cố gắng đạt được sẽ cho phép chúng tôi điều chỉnh một phương pháp tốt hơn để điền biến của bạn. – Ollie

0

ORA-01.422: chính xác lấy lợi nhuận nhiều hơn số yêu cầu của hàng

nếu bạn không chỉ định các hồ sơ chính xác bằng cách sử dụng nơi mà điều kiện, bạn sẽ nhận được ngoại lệ trên

DECLARE 
    ID NUMBER; 
BEGIN 
    select eid into id from employee where salary=26500; 
    DBMS_OUTPUT.PUT_LINE(ID); 
END; 
0

Để lưu trữ một đầu ra hàng đơn lẻ thành một biến từ chọn vào truy vấn:

khai báo v_username varchare (20); SELECT tên người dùng vào v_username FROM users WHERE user_id = '7';

điều này sẽ lưu trữ giá trị của một bản ghi duy nhất vào biến v_username.


Để lưu trữ nhiều hàng đầu ra vào một biến từ các lựa chọn vào truy vấn:

bạn phải sử dụng chức năng listagg.listagg nối các hàng kết quả của một coloumn thành một coloumn đơn và cũng để phân biệt chúng, bạn có thể sử dụng một biểu tượng đặc biệt. sử dụng truy vấn như bên dưới SELECT listagg (tên người dùng || ',') trong nhóm (theo thứ tự tên người dùng) vào người dùng v_username FROM;

0

Một điểm bổ sung:

Khi bạn đang chuyển đổi từ tsql để plsql bạn phải lo lắng về no_data_found ngoại lệ

DECLARE 
    v_var NUMBER; 
BEGIN 
    SELECT clmn INTO v_var FROM tbl; 
Exception when no_data_found then v_var := null; --what ever handle the exception. 
END; 

Trong tsql nếu no data found sau đó biến số sẽ là null nhưng không exception

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