从Oracle SQL

时间:2016-02-03 10:34:44

标签: sql oracle function plsql blob

同事

我在Oracle中遇到表函数问题。

更具体地说,我有一个将BLOB转换为varchar2表的函数。

create type string_array is table of varchar2(255);

create or replace function blob_to_strings(p_blb in BLOB) return string_array as
begin
-- some processing here
end;

此外,我还有一个包含BLOBS的表,我需要使用它。

create table my_blobs (id number, data blob)

现在,在id表中有my_blobs,我想查询转换函数的结果。像

这样的东西
select t.* from table(blob_to_strings(b.data)) t, my_blobs b where b.id = 123;

(我知道这是不正确的,只是显示我需要的东西) 此查询预计会返回b.data: invalid identifier,因为您无法访问from部分内的其他表格列。

我理解如何在运行2个查询的PL / SQL中执行此操作,但实际上需要在SQL中执行此操作。

任何人都可以帮助我吗? 提前谢谢。

UPD:我试过以下内容:

select * from table(select blob_to_strings(b.data) from my_blobs b where b.id = 123);

结果: ORA-00902:数据类型无效

还有其他想法吗?

2 个答案:

答案 0 :(得分:2)

原始查询的问题可能是您尝试从数组中选择后会有表名(from table(blob_to_strings(b.data)) t, my_blobs b)。换句话说,你试图从尚未宣布的东西中进行选择。切换from子句中项目的顺序,它应该可以工作。

这里是一个测试案例,我敲了一下来证明(我使用了CLOB,因为我们显然正在处理文本;我不确定你为什么要使用BLOB?):< / p>

create table t1 (id number,
                 clob_col clob);

insert into t1 values (1, 'abcd');
insert into t1 values (2, 'efg');

commit;

create type string_array is table of varchar2(255);

create or replace function clob_to_str_tab (p_clob in clob)
return string_array
is
  v_str_arr string_array := string_array();
begin
  for i in 1.. length(p_clob)
  loop
    v_str_arr.extend;
    v_str_arr(i) := substr(p_clob, i, 1);
  end loop;

  return v_str_arr;
end;
/

select t1.id,
       t2.column_value res
from   table(clob_to_str_tab(t1.clob_col)) t2,
       t1;

ORA-00904: "T1"."CLOB_COL": invalid identifier

select t1.id,
       t2.column_value res
from   t1,
       table(clob_to_str_tab(t1.clob_col)) t2;

        ID RES
---------- ---
         1 a  
         1 b  
         1 c  
         1 d  
         2 e  
         2 f  
         2 g  

答案 1 :(得分:-1)

您可以使用Oracle的 PIPE ROW 声明

来实现此目的

请参阅:Pipelined Table Functions