refcursortest.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using System;
  2. using System.Data;
  3. using System.Data.OracleClient;
  4. public class Test
  5. {
  6. public static void Main (string[] args)
  7. {
  8. string connectionString =
  9. "Data Source=testdb;" +
  10. "User ID=scott;" +
  11. "Password=tiger;";
  12. OracleConnection connection = null;
  13. connection = new OracleConnection (connectionString);
  14. connection.Open ();
  15. Console.WriteLine("Setup test package and data...");
  16. OracleCommand cmddrop = connection.CreateCommand();
  17. cmddrop.CommandText = "DROP TABLE TESTTABLE";
  18. try {
  19. cmddrop.ExecuteNonQuery();
  20. }
  21. catch(OracleException e) {
  22. Console.WriteLine("Ignore this error: " + e.Message);
  23. }
  24. cmddrop.Dispose();
  25. cmddrop = null;
  26. Console.WriteLine("Create table TESTTABLE...");
  27. OracleCommand cmd = connection.CreateCommand();
  28. // create table TESTTABLE
  29. cmd.CommandText =
  30. "create table TESTTABLE (\n" +
  31. " col1 numeric(18,0),\n" +
  32. " col2 varchar(32),\n" +
  33. " col3 date, col4 blob)";
  34. cmd.ExecuteNonQuery();
  35. Console.WriteLine("Insert 3 rows...");
  36. // insert some rows into TESTTABLE
  37. cmd.CommandText =
  38. "insert into TESTTABLE\n" +
  39. "(col1, col2, col3, col4)\n" +
  40. "values(45, 'Mono', sysdate, EMPTY_BLOB())";
  41. cmd.ExecuteNonQuery();
  42. cmd.CommandText =
  43. "insert into TESTTABLE\n" +
  44. "(col1, col2, col3, col4)\n" +
  45. "values(136, 'Fun', sysdate, EMPTY_BLOB())";
  46. cmd.ExecuteNonQuery();
  47. cmd.CommandText =
  48. "insert into TESTTABLE\n" +
  49. "(col1, col2, col3, col4)\n" +
  50. "values(526, 'System.Data.OracleClient', sysdate, EMPTY_BLOB())";
  51. cmd.ExecuteNonQuery();
  52. Console.WriteLine("commit...");
  53. cmd.CommandText = "commit";
  54. cmd.ExecuteNonQuery();
  55. Console.WriteLine("Update blob...");
  56. // update BLOB and CLOB columns
  57. OracleCommand select = connection.CreateCommand ();
  58. select.Transaction = connection.BeginTransaction();
  59. select.CommandText = "SELECT col1, col4 FROM testtable FOR UPDATE";
  60. OracleDataReader readerz = select.ExecuteReader ();
  61. if (!readerz.Read ())
  62. Console.WriteLine ("ERROR: RECORD NOT FOUND");
  63. // update blob_value
  64. Console.WriteLine(" Update BLOB column on table testtable...");
  65. OracleLob blob = readerz.GetOracleLob (1);
  66. byte[] bytes = new byte[6] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x036 };
  67. blob.Write (bytes, 0, bytes.Length);
  68. blob.Close ();
  69. readerz.Close();
  70. select.Transaction.Commit();
  71. select.Dispose();
  72. select = null;
  73. cmd.CommandText = "commit";
  74. cmd.ExecuteNonQuery();
  75. Console.WriteLine("Create package...");
  76. // create Oracle package TestTablePkg
  77. cmd.CommandText =
  78. "CREATE OR REPLACE PACKAGE TestTablePkg\n" +
  79. "AS\n" +
  80. " TYPE T_CURSOR IS REF CURSOR;\n" +
  81. "\n" +
  82. " PROCEDURE GetData(tableCursor OUT T_CURSOR);\n" +
  83. "END TestTablePkg;";
  84. cmd.ExecuteNonQuery();
  85. // create Oracle package body for package TestTablePkg
  86. cmd.CommandText =
  87. "CREATE OR REPLACE PACKAGE BODY TestTablePkg AS\n" +
  88. " PROCEDURE GetData(tableCursor OUT T_CURSOR)\n" +
  89. " IS\n" +
  90. " BEGIN\n" +
  91. " OPEN tableCursor FOR\n" +
  92. " SELECT *\n" +
  93. " FROM TestTable;\n" +
  94. " END GetData;\n" +
  95. "END TestTablePkg;";
  96. cmd.ExecuteNonQuery();
  97. cmd.Dispose();
  98. cmd = null;
  99. Console.WriteLine("Set up command and parameters to call stored proc...");
  100. OracleCommand command = new OracleCommand("TestTablePkg.GetData", connection);
  101. command.CommandType = CommandType.StoredProcedure;
  102. OracleParameter parameter = new OracleParameter("tableCursor", OracleType.Cursor);
  103. parameter.Direction = ParameterDirection.Output;
  104. command.Parameters.Add(parameter);
  105. Console.WriteLine("Execute...");
  106. command.ExecuteNonQuery();
  107. Console.WriteLine("Get OracleDataReader for cursor output parameter...");
  108. OracleDataReader reader = (OracleDataReader) parameter.Value;
  109. Console.WriteLine("Read data***...");
  110. int r = 0;
  111. while (reader.Read()) {
  112. Console.WriteLine("Row {0}", r);
  113. for (int f = 0; f < reader.FieldCount; f ++) {
  114. Console.WriteLine("FieldType: " + reader.GetFieldType(f).ToString());
  115. object val = "";
  116. if (f==3) {
  117. Console.WriteLine("blob");
  118. //OracleLob lob = reader.GetOracleLob (f);
  119. //val = lob.Value;
  120. val = reader.GetValue(f);
  121. if (((byte[])val).Length == 0)
  122. val = "Empty Blob (Not Null)";
  123. else
  124. val = BitConverter.ToString((byte[])val);
  125. }
  126. else
  127. val = reader.GetOracleValue(f);
  128. Console.WriteLine(" Field {0} Value: {1}", f, val);
  129. }
  130. r ++;
  131. }
  132. Console.WriteLine("Rows retrieved: {0}", r);
  133. Console.WriteLine("Clean up...");
  134. reader.Close();
  135. reader = null;
  136. command.Dispose();
  137. command = null;
  138. connection.Close();
  139. connection = null;
  140. }
  141. }