在 C# 中从 DBMS_OUTPUT.GET_LINES 获取输出缓冲区

2024-03-20

我正在尝试获取输出DBMS_OUTPUT.PUT_LINE()通过 C# 在我的匿名 PL/SQL 块中调用方法。我在这里查看了其他几个相关问题,但仍然遇到麻烦。执行匿名块的返回码正在return-1,这应该是正确的docs https://docs.oracle.com/en/database/oracle/oracle-database/12.2/odpnt/CommandExecuteNonQuery.html#GUID-E1E79471-6037-4490-BDE7-ADE252922C83.

我正在设置DBMS_OUTPUT.ENABLE() to NULL为了不设置特定的缓冲区大小,然后使用DBMS_OUTPUT.GET_LINES()方法以便从该缓冲区获取行。

它在缓冲区中不返回任何内容(一个空的OracleString[])并返回0线。我的匿名 PL/SQL 块很简单,但应该适用于任何情况。

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

我缺少什么?

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;
}

您的代码的主要问题是它没有为输出缓冲区的每个元素设置绑定大小。此外,在检索结果时,它没有正确索引输出缓冲区。最后,执行顺序也发挥着作用:在执行匿名代码块之前,您必须首先启用输出。所做的每一个更改都会在下面进行注释MCVE https://stackoverflow.com/help/mcve。仅进行了必要的更改以使其正常工作。

static void Main(string[] args)
{
    string str = "User Id=xxx; password=xxx; Data Source=localhost:1521/xxx;";
    string sql = @"DECLARE lvsName VARCHAR2(6) := 'Oracle'; BEGIN  DBMS_OUTPUT.PUT_LINE('Do you see me?'); DBMS_OUTPUT.PUT_LINE('My name is: ' || lvsName); END;";

    OracleConnection _connection = new OracleConnection(str);

    try
    {
        _connection.Open();

        //adapter not being used
        //using (OracleDataAdapter oda = new OracleDataAdapter())

        using (OracleCommand cmd = new OracleCommand(sql, _connection))
        {
            // First enable buffer output
            // Set output Buffer
            cmd.CommandText = "BEGIN DBMS_OUTPUT.ENABLE(NULL); END;";
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();

            // Then execute anonymous block
            // Execute anonymous PL/SQL block
            cmd.CommandText = sql;
            cmd.CommandType = CommandType.Text;
            var res = 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];

            // set bind size for each array element
            for (int i = 0; i < sql.Length; i++)
            {
                cmd.Parameters["outString"].ArrayBindSize[i] = 32000;
            }


            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++)
                {
                    // use proper indexing here
                    //OracleString s = (OracleString)cmd.Parameters["outString"].Value;
                    OracleString s = ((OracleString[])cmd.Parameters["outString"].Value)[i];
                    outString += s.ToString();

                    // add new line just for formatting
                    outString += "\r\n";
                }

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

            Console.WriteLine(outString);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

    _connection.Close();
    _connection.Dispose();

    Console.WriteLine("Press RETURN to exit.");
    Console.ReadLine();
}

输出结果为:

Do you see me?
My name is: Oracle

