【问题标题】:Running multiple queries in Oracle with ODP.Net使用 ODP.Net 在 Oracle 中运行多个查询
【发布时间】:2017-05-04 01:18:53
【问题描述】:

我希望能够在 ODP.Net 中运行多个以 select 语句结尾的查询。我正在清除、更新然后从表中选择。

举个例子:

BEGIN
    DELETE FROM StagingTable;

    INSERT INTO StagingTable (Col1,Col2,Col3)
    SELECT Value1,Value2,Value3
    FROM MainTable;

    UPDATE StagingTable
    SET Col1 = FUNCTION(Col1);
END;
/
SELECT * FROM StagingTable;

这适用于 SQL Developer,但不适用于 ODP.Net。我收到此错误:

ORA-06550:第 26 行,第 1 列: PLS-00103:遇到符号“/”

但如果我删除 / 我得到:

ORA-06550:第 27 行,第 1 列: PLS-00103:遇到符号“SELECT”

我想做的事是否可能?我不想创建一个包并开始创建类型等等。理想情况下,我想通过.Net 做到这一点。

【问题讨论】:

  • 你不能那样做。要么将所有内容放在存储过程中并将选择作为游标返回,要么分成两次执行。
  • 正如 OldProgrammer 建议的那样,您使用的是 SQL*Plus 语法(反斜杠),这对于 SQL Developer 和类似工具来说很好,但不适用于编程接口。您可以使用绑定变量从 ODP.NET 调用匿名 PLSQL。您可以将整个内容放入一个匿名 PL/SQL 块中,并在最后绑定到 REF CURSOR。然后从中获取。
  • 这是一些示例代码,显示从 odp.net 调用匿名 plsql 块,然后绑定到 ref 游标:oracle.com/partners/campaign/o16odpnet-087852.html

标签: oracle plsql odp.net


【解决方案1】:

与带有 t-sql 的 SQL Server 不同,oracle 有两个上下文,SQL Plus 和 PL/SQL(begin/end 是一个匿名 plsql 块,其中选择外部将是 SQL Plus)。在 plsql 块启动后,我还没有找到从 SQL Plus 查询返回集合的方法。

但是,您当然可以在 plsql 块中完成所有这些操作并返回一个引用游标:

OracleCommand cmd = new OracleCommand(
    @"
    declare
        localUseVar varchar(50);
    begin
        select dummy into localUseVar from dual;

        open :refcursor for
        select dummy, localUseVar FROM DUAL 
        where :fakeparam=:fakeparam;
        end;
    ");
cmd.BindByName = true;
cmd.Parameters.Add("fakeparam", "fake");
cmd.Parameters.Add("refcursor", OracleDbType.RefCursor).Direction = System.Data.ParameterDirection.Output;

using (cmd.Connection = new OracleConnection("DATA SOURCE=localhost:1521/xe; PERSIST SECURITY INFO = True; USER ID = TEMPLATE; Password=password"))
{
    cmd.Connection.Open();
    var reader = cmd.ExecuteReader();
    Assert.IsTrue(reader.Read());
    Assert.AreEqual(reader[0], reader[1]);

}

更多信息在这里: http://www.brothersincode.com/post/executing-SQL-Plus-Batches-from-Net.aspx

您的具体情况如下:

OracleCommand cmd = new OracleCommand(
@"
begin
    DELETE FROM StagingTable;

    INSERT INTO StagingTable (Col1,Col2,Col3)
    SELECT Value1,Value2,Value3
    FROM MainTable;

    UPDATE StagingTable
    SET Col1 = FUNCTION(Col1);

    open :refcursor for SELECT * FROM StagingTable;
end;
");
cmd.BindByName = true;
cmd.Parameters.Add("refcursor", OracleDbType.RefCursor).Direction = System.Data.ParameterDirection.Output;

using (cmd.Connection = new OracleConnection("DATA SOURCE=localhost:1521/xe; PERSIST SECURITY INFO = True; USER ID = TEMPLATE; Password=password"))
{
    cmd.Connection.Open();
    var reader = cmd.ExecuteReader();

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多