oracle 저장 프로세스가 결과 집합table 형식으로 되돌아오는 사례

3457 단어 oracle저장결과

--sys_refcursor와cursor의 장단점 비교


장점 비교

장점 1:


sys_refcursor는 저장 과정에서 매개 변수로table 형식의 구조 집합을 되돌릴 수 있다. (나는 그를table 유형이라고 생각하는데 이해하기 쉽고 사실은 커서 집합이다.)cursor는 저장 과정, 함수, 패키지 등의 실현체에만 사용할 수 있고 매개 변수로 사용할 수 없다.

장점 2:


sys_refcursor는 패키지에 매개 변수를 사용하여 데이터베이스를 대상으로 개방할 수 있습니다.하하.좋아해요.cursor는 안돼.

create or replace procedure p_test(p_cur out sys_refcursor) 
as 
begin 
   open p_cur for select * from emp; 
end p_test; 
declare
p_cur sys_refcursor;
i emp%rowtype;
begin
 p_test(p_cur);
 loop fetch p_cur 
  into i;
  exit when p_cur%notfound;
  DBMS_OUTPUT.PUT_LINE('---'||i.ename||'---'||i.empno);
  end loop;
  close p_cur;
end;
보충: Oracle 스토리지 프로세스가 select * from table 결과를 반환합니다.
1. 먼저 가방 만들기

create or replace package LogOperation is
 type listLog is ref cursor;
 procedure PCenterExamine_sel(listCenterExamine out listlog,testlist out listLog,numpage in decimal);
end;
2. 패키지의 바디 만들기

create or replace package body LogOperation is
 procedure PCenterExamine_sel
 (
  listCenterExamine out listlog,
  testlist out listlog,
  numpage in decimal
 ) 
 as
 begin
  open listCenterExamine for select * from Log_CenterExamine;
  open testlist for select * from Log_CenterExamine;
 end;
end;
3. 프로그램에서 저장 프로세스의 값을 호출합니다

public static DataSet RunProcedureGetDataSet(string storedProcName, OracleParameter[] parameters)
    {
      string connectionString ="192.168.1.1/db";
      using (OracleConnection connection = new OracleConnection(connectionString))
      {
        DataSet dataSet = new DataSet();
        connection.Open();
        OracleDataAdapter sqlDA = new OracleDataAdapter();
        sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
        sqlDA.Fill(dataSet, "dt");
        connection.Close();
        return dataSet;
      }
    }

private static OracleCommand BuildQueryCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
    {
      OracleCommand command = new OracleCommand(storedProcName, connection);
      command.CommandType = CommandType.StoredProcedure;
      foreach (OracleParameter parameter in parameters)
      {
        command.Parameters.Add(parameter);
      }
      return command;
    }
4. 몇 개의 out의refcursor가 있고 변수 ds에는 몇 개의 DataTable를 사용합니다.또한 입력 매개 변수 indecimal도 영향을 받지 않으며 저장 프로세스의 연산에 참가할 수 있습니다

OracleParameter[] paramDic = { 
          new OracleParameter("listCenterExamine",OracleType.Cursor),
          new OracleParameter("testlist",OracleType.Cursor),
          new OracleParameter("numpage",OracleType.Int32)};
        paramDic[0].Direction = ParameterDirection.Output;
        paramDic[1].Direction = ParameterDirection.Output;
        paramDic[2].Value = 1;
        ds = Model.OracleHelper.RunProcedureGetDataSet("LogOperation.PCenterExamine_sel", paramDic);
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기