문제

내 목표는 여러 행에서 모든 필드 값을 하나의 단일 출력 변수 (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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top