| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> oracle >> Oracle數據庫返回cursor問題的解決方法
 

Oracle數據庫返回cursor問題的解決方法

2008-07-30 06:50:48  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  這篇論壇文章(賽迪網技術社區)著重介紹了Oracle數據庫返回cursor問題的解決方法,詳細內容請參考下文:

  昨天使用 Data Block 操作 oracle 返回 cursor 。期間産生了一點問題,很是郁悶,找了一下午也沒有解決。早上睡不著,起來繼續找。結果找到了解決的方法。其實也是怪自己沒有很好的看文檔。在此記錄一下。以使別的同志再出現我的問題的時候,很容易的找到解決的方法。

  問題是這樣的:

  我在oracle裏面有這樣一個過程

  PROCEDURE ListAllStatic_Users (cur_Static_User OUT T_CURSOR)

  IS

  BEGIN

  OPEN cur_Static_User FOR

  Select * FROM Static_User ;

  END ListAllStatic_Users;

  我在程序裏面如下調用:

  Database db = DatabaseFactory.CreateDatabase("oraserver");

  string sqlCommand = "Static_UserPackage.ListAllStatic_Users";

  DBCommandWrapper dbCommandWrapper =db.GetStoredProcCommandWrapper(sqlCommand);

  DataSet dsCustomers = db.ExecuteDataSet(dbCommandWrapper);

  DataGrid1.DataSource=dsCstomers;

  DataGrid1.DataBind();

  結果出現如下問題:

  ORA-06550: 第 1 行, 第 7 列: PLS-00306: 調用 'LISTALLSTATIC_USERS' 時參數個數或類型錯誤 orA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored

  說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以了解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。

  異常詳細信息: System.Data.OracleClient.OracleException: orA-06550: 第 1 行, 第 7 列: PLS-00306: 調用 'LISTALLSTATIC_USERS' 時參數個數或類型錯誤 orA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored

  源錯誤:

  行 44:

  行 45: DataSet dsCustomers = db.ExecuteDataSet(dbCommandWrapper);行 46: DataGrid1.DataSource=dsCustomers;

  行 47: DataGrid1.DataBind();

  我以爲是我的參數沒有弄對,于是就加了一句:

  dbCommandWrapper.AddOutParameter("cur_Static_User",DbType.Object,500);

  結果還是一樣的。後來也試驗了

  OracleCommandWrapper.AddParameter(string,DbType,int,ParameterDirection,bool,byte,byte,string,DataRowVersion,object);

  這個方法來添加,也是不行。

  後來就上網找了很長時間也沒有什麽進展。今天早上起來,還是一籌莫展,偶爾的打開Enterprise Library安裝目錄的Enterprise Library Release Notes.rtf文件,發現裏面有這麽一段

  2.4 Data Access Application Block: Default oracle cursor cur_OUT

  

  The managed provider for oracle requires you to explicitly bind your reference cursor in your parameter collection. This means you must explicitly create an output parameter for the cursor in your application code. However, that code will not be portable with database systems that do not require a parameter for the cursor. The oracleDatabase allows you to create commands without specifying a cursor. It will create a cursor, named cur_OUT, for commands that execute a stored procedure and do not include an output parameter for the cursor. This means that you can name your reference cursor as "cur_OUT" and the Data Access Application Block will bind it for you; you do not need to explicitly create an output parameter for the cursor. If your stored procedures use a cursor with a name other than "cur_OUT," you must explicitly add a parameter for each cursor to the command. Similarly, if your stored procedure contains multiple cursors, you must explicitly add each cursor parameter to the command.

  這下我就明白了。在我的oracle函數中,我的名字 cur_Static_User 和默認的名字cur_OUT不匹配。

  于是我就改了我的存儲過程的參數名稱,cur_Static_User改爲 cur_OUT。

  問題就解決了。

  經過試驗,也可以用如下方法用自己的參數名,而不用默認的參數名。

  也可以,在一個PROCEDURE中返回多個 CURSOR

  我的存儲過程:

  Procedure STATIC_USER_SelectAll

  ( cur_OUT_f OUT T_OUT, cur_OUT_g OUT T_OUT)

  AS

  Begin

  OPEN cur_OUT_f FOR Select * from STATIC_USER;

  OPEN cur_OUT_g FOR Select * from STATIC_ROLE;

  End;

  代碼如下:

  Database db = DatabaseFactory.CreateDatabase("oraserver");

  string sqlCommand = "Static_UserPackage.STATIC_USER_SelectAll";

  Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleCommandWrapper dbCommandWrapper =(Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleCommandWrapper)db.GetStoredProcCommandWrapper(sqlCommand);

  dbCommandWrapper.AddParameter("cur_OUT_f", OracleType.Cursor, 0, ParameterDirection.Output, true, 0, 0, String.Empty, DataRowVersion.Default, Convert.DBNull);

  dbCommandWrapper.AddParameter("cur_OUT_g", OracleType.Cursor, 0, ParameterDirection.Output, true, 0, 0, String.Empty, DataRowVersion.Default, Convert.DBNull);

  DataSet dsCustomers = db.ExecuteDataSet(dbCommandWrapper);

  DataGrid1.DataSource=dsCustomers.Tables[0];

  DataGrid1.DataBind();

  DataGrid2.DataSource=dsCustomers.Tables[1];

  DataGrid2.DataBind();
 
 
 
