2016-08-02 1 views
1

내 응용 프로그램에서 스크립트를 실행하여 모든 업데이트와 함께 데이터베이스를 확장하고 변경합니다. 필자는 Firebird 1.5를 지원해야한다.Firebird 1.5 "execute if"절차

스크립트가 실패하고 오류를 수정하는 업데이트를 제공해야하는 경우가 있습니다. 그들은 항상 발생하지 않기 때문에, 내가 좋아하는 일을해야합니다 (테이블 열을 추가)가 존재 나던 경우

  1. 드롭 (FB 1.5에는 ALTER보기이 없기 때문에보기의 경우)이있는 경우
  2. 열을 추가
  3. 브로 처음 두 작업 잘 테이블

의 대장균에서 발견되지하지만 마지막하지 않는 경우

  • SQL을 실행

    세트 기간 ^;

    create or alter procedure addif(tab_name varchar(31), col_name varchar(31),data_type varchar(100)) as 
    BEGIN 
        if (not exists(select 1 from rdb$relation_fields where upper(rdb$relation_name) = upper(:tab_name) and upper(rdb$field_name) = upper(:col_name))) then 
        execute statement 'alter table '||tab_name||' add '||:col_name||' '||:data_type; 
    END 
    ^ 
    
    create or alter procedure dropif(object_name varchar(31)) as 
    begin 
        if (exists(select 1 from rdb$relations where rdb$view_blr is not null and 
         (rdb$system_flag is null or rdb$system_flag = 0) and upper(rdb$relation_name) = upper(:object_name))) then 
        execute statement 'drop view '||object_name; 
    end 
    ^ 
    
    create or alter procedure execif(tab_name varchar(31), col_name varchar(31), val varchar(100), sql varchar(8192)) as 
    declare s varchar(500); 
    declare i integer; 
    begin 
        s = 'select 1 from ' || :tab_name || ' where ' || :col_name || ' = ' || :val; 
        execute statement s into i; 
        if (i=0) then 
        execute statement sql; 
    end 
    ^ 
    set term ;^
    

    내가 실행하면

    execute procedure execif('prs','id','0','insert into ini(aval,akey) values (''555555'',''555555'');'); 
    

    아무 반응이 없습니다. 프로 시저를 디버깅하면 조건이 충족되면 행이 표시됩니다.

    execute statement sql;

    이 실행되지만 아무런 변화가 없습니다. sql에 무효 인 sql이 포함되어 있어도 아무 일도 일어나지 않습니다.

    나는 여기서 중요한 무엇인가 놓치고 있으며, 도움이 될 수 있다면 감사 할 것입니다.

    EDIT : exceute statement sql을 statement : sql로 변경했으며 sql을 asql로 변경했습니다.

  • 답변

    1

    몇 가지 테스트를 한 후에 적어도 firebird 1.5는 하나의 절차에서 두 개의 "명령문 실행"문을 처리 할 수 ​​없다는 것을 알았습니다. 그래서 저는이 모든 것을 두 개의 과정으로 나누었습니다.

    제 함수 값 되돌아 존재하는 테이블의 열에서, 상기 제는이 기능을 사용하고 제 기능 1. 여기

    를 반환하지 않는 경우 문을 실행하는 코드이다 :

    create or alter procedure valexists(tab_name varchar(31), col_name varchar(31), val varchar(100)) returns (result integer) as 
    begin 
        execute statement ('select 1 from ' || :tab_name || ' where ' || :col_name || ' = ' || :val) into result; 
        suspend; 
    end 
    ^ 
    
    create or alter procedure execif(tab_name varchar(31), col_name varchar(31), val varchar(100), sql varchar(8192)) as 
    begin 
    if (not exists (select 1 from valexists(:tab_name,:col_name,:val) where result=1)) then 
        execute statement :sql; 
    end 
    ^