C#中使用Oracle存儲過程返回結果集

来源:http://www.cnblogs.com/shouce/archive/2016/01/27/5162062.html
-Advertisement-
Play Games

問題:在MSSQLServer中定義的存儲過程可以直接返回一個數據集,如:create procedure sp_getAllEmployeesasSELECT * FROM [NORTHWND].[dbo].[Employees]在Oracle資料庫中這樣定義是錯誤的,怎麼解決?辦法:Oracle...


問題:

在MSSQLServer中定義的存儲過程可以直接返回一個數據集,如:

create procedure sp_getAllEmployees
as
SELECT * FROM [NORTHWND].[dbo].[Employees]

在Oracle資料庫中這樣定義是錯誤的,怎麼解決?

 

辦法:

Oracle中可以使用游標(Cursor)對數據集進行操作,但在存儲過程輸出參數中直接使用Cursor錯誤,此時的Cursor應該是一個定義游標的關鍵字並非類型,所以先要定義一個包,在包中聲明全局的自定義游標類型,如:

複製代碼
/**創建一個名為pkg_products的包**/
create or replace package pkg_products is
--定義一個公有的游標類型cursor_pdt
--ref 可以在程式間傳遞結果集
--一個程式里打開游標變數,在另外的程式里處理數據
type cursor_pdt is ref cursor;
--聲明一個存儲過程 ,游標類型參數為輸出類型
procedure proc_GetAllProducts(cur_set out cursor_pdt);
end pkg_products;
複製代碼

這個包(package)有點類似OO中的介面,C++中的文件頭,實現這個包時叫包體(package body),且名稱要相同,如:

複製代碼
/**創建一個包體**/
create or replace package body pkg_products is
  --實現包中沒有實現的存儲過程
  procedure proc_GetAllProducts(cur_set out cursor_pdt) as
    begin 
      --打開游標,由於定義游標時使用ref處理游標可以推遲到客戶端
      open cur_set for select id, name, producttype, price,picture, isout, mark, adddate from products;
      end;
end;
複製代碼

定義成功,且編譯通過,就可以先在Oracle中測試,如:

複製代碼
/**使用過程測試定義的存儲過程**/
declare
--定義游標類型的變數
cur_set pkg_products.cursor_pdt;
--定義行類型
pdtrow products%rowtype;
begin
  --執行存儲過程
  pkg_products.proc_GetAllProducts(cur_set);
  --遍歷游標中的數據
       LOOP
         --取當前行數據存入pdtrow
           FETCH cur_set INTO pdtrow;
           --如果未獲取數據就結束迴圈
           EXIT WHEN cur_set%NOTFOUND;
           --輸出獲取到的數據
           DBMS_OUTPUT.PUT_LINE (pdtrow.id||','||pdtrow.name);
         END LOOP;
         CLOSE cur_set;
  end;
複製代碼

如果運行上面的PL/SQL過程腳本能取到結果,說明定義的包與包體的實現就成功了,可以使用.NET,Java或其它程式訪問定義好的存儲過程,如使用C#訪問存儲過程的腳本如下:

複製代碼
 1             //定義連接對象
 2             OracleConnection conn = new OracleConnection("Data Source=orcl;Persist Security Info=True;User ID=t52;Unicode=True;Password=t52");
 3             //註意:包名.存儲過程名的形式
 4             OracleCommand cmd = new OracleCommand("pkg_products.proc_GetAllProducts", conn);
 5             //設置命令類型為存儲過程
 6             cmd.CommandType = CommandType.StoredProcedure;
 7             //定義參數,註意參數名必須與存儲過程定義時一致,且類型為OracleType.Cursor
 8             OracleParameter cur_set = 
 9                 new OracleParameter("cur_set", OracleType.Cursor);
10             //設置參數為輸出類型
11             cur_set.Direction = ParameterDirection.Output;
12             //添加參數
13             cmd.Parameters.Add(cur_set);
14             //打開連接
15             conn.Open();
16             //執行並返回OracleDataReader,註意使用後釋放
17             return cmd.ExecuteReader(CommandBehavior.CloseConnection);
複製代碼

註意項目要添加引用程式集:System.Data.OracleClient,代碼中也要using;另外如果使用sql語句在C#中作為字元串出現時儘量不要換行,也不要以分號結尾。上面訪問資料庫的代碼沒有封裝,返回DataSet,DataTable也可以,示例代碼如下:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇,用 GPIO 直接供電給 LED,用高低電平作開關,不靠譜。GPIO 是信號用的,不是當電源用的。而且,一個 GPIO 只能給可憐的 5mA 左右,取多了會燒(我沒燒過不知道是不是真的會燒,但說明書上面是這樣寫)。這樣玩不過來,所以我做了以下三極體實驗。 2N3904 參數請點擊這裡。不推薦...
  • Linux下 Apache的配置文件是 /etc/apache2/apache2.conf,Apache在啟動時會自動讀取這個文件的配置信息。而其他的一些配置文件,如 httpd.conf等,則是通過Include指令包含進來。
  • 在我們實際運用中,加密是保證數據安全的重要手段。以前使用ASP時,對數據加密可以使用MD5和SHA1演算法,這兩種演算法雖然快捷有效,但是無法對通過它們加密的密文進行反運算,即是解密。因此需要解密數據的場合,這兩種方法就不太適合了。當然你也可以自己編寫適用的加密和解密程式,不過這對編寫者的數學水平有很高...
  • 後臺代碼:using Webdiyer.WebControls.Mvc; 1 public ActionResult Index(int id = 1) 2 { 3 int pageIndex = id; 4 int count; 5 ...
  • 使用 JS創建分頁JS代碼: var tta = 200; //定義總數 $('#pp').pagination({ total: tta, pageSize: 10, //每頁顯示行數 ...
  • 步驟:1、解決方案資源管理器視窗->右擊項目屬性2、屬性視窗->應用程式->輸出類型(U)->類庫
  • 大家知道,.NET控制系統垃圾回收(一種自動回收未使用記憶體的服務)是自動的。可有時候需要手動強制進行即時垃圾回收。代碼如下:GC.Collect();
  • 之前一直覺得定時程式好神秘,後來,當我自己真正寫了一個小的定時程式時,發現其實沒有想象中的那麼難。下麵,我分享一下我自己的操作過程,希望能對大家有幫助。1)在我們的項目中添加引用文件:TaskSchedulerEngine.dll(dll定義了一個ITask介面,定義了兩個方法Initialize和...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...