【问题标题】:Is there way to use table of varchar 2 in select statement有没有办法在选择语句中使用 varchar 2 表
【发布时间】:2019-04-25 12:11:13
【问题描述】:

我有一个返回 varchar2 表的存储函数。 我想在选择中使用它

存储函数:-

create or replace PACKAGE TESTSTR AS 

 TYPE strings_t IS TABLE OF VARCHAR2 (4000);

FUNCTION strings
   RETURN strings_t; 

END TESTSTR;

select * from  TABLE (TESTSTR.strings())

它给我带来了无效数据类型错误

ORA-00902: 无效的数据类型

【问题讨论】:

标签: sql oracle plsql


【解决方案1】:

如果您想在 PL/SQL 之外使用您的列表,如您的帖子中所述,您需要在数据库中定义一个 OBJECT 类型。例如,

CREATE OR REPLACE TYPE my_string AS OBJECT (val varchar2(4000));
CREATE OR REPLACE TYPE my_string_t AS TABLE OF my_string;

...然后使用my_string_t 代替您的PL/SQL strings_t 类型。

只要您的字符串列表中的元素少于 32768 个,您就可以改用预定义的 SYS.ODCIVARCHAR2LIST 对象类型,而无需声明任何新的对象类型。

例如,

CREATE OR REPLACE PACKAGE teststr AS
  FUNCTION strings RETURN sys.odcivarchar2list;
END teststr;

CREATE OR REPLACE PACKAGE BODY teststr AS
  FUNCTION strings RETURN sys.odcivarchar2list IS
    l_list sys.odcivarchar2list;
  BEGIN
    SELECT rownum 
    BULK COLLECT INTO l_list
    FROM DUAL
    CONNECT BY ROWNUM <= 1000;

    RETURN l_list;
  END strings;
END teststr;

SELECT * FROM table(teststr.strings);

【讨论】:

    【解决方案2】:

    使用以下选项创建函数,例如 函数字符串 返回字符串_t 流水线是 --声明你的类型变量为空 开始 --把你的逻辑放在这里 管道行(out_variable); 例外 --如果有的话 结束;

    使用查询退出: select * from table(tester.strings);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多