여러 행에서 모든 필드 값을 연결하기위한 Firebird 저장 절차
-
06-07-2019 - |
문제
내 목표는 여러 행에서 모든 필드 값을 하나의 단일 출력 변수 (varchar (some_length))에 수집 할 수있는 저장된 Proc를 작성하는 것입니다. 그것은 이상한 솔루션처럼 보일지 모르지만 그 상황에서 내가 사용할 수있는 유일한 것은 긍정적입니다. 나는 이전에 Firebird를 사용하지 않았고 저장된 Procs는 다른 잘 알려진 DB 시스템과는 다르게 보입니다. 내 파이어 버드는 1.5이고 방언 3입니다 (그것이 무엇을 의미하는지 잘 모르겠습니다). 그래서 누군가가 알고리즘 예제로 나를 도울 수있을 것입니다.
해결책
다음 절차는 다음과 같이 설명합니다.
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;
그러나 나는이 해결책의 지혜에 의문을 제기한다. Varchar가 원하는 데이터 세트의 모든 행에 충분히 길다는 것을 어떻게 알 수 있습니까?
결과를 행으로 응용 프로그램 행에 반환하기 위해 쿼리를 실행하는 것이 훨씬 쉽고 안전합니다. 모든 응용 프로그램 프로그래밍 언어에는 문자열을 연결하는 방법이 있지만 더 중요한 것은 데이터의 성장을 관리하는보다 유연한 방법이 있다는 것입니다.
그건 그렇고, Firebird 및 Interbase의 "Dialect"는 Inter -Base 5.X 용 응용 프로그램이 이후 버전의 인터베이스 및 파이어 버드에서 작동 할 수 있도록 호환성 모드를 나타냅니다. 거의 10 년 전이었고, Afaik은 오늘날 방언 3보다 낮은 것을 사용할 필요가 없습니다.
다른 팁
연결할 때는 NULL 값을 테스트해야합니다. 다음은 두 개의 필드와 그 사이의 분리기에 대한 예입니다.
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
Firebird 저장 절차를 사용하여 여러 행을 반환하는 것은 매우 쉽습니다.
사용하지 마십시오 :
execute procedure proc_name(value);
대신 :
select * from proc_name(value);