SELECT INTO và trả nhiều giá trị
SELECT INTO là cầu nối cơ bản giữa SQL và logic thủ tục: lấy dữ liệu từ bảng vào biến để kiểm tra, tính toán hoặc trả về caller.
SELECT ... INTO
Trong PL/SQL, SELECT cot1, cot2 INTO bien1, bien2 FROM ... yêu cầu kết quả đúng một dòng.
- 0 dòng: Oracle phát
NO_DATA_FOUND. - Nhiều hơn 1 dòng: Oracle phát
TOO_MANY_ROWS.
Số cột SELECT phải khớp số biến INTO và kiểu dữ liệu phải tương thích.
Trả nhiều giá trị
Procedure không có RETURN như function, nhưng có thể trả nhiều OUT parameters. Ví dụ p_name và p_salary cùng được điền từ một SELECT INTO.
SELECT INTO hay cursor?
- Dùng SELECT INTO khi chắc chắn cần một dòng.
- Dùng cursor loop hoặc bulk collect khi cần nhiều dòng.
- Dùng aggregate như COUNT khi muốn luôn có đúng một dòng.
Đừng dùng WHEN OTHERS để che NO_DATA_FOUND. Hãy quyết định rõ: không có dữ liệu là lỗi hay kết quả hợp lệ.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
SELECT ... INTO
Trong PL/SQL, SELECT cot1, cot2 INTO bien1, bien2 FROM ... yêu cầu kết quả đúng một dòng.
- 0 dòng: Oracle phát
NO_DATA_FOUND. - Nhiều hơn 1 dòng: Oracle phát
TOO_MANY_ROWS.
Số cột SELECT phải khớp số biến INTO và kiểu dữ liệu phải tương thích.
Trả nhiều giá trị
Procedure không có RETURN như function, nhưng có thể trả nhiều OUT parameters. Ví dụ p_name và p_salary cùng được điền từ một SELECT INTO.
SELECT INTO hay cursor?
- Dùng SELECT INTO khi chắc chắn cần một dòng.
- Dùng cursor loop hoặc bulk collect khi cần nhiều dòng.
- Dùng aggregate như COUNT khi muốn luôn có đúng một dòng.
Đừng dùng WHEN OTHERS để che NO_DATA_FOUND. Hãy quyết định rõ: không có dữ liệu là lỗi hay kết quả hợp lệ.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Oracle PL/SQL. Browser không có Oracle Server; editor dùng dialect PL/SQL và nút bên dưới chạy mô phỏng trên dữ liệu mẫu.
Đang tải trình soạn thảo…
Tạo procedure get_department_name(p_department_id IN NUMBER, p_name OUT VARCHAR2) dùng SELECT name INTO p_name FROM departments.
Đang tải trình soạn thảo…
Viết anonymous block gọi get_employee_snapshot cho id 10, nhận v_name/v_salary và in cả hai.
Đang tải trình soạn thảo…
- Chạy thử truy vấn mẫu
- Hoàn thành bài tập (0/2)