T-SQL到Oracle:复杂的表列



我想将下表转换为PL-SQL。

CREATE TABLE [SchemaName].[TableName] (
    [value]         VARBINARY (2000) NULL,
    [valueAsString] AS               (CONVERT([nvarchar](1000),[value],0))
);

有人知道如何在PL中重新创建valueAsString伪列吗?

一种可能的解决方案是

HUSQVIK@hq_pdb_tcp> CREATE OR REPLACE FUNCTION convert_raw_to_nvarchar(bin RAW) RETURN NVARCHAR2 DETERMINISTIC
  2  IS
  3  BEGIN
  4     RETURN utl_raw.cast_to_nvarchar2(bin);
  5  END;
  6  /
Function created.
HUSQVIK@hq_pdb_tcp> CREATE TABLE SchemaName.TableName (
  2      value         RAW(2000) NULL,
  3      valueAsString AS (convert_raw_to_nvarchar(value))
  4  );
Table created.
HUSQVIK@hq_pdb_tcp> insert into tablename (value) values (utl_raw.cast_to_raw(n'123344čřžžýřžý'));
1 row created.
HUSQVIK@hq_pdb_tcp> select * from tablename;
VALUE                                                        VALUEASSTRING
------------------------------------------------------------ --------------------
00310032003300330034003400630072007A007A00EC0072007A00EC     123344cržžýržý

如果二进制列的限制是2000字节,则不需要BLOB。

不幸的是,utl_raw.cast_to_nvarchar2不是确定性的,所以它需要被封装到确定性函数中才能在表定义中使用。

但我不喜欢这样的解决方案。视图可以在没有架构级别函数的情况下解决此问题。此外,当您希望始终将二进制数据转换为字符串时,数据类型建议您使用不合适的数据类型存储信息。

相关内容

  • 没有找到相关文章

最新更新