(Also cross-posted to)
我知道这是一个老问题,但它是几个选择的答案没有解决我的问题的问题之一,我不想再开始关于这个主题的另一个话题,所以我会记下我发现的内容在我的旅行中,希望它可以帮助某人。这是一个重复的答案,因为如果有人正在寻找这样的解决方案,我不确定哪个更有可能出现。
我不太使用 Oracle,但是,就像在 SQL Server 中一样,似乎要传递一个表值参数,您需要有一个相应的 UDT(用户定义的表),您对其具有 EXECUTE 权限(我可能是错误的)。这意味着建议使用内置 SYS UDT 的其他答案会带来一些运费,我无法弄清楚是否真的可以将表传递给当前版本中不是 PL/SQL 存储过程的东西ODP.net.
其次,字符串解析解决方案由于所有明显的原因(无法缓存执行计划或 Oracle 所称的任何内容、无法很好地扩展等)都是一个杂项。
所以我花了相当多的时间尝试在数据集市上使用表值参数执行 IN 子句,在我被明显的闪光击中之前我只有 READ 权限(在 ASP.net论坛不少)。事实证明,Oracle '本机'支持 Xml 查询,因此您可以传递一个 xml 列表(如果您只需要这样的话),而不是传递一个值数组。同样,我可能错了,但它被当作合法的绑定参数处理,这是一个使用简单的示例(vb.net、ADO.net、ODP.net 使用 NuGet 包):
Dim xe As New XElement("l", New XElement("i", "ITEM-A"), New XElement("i", "ITEM-B"))
Using conn As New OracleConnection(myConnectionString)
conn.Open()
Using cmd As OracleCommand = conn.CreateCommand()
cmd.CommandType = CommandType.Text
Dim query As String
query = " SELECT s.FOO, q.BAR " & vbCrLf
query &= " FROM TABLE1 s LEFT OUTER JOIN " & vbCrLf
query &= " TABLE2 q ON q.ID = s.ID " & vbCrLf
query &= " WHERE (COALESCE(q.ID, 'NULL') NOT LIKE '%OPTIONAL%') AND "
query &= " (s.ID IN ("
query &= " SELECT stid "
query &= " FROM XMLTable('/l/i' PASSING XMLTYPE(:stid) COLUMNS stid VARCHAR(32) PATH '.')"
query &= " )"
query &= " )"
cmd.CommandText = query
Dim parameter As OracleParameter = cmd.Parameters.Add("stid", OracleDbType.NVarchar2, 4000)
parameter.Value = xe.ToString
Using r As OracleDataReader = cmd.ExecuteReader
While r.Read()
//Do something
End While
End Using
End Using
conn.Close()
这更像是一种观察,而不是一个仔细研究的解决方案,所以如果这样做有什么不合适的地方,请发表评论。
编辑。使用这种方法显然有 4000 个字符的限制(如果是 NVARCHAR,则为 2000),所以我不得不观看我的分页。如果您检查,您会收到信息性错误消息“ORA-01460: unimplemented or unreasonable conversion requested”