返回从Oracle记录集使用Oracle函数,它的参数到.NET [英] Returning a recordset from Oracle to .Net using an Oracle function that takes arguments

查看:132
本文介绍了返回从Oracle记录集使用Oracle函数,它的参数到.NET的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前在它返回管道分隔一个连接字符串,Oracle数据库以下功能可按。这是正在被更新到.NET 3.5使用传统的应用程序。该exiisting应用地连接了返回的结果集为一个VARCHAR2数据类型。我想要做的就是返回整个结果集返回给我的.NET客户端。在MS SQL相当于什么,我试图完成一个简单的SELECT * FROM TBL WHERE ID = @id我不会用的一些概念,Oracle使用。 I't看起来像电子混合OOP和SQL查询。我读过这个多的例子,但似乎无法找到我在寻找什么。能否请你帮忙吗?

  CREATE OR REPLACE FUNCTION DOCSADMIN.GET_DOCS(
    RECID数量) - 记录ID
    RETURN VARCHAR2  - 连接字符串,通过配管
IS
    RETVAL VARCHAR2(5000):='';
    文档字符串VARCHAR2(5000):='';
    VARCHAR2可采用DocName(5000):='';
    DOCNUMBER数;
    STATUS VARCHAR2(5000):='';
    DOCTYPE VARCHAR2(5000):='';
    EDITDATE日期:='';
/ ******************* *****************************
   名称:GET_DOCS
   目的:从个人资料表拉动相关文档
************************************************** ************ /


   CURSOR GETDOCINFO的是选择DOCNUMBER,可采用DocName,CUSTOM_STATUS,DOCUMENTTYPES.DESCRIPTION,LAST_EDIT_TIME
        从概要,DOCUMENTTYPES,表格WHERE NAD_APID = IN_APID和PROFILE.FORM = FORMS.SYSTEM_ID和
        DOCUMENTTYPE = DOCUMENTTYPES.SYSTEM_ID和FORM_NAME ='DOCS_PROFILE'ORDER BY DOCNUMBER;

开始

    OPEN GETDOCINFO;
        --get第一条记录
        FETCH GETDOCINFO INTO DOCNUMBER,可采用DocName,地位,DOCTYPE,EDITDATE;
        --LOOP通过所有相关的文档和抓取信息
        WHILE GETDOCINFO%FOUND LOOP

            开始

                文档字符串:= DOCNUMBER || |〜|' || ||可采用DocName |〜|' ||状态|| |〜|' || DOCTYPE || |〜|' || WS_EDITDATE;

                RETVAL:= RETVAL ||文档字符串|| '| ^ |';

                GOTO STARTOVER;

            结束;

            << STARTOVER>>

            FETCH GETDOCINFO INTO DOCNUMBER,可采用DocName,地位,DOCTYPE,EDITDATE;

        END LOOP;

   关闭GETDOCINFO;

   返回RETVAL;

   例外
     WHEN NO_DATA_FOUND THEN
       空值;
     WHEN OTHERS THEN
        - 考虑记录

 该错误,然后重新加注
       提高;
END GET_DOCS;
/
 

解决方案

那么,你可以转换功能的步骤,并拥有的 SYS_REFCURSOR 键入OUT参数。随着甲骨文和.Net可以传回一个游标遍历,作为一个读者。

样品Oracle过程:

  CREATE OR REPLACE PROCEDURE TEST_SCHEMA.TEST_PROCEDURE(
  OUT_DATA OUT SYS_REFCURSOR;
) 如
开始
  OPEN FOR OUT_DATA
  SELECT COL1,
         COL2
    从TEST_SCHEMA.TEST_TABLE;
END test_procedure;
 

示例.NET结尾:

 用(为OracleConnection连接=新的OracleConnection(CONNSTRING))
使用(的OracleCommand命令= connection.CreateCommand()){
  command.CommandType = CommandType.StoredProcedure;
  command.CommandText =TEST_SCHEMA.TEST_PROCEDURE;
  command.Parameters.Add(OUT_DATA,OracleType.Cursor)
      .Direction = ParameterDirection.Output;

  connection.Open();
  command.ExecuteNonQuery();
  OracleDataReader读卡器=
      command.Parameters [OUT_DATA]值作为OracleDataReader。

  如果(读者!= NULL){
    使用(阅读器){
      而(reader.Read()){
        字符串COL1 =读卡器[COL1]作为串;
        字符串COL2 =读卡器[COL2]作为串;
      }
    }
  }
}
 

请务必关闭游标你使用它完成后(如上所完成的使用(阅读器)语句)。

