【问题标题】:Oracle SQL: create a dumy table from a substitution variableOracle SQL:从替换变量创建虚拟表
【发布时间】:2020-10-13 23:03:04
【问题描述】:

由于下面显示的代码,我可以在 Oracle SQL 中创建一个虚拟表:

select crca.*
from my_real_table real_table, 
     table(ntde.ENCRYPT_ALL(:inputParam)) enc
where
    ...

我希望能够在不使用ntde.ENCRYPT_ALL 的情况下做同样的事情,我想做这样的事情:

select crca.*
from my_real_table real_table, 
     table(:inputParam) enc
where
    ...

它不起作用,我收到此错误:

  1. 00000 - “无法访问非嵌套表项中的行”
    *原因:尝试访问类型未知的项目的行
    解析时间或不是嵌套表类型
    *操作:使用 CAST 将项目转换为嵌套表类型

请问你知道怎么做吗?

【问题讨论】:

  • 您已标记 [oracle-sqldeveloper],如果这是您正在使用的,那么您可能需要 edit 您的问题包括 minimal reproducible example 以及您如何生成的完整示例绑定变量以及绑定变量的值是什么,因为我不相信 SQL 开发人员支持将集合数据类型存储在绑定变量中。它支持的数据类型列表在VARIABLE documentation of the sql/plus user guide 中给出。
  • 另外,:name 是一个绑定变量。 &name 是一个替换变量。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

正如例外所说,使用CAST

SELECT c.*
FROM   my_real_table r 
       CROSS JOIN TABLE( CAST(:inputParam AS your_collection_type) ) c

这假设:

  • 绑定变量包含一个集合(而不是字符串);和

  • 绑定变量正在从应用程序传递(这是Java example);和

  • 您已经创建了一个 SQL 集合类型来将绑定变量转换为。例如:

    CREATE TYPE your_collection_type AS TABLE OF NUMBER;
    

    或者,您可以使用内置集合(或VARRAY),例如SYS.ODCIVARCHAR2LIST,而不是创建自己的集合类型。

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多