database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
ㆍDB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DB2 Q&A 1625 게시물 읽기
No. 1625
스토어드 프로시져 빌딩
작성자
MARIN
작성일
2008-06-03 02:00
조회수
15,751

제가 막 스토어드 프로시져를 만드려고 하는데요


CREATE PROCEDURE NEW_SALARY(IN p_empno CHAR(4),OUT p_empname VARCHAR(15))

                                   

specific newsalary

dynamic result sets 1

LANGUAGE SQL

BEGIN

 

END




begin과 end사이에 sql문 넣기만 하면 에러가 나요


예를들어, DECLARE SQLSTATE CHAR(5);


이렇게 넣어주면 에러가 나요. 저 상태에선 프로시저가 생성이 됩니다. 


왜 그럴까요?? 좀 가르쳐 주세요

이 글에 대한 댓글이 총 5건 있습니다.

dynamic result sets 1 때문인거 같습니다. result set 개수 만큼 cursor를 open 해야 합니다. 
cursor를 open하지 않는 다면 이 부분을 삭제해보세요.

drop procedure NEW_SALARY1
@
CREATE PROCEDURE NEW_SALARY1(IN p_empno DEC,OUT p_empname INT)
specific newsalary1
dynamic result sets 3
LANGUAGE SQL
BEGIN
  DECLARE C1 CURSOR WITH RETURN FOR
    SELECT * FROM T2
      WHERE C1=p_empno;



  DECLARE C2 CURSOR WITH RETURN FOR
    SELECT * FROM T2
      WHERE C1=p_empno;


  DECLARE C3 CURSOR WITH RETURN FOR
    SELECT * FROM T2
      WHERE C1=p_empno;

  OPEN C1;
  OPEN C2;
  OPEN C3;
END

 db2 "call NEW_SALARY1(2,?)"

  Value of output parameters
  --------------------------
  Parameter Name  : P_EMPNAME
  Parameter Value : -


  Result set 1
  --------------

  C1                     C2        
  ---------------------- -----------
                      2.           1

  1 record(s) selected.


  Result set 2
  --------------

  C1                     C2        
  ---------------------- -----------
                      2.           1

  1 record(s) selected.


  Result set 3
  --------------

  C1                     C2        
  ---------------------- -----------
                      2.           1

  1 record(s) selected.

  Return Status = 0

조는 냥이님이 2008-06-03 10:16에 작성한 댓글입니다.
이 댓글은 2008-06-03 10:19에 마지막으로 수정되었습니다. Edit

답변감사드립니다

제가 정말 무언가 잘못알고 잇는건지... 

CMD창에 DB연결한다음 저 CREATE PROCEDURE 구문 입력하는거 맞죠?? SQL구문처럼.


근데. DYNAMIC RESULT SETS 지워도 보고

아랫분이 써주신 코드 그대로 쳐봤는데요

___________________________________________

------------------------------ 입력된 명령 ------------------------------
CREATE PROCEDURE NEW_SALARY1(IN p_empno DEC,OUT p_empname INT)
specific newsalary1
dynamic result sets 3
LANGUAGE SQL
BEGIN
  DECLARE C1 CURSOR WITH RETURN FOR
    SELECT * FROM T2
      WHERE C1=p_empno;

 


  DECLARE C2 CURSOR WITH RETURN FOR
    SELECT * FROM T2
      WHERE C1=p_empno;


  DECLARE C3 CURSOR WITH RETURN FOR
    SELECT * FROM T2
      WHERE C1=p_empno;

  OPEN C1;
  OPEN C2;
  OPEN C3;
END;
-------------------------------------------------------------------------
CREATE PROCEDURE NEW_SALARY1(IN p_empno DEC,OUT p_empname INT)
specific newsalary1
dynamic result sets 3
LANGUAGE SQL
BEGIN
  DECLARE C1 CURSOR WITH RETURN FOR
    SELECT * FROM T2
      WHERE C1=p_empno
DB21034E  명령이 유효한 명령행 처리기 명령이 아니므로 SQL문으로 처리되었습니다.
SQL 처리 중에 이 명령은 다음을 리턴했습니다.
SQL0104N  "WHERE C1=p_empno" 다음에 예기치 않은 토큰 "END-OF-STATEMENT"이(가)
있었습니다. 예상한 토큰은 "<psm_semicolon>"입니다.  LINE NUMBER=8.
SQLSTATE=42601

DECLARE C2 CURSOR WITH RETURN FOR SELECT * FROM T2 WHERE C1=p_empno
SQL0104N  "WITH" 다음에 예기치 않은 토큰 "RETURN"이(가) 있었습니다. 예상한
토큰은 "HOLD"입니다.  SQLSTATE=42601

