2008-10-08 35 views
5

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

5

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.

+0

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. –

+1

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. –

+1

Bất kỳ giá trị null nào sẽ phá vỡ giải pháp này. – Nelson

0

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 
0

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); 
Các vấn đề liên quan