【问题标题】:T-SQL to Oracle: Complicated Table ColumnT-SQL 到 Oracle:复杂的表列
【发布时间】:2015-11-27 15:16:06
【问题描述】:

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

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

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

【问题讨论】:

  • 我相信你希望[valueAsString]作为一个虚拟列。
  • varbinary 在 Oracle 中将是 BLOB,但我认为您不能轻松地将其转换为合理的字符表示形式(尤其是不能作为计算列)。但是整张桌子对我来说真的没有意义。你在value 列中存储了什么?如果您需要它作为字符值,那么为什么不立即使用CLOB
  • 当然。我已经弄清楚了那部分。现在我正在研究 CONVERT 的替代方案。 VARBINARY 列现在是 LONG RAW,我不确定 Oracle 的 TO_CHAR 函数是否喜欢这种类型。
  • @a_horse_with_no_name 我不确定。这是我正在开发的现有系统。
  • LONG RAW 已弃用。不要不要使用它。请改用BLOB

标签: sql oracle tsql ddl oracle12c


【解决方案1】:

一种可能的解决方案是

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 不幸的是不是确定性的,因此需要将其包装到确定性函数中才能在表定义中使用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 2016-12-25
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多