Press RETURN to exit.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中从 DBMS_OUTPUT.GET_LINES 获取输出缓冲区 的相关文章

  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 获取 SQL 表上未使用的唯一值

    我有一个表 其中有一列描述数字 ID 该 ID 对于所有行都是唯一的 但它不是主键 数字 ID 是有限的 假设答案可以是从 1 到 10 SELECT ID FROM TABLE ID 1 2 5 我必须 通过 UI 向用户呈现未使用的值
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 私有模板函数

    我有一堂课 C h class C private template
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 不解析 RESTful 应用程序中的视图

    我正在使用 Spring MVC 3 构建一个具有 RESTful Web 服务的 Web 应用程序 Web 服务将由应用程序使用 因此永远不应该真正解析对视图的任何请求 有什么方法可以在 servlet 上下文中指定任何请求都不应解析到任
  • WordPress 用户上传不带扩展名的照片

    我遇到了最奇怪的问题 我的网站上有一位作家 使用 WordPress 4 2 2 但这种情况发生了几个月 不断上传名称为 00甚至没有扩展名 并且由于某些黑暗的原因 这些图像绕过了 WordPress 上传过滤器并获得了疯狂的名称 例如jp
  • 如何在 vaadin 7 中创建复杂的标头?

    我使用 setColumnHeader Object String 将一个简单的字符串设置为列标题 我想创建一个复杂的标题 我想知道是否有任何方法可以在 Vaadin 7 中构建如下图所示的类似表 https i stack imgur c
  • Web Audio API 从暂停状态恢复

    我经常读到无法使用以下命令暂停 恢复音频文件网络音频API https dvcs w3 org hg audio raw file tip webaudio specification html 但现在我看到了一个example http
  • 加载 XSLT 文档时路径中存在非法字符

    我正在创建一个方法来返回 HTML 字符串作为 XSLT 转换的结果 当我运行以下代码时 我在以下行中收到路径错误中的非法字符 xsltTransform Load xsltTemplate 注意我已经通过另一种方法测试了 XSLT 转换并
  • GCM:java.lang.NoClassDefFoundError:com/google/android/gcm/server/Sender

    我一直在尝试让 Google Cloud Messaging 在 Eclipse 中工作 我能够编译他们的演示网页上给出的示例并运行它 没有任何错误 但是 当我尝试使用 jersey 创建自己的示例时 当以下代码尝试创建发件人时 我收到运行
  • Delphi 2010 如何设置IDE打开项目对话框的初始文件夹

    有谁知道如何在Delphi 2010 IDE中设置打开项目或打开文件对话框的初始文件夹 我第一次在 USB 硬盘上安装 D2010 打开的对话框总是恢复到 Windows 驱动器 D 而 Delphi 在驱动器 R 上 在 工具 选项 环境
  • LDAP:ldap.SIZELIMIT_EXCEEDED

    我正在得到一个ldap SIZELIMIT EXCEEDED当我运行此代码时出错 import ldap url ldap
  • WebStorm:配置 Prettier 使用选项卡?

    The 更漂亮的文档 https prettier io docs en options html tabs说使用 use tabs覆盖默认行为 WebStorm 自动填充 Prettier 包 那是一个文件夹 我尝试将其更改为npm pr
  • 格式化 C# 字符串,使其值之间的间距相同

    我有3根弦 第一组字符串是 1 0536 2 1 2 第二个是这样的 Round Square Hex 最后是 6061 T6 T351 ASF 3 4 5 我需要将三个字符串组合在一起 每个字符串之间的间距相同 我无法使用 t 进行制表符
  • 删除不必要的 svn:mergeinfo 属性

    当我合并我的存储库中的内容时 Subversion 想要添加 更改很多内容svn mergeinfo与我要合并的内容完全无关的文件的属性 有关此行为的问题之前已在 Stack Overflow 上提出过 工作副本根目录以外的路径上的 SVN
  • 带有“href”的plotly树形图元素不适用于本地相对html路径

    我有一个简单的表格 文本内有 href href指向本地html文件的相对路径 但点击它并不会打开该页面 有什么办法可以做到这一点 好的解决方法吗 文件夹结构如下 由于root会改变 所以需要相对路径 root root index htm
  • Iphone - 当每个单元格高度是动态时,何时计算 tableview 的 heightForRowAtIndexPath?

    我已经多次看到这个问题被问到 但令人惊讶的是 我没有看到一致的答案 所以我自己尝试一下 如果您有一个包含您自己的自定义 UITableViewCells 的 tableview 其中包含 UITextViews 和 UILabels 其高度
  • 如何根据整个 github actions 工作流程的成功或失败设置 github 分支保护规则?

    我正在尝试根据 github 操作工作流程的成功或失败设置 github 分支保护规则 您可以在此处查看工作流程 https github com apostropecms apostrope blob main github workfl
  • Rust 与 Python 程序性能结果问题

    我写了一个计算字数的程序 这是程序 use std collections HashMap use std io use std io prelude derive Debug struct Entry word String count
  • 自动完成扩展器在模式弹出扩展器内不起作用

    我正在打开一个弹出窗口 其中有一个文本框 我想为此文本框使用 Ajax 自动完成 extebder 但它无法调用 webservice 方法进行自动完成 无法理解这是回发或更新面板的问题 我应该在哪里使用更新面板 我的包含弹出 div 的页
  • GCC 声明: typedef __pid_t pid_t?

    我对 例如 pid t 的声明感到困惑 pid t 是什么意思 它是其他地方定义的另一种类型吗 如果是 在哪里 为什么我的 types h 在 ubuntu 13 04 64 位中定义 pid t 如下 ifndef pid t defin
  • 如何在 Markdown 表格中编写列表?

    可以在 Markdown 表格中创建一个列表 项目符号 编号与否 一个表看起来像这样 Tables Are Cool col 3 is right aligned 1600 col 2 is centered 12 zebra stripe
  • 按 Enter 键后将焦点保持在文本框上

    在VBA窗体中按回车键后如何将焦点保持在文本框中 此代码将文本添加到列表框 我想将焦点保持在文本框上以准备接收另一个项目 当我单击 添加 按钮时 它将文本添加到列表框并将焦点返回到文本框 但是当我按 Enter 时 它不会 即使它使用相同的
  • 在 C# 中从 DBMS_OUTPUT.GET_LINES 获取输出缓冲区

    我正在尝试获取输出DBMS OUTPUT PUT LINE 通过 C 在我的匿名 PL SQL 块中调用方法 我在这里查看了其他几个相关问题 但仍然遇到麻烦 执行匿名块的返回码正在return 1 这应该是正确的docs https doc