Getting Buffer output from DBMS_OUTPUT.GET_LINES in C#











up vote
2
down vote

favorite












I'm trying to get the output from the DBMS_OUTPUT.PUT_LINE() method in my anonymous PL/SQL block through C#. I've looked at a couple of other related questions here, but am still having trouble. The return code of executing the anonymous block is returning -1, which should be correct based on the docs.



I'm setting the DBMS_OUTPUT.ENABLE() to NULL in order to not set a specific buffer size, then using the DBMS_OUTPUT.GET_LINES() method in order to get the lines from that buffer.



It returns nothing in the buffer (An empty OracleString) and returns 0 lines. My anonymous PL/SQL block is simple like this, but should work for any.



DECLARE
lvsName VARCHAR2(6) := 'Oracle';
BEGIN
DBMS_OUTPUT.PUT_LINE('Do you see me?');
DBMS_OUTPUT.PUT_LINE('My name is: ' || lvsName);
END;


What am I missing?



using (OracleDataAdapter oda = new OracleDataAdapter())
using (OracleCommand cmd = new OracleCommand(sql, _connection))
{
// Execute anonymous PL/SQL block
cmd.CommandType = CommandType.Text;
var res = cmd.ExecuteNonQuery();

// Set output Buffer
cmd.CommandText = "BEGIN DBMS_OUTPUT.ENABLE(NULL); END;";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();

// Get output
cmd.CommandText = "BEGIN DBMS_OUTPUT.GET_LINES(:outString, :numLines); END;";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Clear();
cmd.Parameters.Add(new OracleParameter("outString", OracleDbType.Varchar2, int.MaxValue, ParameterDirection.Output));
cmd.Parameters["outString"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
cmd.Parameters["outString"].Size = sql.Length;
cmd.Parameters["outString"].ArrayBindSize = new int[sql.Length];
cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput));
cmd.Parameters["numLines"].Value = 10; // Get 10 lines
cmd.ExecuteNonQuery();

int numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
string outString = string.Empty;

// Try to get more lines until there are zero left
while (numLines > 0)
{
for (int i = 0; i < numLines; i++)
{
OracleString s = (OracleString)cmd.Parameters["outString"].Value;
outString += s.ToString();
}

cmd.ExecuteNonQuery();
numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
}

return outString;
}









