PDA 프로그램중인데.. FUNCTION의 OUT PARAMETER를 받고 싶습니다. 0 7 3,491

by 배기염 [어플리케이션관련] function parameter pda [2015.05.19 14:16:19]


M3 SMART를 위한 PDA 프로그램을 개발중인데

윈도우에 데몬을 하나 두고

데몬으로 쿼리를 넘겨서 데몬에서 실행해서 데이터를 받아오도록 하고 있습니다.

기본적인 select, update, insert는 문제가 안되고 리턴값만 받는 펑션 실행도 문제 없는데

function 실행할때 리턴값 외에 out parameter값을 받으려고 합니다.

select function(in_param, out_param) from dual;

이런식으로 파라메터 넘겨서 out_param으로 값을 받고 싶은데 어떻게 해야 될까요?

by 아발란체 [2015.05.19 15:10:47]

데몬에서 어떤 방식으로 통신해서 DB 쿼리를 하고 있나용~ @.@)?


by 배기염 [2015.05.19 15:24:52]

데몬은 c#으로 개발되어 있고 소켓 통신을 하고 있구요.

PDA에서 쿼리를 만들어서 코드를 정해서 날려주면

데몬은 받아서 oraclecommand나 oracledataadapter를 통해 쿼리를 실행해서 넘겨줍니다.


by 아발란체 [2015.05.19 16:48:49]

소켓 통신이면, 소켓 관련 결과 값 받는거 API 쓰면 되지 않나용?

리스너가 있는 쪽에서는 조회 결과를 XML이나 구분자 값 있는 문자열이나, JSON 형태로 문자열 반하고용... 음... 데몬은 oraclecommand나 oracledataapadter를 통해 요청만 하고 값을 받는 부분이 전혀 없나용?


by 배기염 [2015.05.19 16:59:28]

아무래도 제가 설명을 제대로 못하는 부분이 더 큰것 같네요..

예를 들어, (10,'select sysdate from dual') 이런식으로 데몬에 넘겨주면

10이 executecommand라고 생각하고 'select sysdate from dual' 문장을 실행하면

나오는 데이터 셋을 PDA로 던져 주거나 합니다.

 

public const string SQL_EXECUTE_COMMAND_BYPASS = "10";
public const string SQL_EXECUTE_SCALAR_BYPASS = "20";
public const string SQL_EXECUTE_NONQUERY_TX_BYPASS = "30";
public const string SQL_EXECUTE_NONQUERY_NTX_BYPASS = "31";
public const string PROCEDURE_EXECUTE_NONQUERY_TX_BYPASS = "35";
public const string PROCEDURE_EXECUTE_NONQUERY_NTX_BYPASS = "36";

코드 정의가 이정도 되있습니다. 그래서 코드를 선택해서 형식이 맞는 쪽에 쿼리를 보내면

executenonquery 한다던지 executescalar한다던지 해서 결과값을 넘겨 주는거죠..

 

근데 여기서 문제점은 out parameter가 없는 function은

'select function(파라메터1, 파라메터2) from dual'

이렇게만 넘겨주면 function안의 return value만 넘겨받아서 쓰면 되는데

전 return value에 더해서 out parameter값을 받아서 쓰고 싶은거죠..


by 아발란체 [2015.05.19 17:18:54]

죄송합니다. 이해력이 ㅠㅠ 좀... 나빠서요.

 

SELECT 'TEST' AS val FROM DUAL 식의 결과는 받고

결과가 있는 함수 SELECT funcTest1('1', '고길동') FROM DUAL 식의 결과도 받는데

return이 없는 함수 SELECT funTest2('1', '홍길동') FROM DUAL 식의 결과를 받을 수 없다는 말씀이신가용?


by 배기염 [2015.05.19 17:41:00]

음.. 일단 다른방법으로 우회해서 사용하기로 했구요. 개발 기간이 짧아서 걍 패스하기로 했어요..ㅋ

return이 있는건 상관없이, 파라메터가 output이 있는건 select functest1(param1, param2) from dual로 돌리면 인수의 갯수가 안 맞아서 오류가 나는거에요.

 

declare 변수 선언

begin

 변수 := 데이터;

  functest(변수1, 변수2, 변수3, out변수);

  select out변수 into :aa from dual;

end;

 

이런식으로 aa값으로 out변수값을 받는 것 까진 했는데

시간이 더 걸릴것 같아서 패스하고 리턴값을 문자열로 받아서 잘라서 쓰기로 했어요..ㅋㅋ

프로젝트 끝나고 따로 연구해 봐야겠네요. 데몬을 수정해야 할듯..


by 쿼리back [2015.05.20 09:16:04]
- 간단하게 짜봤습니다.


CREATE OR REPLACE FUNCTION inout_fn (outparm IN OUT VARCHAR2)
RETURN VARCHAR2 IS
BEGIN
  outparm := 'Coming out';
  RETURN 'return param';
END inout_fn;



declare
 l_outvar varchar2(100);
 l_funcret varchar2(100);
Begin
 l_funcret := inout_fn(l_outvar);
 DBMS_OUTPUT.Put_line('return value is ' ||l_funcret||', out paramater is '||l_outvar);
END;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입