2011-04-13 3 views
0

데이터를 출력 버퍼에 넣으려면 실행하기위한 저장 프로 시저가 하나 있습니다 (dbms_output.put_line()).VB.NET에서 dbms_output.get_line 사용

출력을 검색하려면 dbms_output.get_line(:line, :status)을 사용해야합니다. 오라클 배포에서 두통을 피하려면 System.Data.OracleClient을 사용하고 있습니다.

그래서 아래 코드에서 내가 뭘 잘못하고 있니? 내가이 일을하는 데 방법은 다음과

Dim cmdSproc As OracleCommand = cnOracle.CreateCommand() 
Dim strOracle As New OracleString() 
Dim opaLine As New OracleParameter("lineOut", OracleType.VarChar, 255) 
opaLine.Direction = ParameterDirection.Output 
Dim opaStatus As New OracleParameter("status", 0) 
cmdSproc.CommandText = "begin dbms_output.get_line(:lineOut,:status); end;" 
cmdSproc.Parameters.Add(opaLine) 
cmdSproc.Parameters.Add(opaStatus) 

Dim strOutput As String = "" 
strOracle = "0" 
Try 
    While strOracle = "0" 
     cmdSproc.ExecuteOracleNonQuery(strOracle) 
     strOutput = strOutput & strOracle.ToString() & vbNewLine 
    End While 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 

답변

0

는 다음과 같습니다 (발견이 here)

C#에서 내가 다음 방법을 사용하고
Dim cmdGetOutput As New OracleCommand("declare " & _ 
    " l_line varchar2(255); " & _ 
    " l_done number; " & _ 
    " l_buffer long; " & _ 
    "begin " & _ 
    " loop " & _ 
    " exit when length(l_buffer)+255 > :maxbytes OR l_done =1; " & _ 
    " dbms_output.get_line(l_line, l_done); " & _ 
    " l_buffer := l_buffer || l_line || chr(10); " & _ 
    " end loop; " & _ 
    " :done := l_done; " & _ 
    " :buffer := l_buffer; " & _ 
    "end;", cnOracle) 
cmdGetOutput.Parameters.Add("maxbytes", OracleType.Int16) 
cmdGetOutput.Parameters("maxbytes").Value = 32000 
cmdGetOutput.Parameters.Add("done", OracleType.Int16) 
cmdGetOutput.Parameters("done").Direction = ParameterDirection.Output 
cmdGetOutput.Parameters.Add("buffer", OracleType.LongVarChar, 32000) 
cmdGetOutput.Parameters("buffer").Direction = ParameterDirection.Output 

Dim strOutput As String = "" 
Dim intStatus As Integer = 0 
Try 
    While True 
     cmdGetOutput.ExecuteNonQuery() 
     strOutput = strOutput & cmdGetOutput.Parameters("buffer").Value & vbNewLine 
     If cmdGetOutput.Parameters("done").Value = 1 Then 
     Exit While 
     End If 
    End While 
Catch ex As Exception 
    MsgBox(ex.Message) 
Finally 
    MsgBox(strOutput) 
    cnOracle.Close() 
End Try 
0

: 코드 형식 vb.net에서

private string GetDbmsOutputLine() 
    { 
     OracleCommand command = new OracleCommand 
     { 
      Connection = <connection>, 
      CommandText = "begin dbms_output.get_line(:line, :status); end;", 
      CommandType = CommandType.Text 
     }; 

     OracleParameter lineParameter = new OracleParameter("line", 
      OracleType.VarChar); 
     lineParameter.Size = 32000; 
     lineParameter.Direction = ParameterDirection.Output; 
     command.Parameters.Add(lineParameter); 

     OracleParameter statusParameter = new OracleParameter("status", 
      OracleType.Int32); 
     statusParameter.Direction = ParameterDirection.Output; 
     command.Parameters.Add(statusParameter); 

     command.ExecuteNonQuery(); 

     if (command.Parameters["line"].Value is DBNull) 
      return null; 

     string line = command.Parameters["line"].Value as string; 

     return line; 
    } 
1

을 SKINDER 친구는 다음과 같습니다 ... 공유를위한 thnxs

Sub _showDbms() 
      Dim c As New OracleCommand() 
      c.Connection = frmMain._cnn 
      With c 
       .CommandType = CommandType.Text 
       .CommandText = "begin dbms_output.get_line(:line, :status); end;" 
       .Parameters.Add(New OracleParameter("line", OracleDbType.Varchar2)).Size = 32000 
       .Parameters("line").Direction = ParameterDirection.Output 
       .Parameters.Add(New OracleParameter("status", OracleDbType.Int32)) 
       .Parameters("status").Direction = ParameterDirection.Output 
      End With 
      c.ExecuteNonQuery() 
      If c.Parameters("line").Value IsNot DBNull.Value Then 
       MsgBox(c.Parameters("line").Value.ToString) 
      End If 
    End Sub