DECLARE C3 CURSOR WITH RETURN FOR SELECT * FROM T2 WHERE C1=p_empno
SQL0104N  "WITH" 다음에 예기치 않은 토큰 "RETURN"이(가) 있었습니다. 예상한
토큰은 "HOLD"입니다.  SQLSTATE=42601

OPEN C1
DB21028E  커서 "C1"이(가) 선언되지 않았습니다.

OPEN C2
DB21028E  커서 "C2"이(가) 선언되지 않았습니다.

OPEN C3
DB21028E  커서 "C3"이(가) 선언되지 않았습니다.

END
DB21034E  명령이 유효한 명령행 처리기 명령이 아니므로 SQL문으로 처리되었습니다.
SQL 처리 중에 이 명령은 다음을 리턴했습니다.
SQL0104N  "END" 다음에 예기치 않은 토큰 "END-OF-STATEMENT"이(가) 있었습니다.
예상한 토큰은 "JOIN <joined_table>"입니다.  SQLSTATE=42601

SQL0104N  "END" 다음에 예기치 않은 토큰 "END-OF-STATEMENT"이(가) 있었습니다. 예상한 토큰은 "JOIN <joined_table>                              "입니다.

설명:

텍스트 "<text>" 다음에 지정된 토큰에서 SYSPROC.ADMIN_CMD 프로시저의 입력
명령 문자열 또는 SQL문의 구문 오류가 발견되었습니다. "<text>" 필드는 SQL
문 또는 SYSPROC.ADMIN_CMD 프로시저의 입력 명령 문자열에서 유효하지 않은
토큰 앞에 오는 20자를 나타냅니다.

도움을 주기 위해 유효한 토큰의 목록 중 일부가 "<token-list>"(으)로 SQLCA
의 SQLERRM 필드에 제공됩니다. 이 목록은 명령문이 해당 지점까지는 올바르
다고 가정합니다.

명령문을 처리할 수 없습니다.

사용자 응답:

지정된 토큰 영역에 있는 명령문을 검토하고 정정하십시오.

  sqlcode:  -104

  sqlstate:  42601

 

 이렇게 나오네요. ibm 명령어 편집기에서 넣었구요. ㅠㅠ
MARIN님이 2008-06-03 11:40에 작성한 댓글입니다. Edit

sp, function, trigger는 빌드 방법이 좀 다릅니다. 하나의 sp안에 여러문장이 들어가기 때문에 해당 sp가 끝나는 지점을 지정해주고 빌드를 해야 합니다. 


1. db2cmd 창 실행

시작>실행>db2cmd


2. db connect 

db2 connect to dbname user using

 


3. 소스파일 생성 후 저장

예로 1.db2 를 파일명으로 하겠습니다. 


drop procedure NEW_SALARY1

@

CREATE PROCEDURE NEW_SALARY1(IN p_empno DEC,OUT p_empname INT)

specific newsalary1

dynamic result sets 1

LANGUAGE SQL

BEGIN

  DECLARE C1 CURSOR WITH RETURN FOR

    SELECT * FROM T2

      WHERE C1=p_empno;

 OPEN C1;

END


-> 끝나는 부분에 @ 등의 문자를 붙입니다. 


4. compile 


db2 -td@ -vf 1.db2 

-> @는 소스파일에서 각각의 명령을 구분짓는 구분자 입니다. 



그외로 DB2 Application Development Client 에 들어있는 개발 툴을 사용하셔도 됩니다.

조는 냥이님이 2008-06-03 14:09에 작성한 댓글입니다.
이 댓글은 2008-06-03 14:20에 마지막으로 수정되었습니다. Edit

정말 감사합니다 ㅠㅠ 



마지막으로 죄송한데. 



1.db2라는 파일은 어디에 저장해야 되는 거죠??


텍스트 파일로 소스 쳐서 db2로 확장자만 바꾸면 되는거죠?? ㅠㅠ 





친절하게 대답해주셔서 정말 감사합니다.

marin님이 2008-06-04 06:03에 작성한 댓글입니다. Edit

db2cmd 창의 커서앞에 보이는 위치에 해당 파일을 만드시거나 파일이 위치한 디렉토리로 cd 를 하시면 됩니다. 
조는 냥이님이 2008-06-04 08:55에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1628CLI0109E 문자열 데이터 오른쪽 절단. SQLSTATE=22001 에러 [3]
김명조
2008-06-04
13752
1627db2 쿼리와 웹상에서의 처리 방법이... [1]
teduri
2008-06-04
10435
1626cli 질문드립니다. [2]
이도희
2008-06-04
10138
1625스토어드 프로시져 빌딩 [5]
MARIN
2008-06-03
15751
162380040e14 에러의 예외문은 못하나요?
teduri
2008-06-02
10789
1622가로로 나오는 값을 세로로 나오게 하고싶습니다. [3]
조동연
2008-06-02
12879
1620IDENTITY ALWAYS 컬럼 값 받아오는 방법 [1]
조성환
2008-05-30
11237
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다