所以,你的情况,你也许可以创建一个输出原始光标定位到函数的过程,然后就遍历光标在.net上面列出。刚一说明,从Oracle侧列名很重要,将与你在.NET中使用了什么。

I currently have the following funciton in an oracle database that returns a concatenated string seperated by pipes. It's a legacy application that is being updated to use .net 3.5. The exiisting application concatenates the returned result set into a VARCHAR2 data type. What I want to do is return the entire result set back to my .net client. The MS SQL equivalent of what I'm trying to accomplish is a simple "SELECT * FROM TBL WHERE id = @id" I'm not use to some of the concepts Oracle uses. I't seems like e blend of OOP and SQL querying. I've read multiple examples on this but can't seem to find exactly what I'm looking for. Can you please help?

CREATE OR REPLACE FUNCTION DOCSADMIN.GET_DOCS (
    RECID IN NUMBER) -- RECORD ID
    RETURN VARCHAR2 -- CONCATENATED STRING WITH PIPES
IS
    RETVAL          VARCHAR2(5000) :='';
    DOCSTRING       VARCHAR2(5000) :='';    
    DOCNAME      VARCHAR2(5000) :='';
    DOCNUMBER    NUMBER;
    STATUS       VARCHAR2(5000) :='';
    DOCTYPE      VARCHAR2(5000) :='';
    EDITDATE     DATE :='';
/******************************************************************************
   NAME:       GET_DOCS
   PURPOSE:    Pulls associated docs from profile table
******************************************************************************/


   CURSOR GETDOCINFO IS SELECT DOCNUMBER, DOCNAME, CUSTOM_STATUS, DOCUMENTTYPES.DESCRIPTION, LAST_EDIT_TIME
        FROM PROFILE, DOCUMENTTYPES, FORMS WHERE NAD_APID = IN_APID AND PROFILE.FORM = FORMS.SYSTEM_ID AND 
        DOCUMENTTYPE = DOCUMENTTYPES.SYSTEM_ID AND FORM_NAME = 'DOCS_PROFILE' ORDER BY DOCNUMBER;

BEGIN

    OPEN GETDOCINFO;
        --GET THE FIRST RECORD
        FETCH GETDOCINFO INTO DOCNUMBER, DOCNAME, STATUS, DOCTYPE, EDITDATE;
        --LOOP THROUGH ALL ASSOCIATED DOCS AND GRAB INFO
        WHILE GETDOCINFO%FOUND LOOP

            BEGIN

                DOCSTRING := DOCNUMBER || '|~|' || DOCNAME || '|~|' || STATUS || '|~|' || DOCTYPE || '|~|' || WS_EDITDATE;

                RETVAL := RETVAL || DOCSTRING || '|^|';

                GOTO STARTOVER;

            END;

            <<STARTOVER>>

            FETCH GETDOCINFO INTO DOCNUMBER, DOCNAME, STATUS, DOCTYPE, EDITDATE;

        END LOOP;

   CLOSE GETDOCINFO;

   RETURN RETVAL;

   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging

 the error and then re-raise
       RAISE;
END GET_DOCS;
/

解决方案

Well, you could convert the function in to a procedure and have an OUT parameter of the SYS_REFCURSOR type. With Oracle and .Net you can pass back a cursor and iterate through that as a reader.

Sample Oracle procedure:

CREATE OR REPLACE PROCEDURE TEST_SCHEMA.TEST_PROCEDURE (
  out_DATA OUT SYS_REFCURSOR;
) AS
BEGIN
  OPEN out_DATA FOR
  SELECT col1,
         col2
    FROM TEST_SCHEMA.TEST_TABLE;
END test_procedure;

Sample .Net end:

using (OracleConnection connection = new OracleConnection("connstring"))
using (OracleCommand command = connection.CreateCommand()) {
  command.CommandType = CommandType.StoredProcedure;
  command.CommandText = "TEST_SCHEMA.TEST_PROCEDURE";
  command.Parameters.Add("out_DATA", OracleType.Cursor)
      .Direction = ParameterDirection.Output;

  connection.Open();
  command.ExecuteNonQuery();
  OracleDataReader reader = 
      command.Parameters["out_DATA"].Value as OracleDataReader;

  if (reader != null) {
    using (reader) {
      while(reader.Read()) {
        string col1 = reader["col1"] as string;
        string col2 = reader["col2"] as string;
      }
    }
  }
}

Be sure to close the cursor after you're done using it (accomplished above by the using (reader) statement).

So in your case, you could probably create a procedure that outputs the original cursor in your function, then just iterate over the cursor in .Net as listed above. Just a note, the column names from the Oracle side are important and will match what you're using in .Net.

这篇关于返回从Oracle记录集使用Oracle函数,它的参数到.NET的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