Mục tiêu của tôi là viết một proc được lưu trữ có thể thu thập tất cả các giá trị trường từ nhiều hàng thành một biến đầu ra duy nhất (có thể là varchar (some_length)). Nó có vẻ là giải pháp lạ nhưng tôi đã khá tích cực của nó chỉ có một tôi có thể sử dụng ở tình huống đó im in Tôi đã không sử dụng Firebird trước và procs lưu trữ nhìn cách khác nhau hơn trong các hệ thống db nổi tiếng khác. Firebird của tôi là 1,5 và phương ngữ 3 (không chắc chắn ý nghĩa của nó). Vì vậy, có lẽ ai đó có thể giúp tôi với một ví dụ thuật toán.Thủ tục lưu trữ Firebird để ghép tất cả các giá trị trường từ nhiều hàng
Trả lời
Các thủ tục sau đây làm những gì bạn mô tả:
SET TERM !!;
CREATE PROCEDURE concat_names
RETURNS (concat VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(100);
BEGIN
concat = '';
FOR SELECT first_name || ' ' || last_name FROM employee INTO :name
DO BEGIN
concat = concat || name || ', ';
END
END!!
SET TERM ;!!
EXECUTE PROCEDURE concat_names;
Nhưng tôi đặt câu hỏi về sự khôn ngoan của giải pháp này. Làm thế nào để bạn biết VARCHAR đủ dài cho tất cả các hàng trong tập dữ liệu mong muốn của bạn?
Dễ dàng hơn và an toàn hơn khi chạy truy vấn để trả lại kết quả cho hàng ứng dụng theo hàng. Mỗi ngôn ngữ lập trình ứng dụng đều có các phương thức để nối chuỗi, nhưng quan trọng hơn là chúng có các phương thức linh hoạt hơn để quản lý sự tăng trưởng của dữ liệu. Bằng cách này, "phương ngữ" trong Firebird và InterBase đề cập đến một chế độ tương thích được giới thiệu để các ứng dụng được phát triển cho InterBase 5.x có thể làm việc với các phiên bản sau của InterBase và Firebird. Đó là gần mười năm trước, và AFAIK không cần sử dụng bất kỳ thứ gì thấp hơn phương ngữ 3.
Bạn phải kiểm tra giá trị rỗng khi nối, đây là ví dụ cho hai trường và dấu phân cách giữa chúng:
CREATE PROCEDURE CONCAT(
F1 VARCHAR(385),
F2 VARCHAR(385),
SEPARATOR VARCHAR(10))
RETURNS (
RESULT VARCHAR(780))
AS
begin
if ((:f1 is not null) and (:f1 <> '')) then
result = :f1;
if ((:f2 is not null) and (:f2 <> '')) then
if ((result is not null) and (result <> '')) then
begin
if ((:separator is not null) and (separator <> '')) then
result = result||separator||f2;
else
result = result||f2;
end
else
result = f2;
suspend;
end
Trả lại nhiều hàng bằng quy trình lưu trữ Firebird rất dễ dàng.
Không sử dụng:
execute procedure proc_name(value);
Thay vì sử dụng:
select * from proc_name(value);
- 1. PDO Lưu trữ thủ tục trả về giá trị
- 2. Cách lấy các giá trị trả về thủ tục lưu trữ từ một TableAdapter
- 3. Cách đơn giản để lập trình có được tất cả các thủ tục được lưu trữ
- 4. chạy thủ tục và trở lại lưu trữ các giá trị từ VBA
- 5. Câu lệnh Firebird CASE bên trong thủ tục lưu sẵn
- 6. Mẫu lưu trữ với các thủ tục được lưu trữ
- 7. Gọi thủ tục lưu trữ từ một thủ tục lưu trữ SQL Server
- 8. Gọi thủ tục lưu trữ trong một thủ tục được lưu trữ trong MySQL
- 9. C#/SQL Lấy tất cả các thủ tục được lưu trữ và mã số của chúng
- 10. Nhiều truy vấn VS Thủ tục lưu trữ
- 11. Thả tất cả các thủ tục được lưu trữ trong MySQL hoặc sử dụng các thủ tục được lưu trữ tạm thời
- 12. Làm thế nào để sử dụng một giá trị từ một thủ tục lưu sẵn trong một thủ tục khác?
- 13. lưu trữ thủ tục trả về varchar
- 14. Lưu trữ SQL Server Thủ tục lưu giữ giá trị trả về trong T-SQL
- 15. Tìm tất cả các cuộc gọi Thủ tục lưu trữ MySQL?
- 16. GRANT EXECUTE cho tất cả các thủ tục được lưu trữ
- 17. Giá trị vô hướng từ thủ tục lưu trữ qua Entity Framework
- 18. Bắt giá trị trả về từ thủ tục lưu trữ trong C#
- 19. Danh sách các thủ tục được lưu trữ từ Bảng
- 20. Nhận Quay trở lại giá trị gia tăng từ Thủ tục lưu trữ trong asp.net
- 21. MySQL: Chọn nhiều trường thành nhiều biến trong một thủ tục được lưu trữ
- 22. Thủ tục lưu trữ trả về nhiều bộ kết quả
- 23. Để chuyển hàng số lượng lớn dữ liệu vào các thủ tục được lưu trữ
- 24. Chức năng so với các thủ tục được lưu trữ
- 25. gọi thủ tục được lưu trữ từ solr
- 26. thực hiện thủ tục lưu trữ từ một DbContext
- 27. Làm thế nào để xác định tất cả các thủ tục lưu trữ tham chiếu đến một bảng cụ thể
- 28. Làm thế nào để lưu một thủ tục lưu trữ?
- 29. Làm thế nào để gọi thủ tục lưu sẵn từ một thủ tục lưu sẵn khác?
- 30. Làm thế nào để lấy giá trị vô hướng từ thủ tục lưu sẵn (ADO.NET)
Nếu bạn sử dụng Firebird 2.1, bạn có thể sử dụng chức năng tổng hợp DANH với cung cấp BLOB văn bản như một kết quả. I E. không có giới hạn của trường varchar. –
Nếu tôi nhớ lại, bạn không thể khai báo tham số thủ tục hoặc trả về giá trị bằng loại dữ liệu BLOB hoặc ARRAY. –
Bất kỳ giá trị null nào sẽ phá vỡ giải pháp này. – Nelson