share|improve this question




























    up vote
    2
    down vote

    favorite












    I'm trying to get the output from the DBMS_OUTPUT.PUT_LINE() method in my anonymous PL/SQL block through C#. I've looked at a couple of other related questions here, but am still having trouble. The return code of executing the anonymous block is returning -1, which should be correct based on the docs.



    I'm setting the DBMS_OUTPUT.ENABLE() to NULL in order to not set a specific buffer size, then using the DBMS_OUTPUT.GET_LINES() method in order to get the lines from that buffer.



    It returns nothing in the buffer (An empty OracleString) and returns 0 lines. My anonymous PL/SQL block is simple like this, but should work for any.



    DECLARE
    lvsName VARCHAR2(6) := 'Oracle';
    BEGIN
    DBMS_OUTPUT.PUT_LINE('Do you see me?');
    DBMS_OUTPUT.PUT_LINE('My name is: ' || lvsName);
    END;


    What am I missing?



    using (OracleDataAdapter oda = new OracleDataAdapter())
    using (OracleCommand cmd = new OracleCommand(sql, _connection))
    {
    // Execute anonymous PL/SQL block
    cmd.CommandType = CommandType.Text;
    var res = cmd.ExecuteNonQuery();

    // Set output Buffer
    cmd.CommandText = "BEGIN DBMS_OUTPUT.ENABLE(NULL); END;";
    cmd.CommandType = CommandType.Text;
    cmd.ExecuteNonQuery();

    // Get output
    cmd.CommandText = "BEGIN DBMS_OUTPUT.GET_LINES(:outString, :numLines); END;";
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Clear();
    cmd.Parameters.Add(new OracleParameter("outString", OracleDbType.Varchar2, int.MaxValue, ParameterDirection.Output));
    cmd.Parameters["outString"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    cmd.Parameters["outString"].Size = sql.Length;
    cmd.Parameters["outString"].ArrayBindSize = new int[sql.Length];
    cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput));
    cmd.Parameters["numLines"].Value = 10; // Get 10 lines
    cmd.ExecuteNonQuery();

    int numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
    string outString = string.Empty;

    // Try to get more lines until there are zero left
    while (numLines > 0)
    {
    for (int i = 0; i < numLines; i++)
    {
    OracleString s = (OracleString)cmd.Parameters["outString"].Value;
    outString += s.ToString();
    }

    cmd.ExecuteNonQuery();
    numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
    }

    return outString;
    }









    share|improve this question


























      up vote
      2
      down vote

      favorite









      up vote
      2
      down vote

      favorite











      I'm trying to get the output from the DBMS_OUTPUT.PUT_LINE() method in my anonymous PL/SQL block through C#. I've looked at a couple of other related questions here, but am still having trouble. The return code of executing the anonymous block is returning -1, which should be correct based on the docs.



      I'm setting the DBMS_OUTPUT.ENABLE() to NULL in order to not set a specific buffer size, then using the DBMS_OUTPUT.GET_LINES() method in order to get the lines from that buffer.



      It returns nothing in the buffer (An empty OracleString) and returns 0 lines. My anonymous PL/SQL block is simple like this, but should work for any.



      DECLARE
      lvsName VARCHAR2(6) := 'Oracle';
      BEGIN
      DBMS_OUTPUT.PUT_LINE('Do you see me?');
      DBMS_OUTPUT.PUT_LINE('My name is: ' || lvsName);
      END;


      What am I missing?



      using (OracleDataAdapter oda = new OracleDataAdapter())
      using (OracleCommand cmd = new OracleCommand(sql, _connection))
      {
      // Execute anonymous PL/SQL block
      cmd.CommandType = CommandType.Text;
      var res = cmd.ExecuteNonQuery();

      // Set output Buffer
      cmd.CommandText = "BEGIN DBMS_OUTPUT.ENABLE(NULL); END;";
      cmd.CommandType = CommandType.Text;
      cmd.ExecuteNonQuery();

      // Get output
      cmd.CommandText = "BEGIN DBMS_OUTPUT.GET_LINES(:outString, :numLines); END;";
      cmd.CommandType = CommandType.Text;
      cmd.Parameters.Clear();
      cmd.Parameters.Add(new OracleParameter("outString", OracleDbType.Varchar2, int.MaxValue, ParameterDirection.Output));
      cmd.Parameters["outString"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
      cmd.Parameters["outString"].Size = sql.Length;
      cmd.Parameters["outString"].ArrayBindSize = new int[sql.Length];
      cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput));
      cmd.Parameters["numLines"].Value = 10; // Get 10 lines
      cmd.ExecuteNonQuery();

      int numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
      string outString = string.Empty;

      // Try to get more lines until there are zero left
      while (numLines > 0)
      {
      for (int i = 0; i < numLines; i++)
      {
      OracleString s = (OracleString)cmd.Parameters["outString"].Value;
      outString += s.ToString();
      }

      cmd.ExecuteNonQuery();
      numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
      }

      return outString;
      }









      share|improve this question















      I'm trying to get the output from the DBMS_OUTPUT.PUT_LINE() method in my anonymous PL/SQL block through C#. I've looked at a couple of other related questions here, but am still having trouble. The return code of executing the anonymous block is returning -1, which should be correct based on the docs.



      I'm setting the DBMS_OUTPUT.ENABLE() to NULL in order to not set a specific buffer size, then using the DBMS_OUTPUT.GET_LINES() method in order to get the lines from that buffer.



      It returns nothing in the buffer (An empty OracleString) and returns 0 lines. My anonymous PL/SQL block is simple like this, but should work for any.



      DECLARE
      lvsName VARCHAR2(6) := 'Oracle';
      BEGIN
      DBMS_OUTPUT.PUT_LINE('Do you see me?');
      DBMS_OUTPUT.PUT_LINE('My name is: ' || lvsName);
      END;


      What am I missing?



      using (OracleDataAdapter oda = new OracleDataAdapter())
      using (OracleCommand cmd = new OracleCommand(sql, _connection))
      {
      // Execute anonymous PL/SQL block
      cmd.CommandType = CommandType.Text;
      var res = cmd.ExecuteNonQuery();

      // Set output Buffer
      cmd.CommandText = "BEGIN DBMS_OUTPUT.ENABLE(NULL); END;";
      cmd.CommandType = CommandType.Text;
      cmd.ExecuteNonQuery();

      // Get output
      cmd.CommandText = "BEGIN DBMS_OUTPUT.GET_LINES(:outString, :numLines); END;";
      cmd.CommandType = CommandType.Text;
      cmd.Parameters.Clear();
      cmd.Parameters.Add(new OracleParameter("outString", OracleDbType.Varchar2, int.MaxValue, ParameterDirection.Output));
      cmd.Parameters["outString"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
      cmd.Parameters["outString"].Size = sql.Length;
      cmd.Parameters["outString"].ArrayBindSize = new int[sql.Length];
      cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput));
      cmd.Parameters["numLines"].Value = 10; // Get 10 lines
      cmd.ExecuteNonQuery();

      int numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
      string outString = string.Empty;

      // Try to get more lines until there are zero left
      while (numLines > 0)
      {
      for (int i = 0; i < numLines; i++)
      {
      OracleString s = (OracleString)cmd.Parameters["outString"].Value;
      outString += s.ToString();
      }

      cmd.ExecuteNonQuery();
      numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
      }

      return outString;
      }






      c# oracle odp.net oracle-manageddataaccess






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited yesterday

























      asked 2 days ago









      Jimenemex

      1,9901421




      1,9901421
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          I don't speak C# but i don't see in your code where you are assigning value to the numLines variable.



            DBMS_OUTPUT.GET_LINES (
          lines OUT CHARARR,
          numlines IN OUT INTEGER);


          Example in plsql:



          DECLARE
          v_array DBMS_OUTPUT.CHARARR;
          v_lines NUMBER;
          BEGIN
          DBMS_OUTPUT.PUT_LINE ('aaaaa');
          DBMS_OUTPUT.put_line ('bbbb');
          DBMS_OUTPUT.put_line ('ccccc');
          v_lines := 1000; -- Number of lines you want to retrieve from the buffer.
          DBMS_OUTPUT.GET_LINES (v_array, v_lines);

          DBMS_OUTPUT.put_line(v_lines); -- Lines retrieved from buffer.
          FOR idx IN nvl(v_array.FIRST,1) .. nvl(v_array.LAST,-1)
          LOOP
          DBMS_OUTPUT.put_line (v_array (idx));
          END LOOP;
          END;





          share|improve this answer





















          • The Parameter is added here: cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput)); The value is set here: cmd.Parameters["numLines"].Value = 10; // Get 10 lines I've just added the actual addition for the .Value of the Parameter and have the same results.
            – Jimenemex
            yesterday













          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53402356%2fgetting-buffer-output-from-dbms-output-get-lines-in-c-sharp%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          0
          down vote













          I don't speak C# but i don't see in your code where you are assigning value to the numLines variable.



            DBMS_OUTPUT.GET_LINES (
          lines OUT CHARARR,
          numlines IN OUT INTEGER);


          Example in plsql:



          DECLARE
          v_array DBMS_OUTPUT.CHARARR;
          v_lines NUMBER;
          BEGIN
          DBMS_OUTPUT.PUT_LINE ('aaaaa');
          DBMS_OUTPUT.put_line ('bbbb');
          DBMS_OUTPUT.put_line ('ccccc');
          v_lines := 1000; -- Number of lines you want to retrieve from the buffer.
          DBMS_OUTPUT.GET_LINES (v_array, v_lines);

          DBMS_OUTPUT.put_line(v_lines); -- Lines retrieved from buffer.
          FOR idx IN nvl(v_array.FIRST,1) .. nvl(v_array.LAST,-1)
          LOOP
          DBMS_OUTPUT.put_line (v_array (idx));
          END LOOP;
          END;





          share|improve this answer





















          • The Parameter is added here: cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput)); The value is set here: cmd.Parameters["numLines"].Value = 10; // Get 10 lines I've just added the actual addition for the .Value of the Parameter and have the same results.
            – Jimenemex
            yesterday

















          up vote
          0
          down vote













          I don't speak C# but i don't see in your code where you are assigning value to the numLines variable.



            DBMS_OUTPUT.GET_LINES (
          lines OUT CHARARR,
          numlines IN OUT INTEGER);


          Example in plsql:



          DECLARE
          v_array DBMS_OUTPUT.CHARARR;
          v_lines NUMBER;
          BEGIN
          DBMS_OUTPUT.PUT_LINE ('aaaaa');
          DBMS_OUTPUT.put_line ('bbbb');
          DBMS_OUTPUT.put_line ('ccccc');
          v_lines := 1000; -- Number of lines you want to retrieve from the buffer.
          DBMS_OUTPUT.GET_LINES (v_array, v_lines);

          DBMS_OUTPUT.put_line(v_lines); -- Lines retrieved from buffer.
          FOR idx IN nvl(v_array.FIRST,1) .. nvl(v_array.LAST,-1)
          LOOP
          DBMS_OUTPUT.put_line (v_array (idx));
          END LOOP;
          END;





          share|improve this answer





















          • The Parameter is added here: cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput)); The value is set here: cmd.Parameters["numLines"].Value = 10; // Get 10 lines I've just added the actual addition for the .Value of the Parameter and have the same results.
            – Jimenemex
            yesterday















          up vote
          0
          down vote










          up vote
          0
          down vote









          I don't speak C# but i don't see in your code where you are assigning value to the numLines variable.



            DBMS_OUTPUT.GET_LINES (
          lines OUT CHARARR,
          numlines IN OUT INTEGER);


          Example in plsql:



          DECLARE
          v_array DBMS_OUTPUT.CHARARR;
          v_lines NUMBER;
          BEGIN
          DBMS_OUTPUT.PUT_LINE ('aaaaa');
          DBMS_OUTPUT.put_line ('bbbb');
          DBMS_OUTPUT.put_line ('ccccc');
          v_lines := 1000; -- Number of lines you want to retrieve from the buffer.
          DBMS_OUTPUT.GET_LINES (v_array, v_lines);

          DBMS_OUTPUT.put_line(v_lines); -- Lines retrieved from buffer.
          FOR idx IN nvl(v_array.FIRST,1) .. nvl(v_array.LAST,-1)
          LOOP
          DBMS_OUTPUT.put_line (v_array (idx));
          END LOOP;
          END;





          share|improve this answer












          I don't speak C# but i don't see in your code where you are assigning value to the numLines variable.



            DBMS_OUTPUT.GET_LINES (
          lines OUT CHARARR,
          numlines IN OUT INTEGER);


          Example in plsql:



          DECLARE
          v_array DBMS_OUTPUT.CHARARR;
          v_lines NUMBER;
          BEGIN
          DBMS_OUTPUT.PUT_LINE ('aaaaa');
          DBMS_OUTPUT.put_line ('bbbb');
          DBMS_OUTPUT.put_line ('ccccc');
          v_lines := 1000; -- Number of lines you want to retrieve from the buffer.
          DBMS_OUTPUT.GET_LINES (v_array, v_lines);

          DBMS_OUTPUT.put_line(v_lines); -- Lines retrieved from buffer.
          FOR idx IN nvl(v_array.FIRST,1) .. nvl(v_array.LAST,-1)
          LOOP
          DBMS_OUTPUT.put_line (v_array (idx));
          END LOOP;
          END;






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered yesterday









          Arkadiusz Łukasiewicz

          4,7091613




          4,7091613












          • The Parameter is added here: cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput)); The value is set here: cmd.Parameters["numLines"].Value = 10; // Get 10 lines I've just added the actual addition for the .Value of the Parameter and have the same results.
            – Jimenemex
            yesterday




















          • The Parameter is added here: cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput)); The value is set here: cmd.Parameters["numLines"].Value = 10; // Get 10 lines I've just added the actual addition for the .Value of the Parameter and have the same results.
            – Jimenemex
            yesterday


















          The Parameter is added here: cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput)); The value is set here: cmd.Parameters["numLines"].Value = 10; // Get 10 lines I've just added the actual addition for the .Value of the Parameter and have the same results.
          – Jimenemex
          yesterday






          The Parameter is added here: cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput)); The value is set here: cmd.Parameters["numLines"].Value = 10; // Get 10 lines I've just added the actual addition for the .Value of the Parameter and have the same results.
          – Jimenemex
          yesterday




















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53402356%2fgetting-buffer-output-from-dbms-output-get-lines-in-c-sharp%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Berounka

          Different font size/position of beamer's navigation symbols template's content depending on regular/plain...

          Sphinx de Gizeh