上一篇《Oracle數據庫中sys和system兩個用戶的區別》
下一篇《Oracle數據庫SQLPLUS中幾個常用set語句》
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

 
 
 
這篇論壇文章(賽迪網技術社區)著重介紹了Oracle數據庫返回cursor問題的解決方法,詳細內容請參考下文: 昨天使用 Data Block 操作 oracle 返回 cursor 。期間産生了一點問題,很是郁悶,找了一下午也沒有解決。早上睡不著,起來繼續找。結果找到了解決的方法。其實也是怪自己沒有很好的看文檔。在此記錄一下。以使別的同志再出現我的問題的時候,很容易的找到解決的方法。 問題是這樣的: 我在oracle裏面有這樣一個過程 PROCEDURE ListAllStatic_Users (cur_Static_User OUT T_CURSOR) IS BEGIN OPEN cur_Static_User FOR Select * FROM Static_User ; END ListAllStatic_Users; 我在程序裏面如下調用: Database db = DatabaseFactory.CreateDatabase("oraserver"); string sqlCommand = "Static_UserPackage.ListAllStatic_Users"; DBCommandWrapper dbCommandWrapper =db.GetStoredProcCommandWrapper(sqlCommand); DataSet dsCustomers = db.ExecuteDataSet(dbCommandWrapper); DataGrid1.DataSource=dsCstomers; DataGrid1.DataBind(); 結果出現如下問題: ORA-06550: 第 1 行, 第 7 列: PLS-00306: 調用 'LISTALLSTATIC_USERS' 時參數個數或類型錯誤 orA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored 說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以了解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。 異常詳細信息: System.Data.OracleClient.OracleException: orA-06550: 第 1 行, 第 7 列: PLS-00306: 調用 'LISTALLSTATIC_USERS' 時參數個數或類型錯誤 orA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored 源錯誤: 行 44: 行 45: DataSet dsCustomers = db.ExecuteDataSet(dbCommandWrapper);行 46: DataGrid1.DataSource=dsCustomers; 行 47: DataGrid1.DataBind(); 我以爲是我的參數沒有弄對,于是就加了一句: dbCommandWrapper.AddOutParameter("cur_Static_User",DbType.Object,500); 結果還是一樣的。後來也試驗了 OracleCommandWrapper.AddParameter(string,DbType,int,ParameterDirection,bool,byte,byte,string,DataRowVersion,object); 這個方法來添加,也是不行。 後來就上網找了很長時間也沒有什麽進展。今天早上起來,還是一籌莫展,偶爾的打開Enterprise Library安裝目錄的Enterprise Library Release Notes.rtf文件,發現裏面有這麽一段 2.4 Data Access Application Block: Default oracle cursor cur_OUT The managed provider for oracle requires you to explicitly bind your reference cursor in your parameter collection. This means you must explicitly create an output parameter for the cursor in your application code. However, that code will not be portable with database systems that do not require a parameter for the cursor. The oracleDatabase allows you to create commands without specifying a cursor. It will create a cursor, named cur_OUT, for commands that execute a stored procedure and do not include an output parameter for the cursor. This means that you can name your reference cursor as "cur_OUT" and the Data Access Application Block will bind it for you; you do not need to explicitly create an output parameter for the cursor. If your stored procedures use a cursor with a name other than "cur_OUT," you must explicitly add a parameter for each cursor to the command. Similarly, if your stored procedure contains multiple cursors, you must explicitly add each cursor parameter to the command. 這下我就明白了。在我的oracle函數中,我的名字 cur_Static_User 和默認的名字cur_OUT不匹配。 于是我就改了我的存儲過程的參數名稱,cur_Static_User改爲 cur_OUT。 問題就解決了。 經過試驗,也可以用如下方法用自己的參數名,而不用默認的參數名。 也可以,在一個PROCEDURE中返回多個 CURSOR 我的存儲過程: Procedure STATIC_USER_SelectAll ( cur_OUT_f OUT T_OUT, cur_OUT_g OUT T_OUT) AS Begin OPEN cur_OUT_f FOR Select * from STATIC_USER; OPEN cur_OUT_g FOR Select * from STATIC_ROLE; End; 代碼如下: Database db = DatabaseFactory.CreateDatabase("oraserver"); string sqlCommand = "Static_UserPackage.STATIC_USER_SelectAll"; Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleCommandWrapper dbCommandWrapper =(Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleCommandWrapper)db.GetStoredProcCommandWrapper(sqlCommand); dbCommandWrapper.AddParameter("cur_OUT_f", OracleType.Cursor, 0, ParameterDirection.Output, true, 0, 0, String.Empty, DataRowVersion.Default, Convert.DBNull); dbCommandWrapper.AddParameter("cur_OUT_g", OracleType.Cursor, 0, ParameterDirection.Output, true, 0, 0, String.Empty, DataRowVersion.Default, Convert.DBNull); DataSet dsCustomers = db.ExecuteDataSet(dbCommandWrapper); DataGrid1.DataSource=dsCustomers.Tables[0]; DataGrid1.DataBind(); DataGrid2.DataSource=dsCustomers.Tables[1]; DataGrid2.DataBind();
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
成熟風韻的Meinv
甜美少女
此女子姿色過人也
愛恨情愁傷哀怨
痞子的甘南日記
疑是銀河落九天
雪域壩上四——純美色
冬日戀歌——西城楊柳弄輕柔
 
>>返回首頁<<
 熱帖排行
 
 
王朝网络微信公众号
微信扫码关注本站公众号 wangchaonetcn
 
© 2005- 王朝網路 版權所有