2013-04-11 2 views
1

나는 DB2 저장 프로 시저를 가지고 놀고 있으며 다음 개념을 강조하는 데 어려움을 겪고 있습니다. 내가db2 저장 프로 시저 생성 동작

create or replace procedure test() 
begin 
insert into mytable(a) values ('a'); 
insert into mytable(a) values ('b'); 
insert into mytable(a) values ('c'); 
end 

아래의 간단한 같은 저장 프로 시저를 만들 때 은 내가 MYTABLE이 만드는 동안 채워집니다 것을 볼 수 있습니다. 'call test()'를 사용하여 데이터를 삽입하려고했지만 예상했던 것과 다를 수 있습니다. 내가 여기서 뭘 잘못하고 있는거야, 아니면 이렇게하는거야?

내가 같은 줄에 모든 것을 넣을 필요가 발견이 이상한 행동을 피하기 위해, 그리고 내가

create or replace procedure test() begin insert into mytable(a) values ('a'); insert into mytable(a) values ('b'); insert into mytable(a) values ('c');  end 
+1

명령 줄에 입력 하시겠습니까? 그렇다면 새 줄 문자를 이스케이프 처리해야합니다. 모든 정의를 파일에 넣고 전체 파일을 처리하는 것이 더 좋습니다. –

+0

@JamesAnderson : 이미이 일을하고 있습니다. 이 코드는 test.sql이라는 파일에 있으며 'db2 -v -t -f test.sql -m -z xti.out'명령을 사용합니다.다시 한 번 읽으면 그 행을 실행하는 것처럼 보입니다. –

+0

질문이나 질문에 DB2 LUW 관련 질문이 있으면 기재하십시오. 이 동작은 다른 플랫폼에는 적용되지 않습니다. – WarrenT

답변

2

문제는 각 명령어의 종료 문자입니다.

insert into mytable (a) values ('a')@ 
create procedure test() 
    begin 
    insert into mytable (a) values ('b'); 
    [email protected] 

test.sql 그리고 당신은 실행됩니다 : 당신은 삽입과 저장 프로 시저의 정의와 test.sql라는 스크립트 파일이있는 경우

예를 들어, 다음 (고화질)이 될 것입니다 이 명령을 통한 스크립트

db2 [email protected] -f test.sql 

@ 기호는 종료 문자 (종료 문자 구분 기호를 나타내는 -td @ ​​옵션)를 나타냅니다. 이 점이 다릅니다. (세미 콜론) 때문에; 루틴 (저장 프로 시저, udf, 트리거) 내에서 종료 문자로 사용됩니다.

보시다시피 'a'값이 첫 번째 삽입물에 삽입됩니다. 'b'값은 저장 프로 시저에서 삽입됩니다.

삽입 한 내용을 확인하기 위해 정의 된 저장 프로 시저와 '본문'을보기 위해 DB2 카탈로그를 쿼리 할 수 ​​있습니다.

2

당신은 내가 어떤 "만들거나 교체 절차"를 호출 할 때 삽입 된 데이터를, 즉없는 기대가 ;이 명령문 종결 자임을 지정하는 -t 옵션을 사용합니다.

프로 시저 또는 다른 코드 블록을 작성할 때 전체 프로 시저 선언을 단일 문으로 간주해야하므로 문 자 료자로 세미콜론을 사용할 수 없습니다. DB2는 세미콜론 (semicolon)을 기반으로하는 여러 문장으로 분해합니다.

문장 종결자는 using the -tdX option으로 설정하십시오. DB2에서 표준 문 종료 자로 !을 사용하고 있으며, 나를 위해 잘 작동합니다 (으로 대체 될 수있는 !=을 제외한 DB2 구문에서는 사용되지 않습니다).

이 변경을하면 문제가 해결됩니다.

단 한 줄에 두는 것이 효과가 있었음에도 불구하고 어떤 차이점도 있기를 기대하지 않았기 때문에 놀랍습니다. (줄을 자동으로 문장 터미네이터로 처리하지만 사용자는 그것).

관련 문제