在Oracle 19c中从LONG中提取字符

hpxqektj  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(229)

我有一个表t,列c是LONG类型的,我想提取最后100个字符。
困难在于:
1.字符串函数不适用于LONG。
1.很难将LONG转换为CLOB,甚至to_lob和cast似乎也会失败
1.这些值可以超过VARCHAR的长度。
我尝试了最明显的解决方案:

select right(to_lob(c), 100) from t

字符串
它失败了,
不一致的数据库:预期的CHAR得到了LONG
还有慢性创伤性脑水肿

with foo as (
  select cast(to_lob(c) as clob) c
)
select substr(c, length(c)-99, 100) ending
from foo


这会产生同样的错误。

hwamh0ep

hwamh0ep1#

如果你的长值大小小于32 KB,你可以简单地将它们分配给PL/SQL中的一个本地varchar2变量。如果它们小于4KB,这特别容易,因为我们可以返回一个SQL可以访问的varchar2。它可能是这样的:

CREATE TYPE foo_rowtype IS OBJECT (long_col1 varchar2(4000), col2 int, col3 varchar2(5)); -- all the columns needed from the table
CREATE TYPE foo_tabtype IS TABLE OF foo_rowtype;

CREATE OR REPLACE FUNCTION foo2string
  RETURN foo_tabtype PIPELINED
AS
  var_string varchar2(32767);
BEGIN
  FOR rec_row IN (SELECT *
                    FROM foo)
  LOOP
    var_string := rec_row.long_col1; -- long to varchar2 conversion here
    PIPE ROW(foo_rowtype(SUBSTR(var_string,1,4000),rec_row.col2,rec_row.col3));
  END LOOP;
END;
/

-- now query it normally, in this case getting the last 100 chars:
 SELECT SUBSTR(long_col1,LENGTH(long_col1)-100)),col2,col3
  FROM foo2string

-- older versions may require the TABLE operator:

SELECT SUBSTR(long_col1,LENGTH(long_col1)-100)),col2,col3
  FROM TABLE(foo2string)

字符串
如果值大于4KB,则需要让函数本身获取字符串的结尾。如果值大于32 KB,那么你就必须使用一个更复杂的方法,包括dbms_sql,通过迭代dbms_sql.column_value_long调用来逐步读取long,并追加到一个临时CLOB。这要复杂得多。这就是为什么我们从不使用long数据类型。关于它的唯一位置,应该在Oracle的数据字典中的某些视图中找到,并且可以使用上述技术使这些视图可通过代码进行管理。

s8vozzvw

s8vozzvw2#

尝试

select dbms_lob.substr(sys_dburigen(LIST_OF_COLUMNS_LEADING_TO_UNIQUE_ROW, c, 'text()').getclob(),4000,1) as c
from foo ;

字符串
如果表中有PK,则LIST_OF_COLUMNS_LEADING_TO_UNIQUE_ROW是平凡的。
示例如下:

select index_name, column_position, dbms_lob.substr(sys_dburigen(index_owner, index_name, column_position, column_expression, 'text()').getclob(),4000,1) as ce
from all_ind_expressions ;

相关问题