0

我是 Oracle sql 的新手,但我对 MSSQL 有一些经验。我收到了一个脚本来创建一些表,但是由于 BLOB 列,当我尝试限制大小时遇到​​了几个错误。

我试着问我的同事这件事,但他们也不确定。这基本上是从其他地方抓取的,所以他们不知道如何解决这个问题。

本质上,该表看起来像这样(表和列名称已更改):

CREATE TABLE table1
(
    ID       CHAR(32),
    NAME     CHAR(50),
    KEY      $(BLOB)(64),
    BUFFER   $(BLOB)(20),
    SORTNO   NUMERIC(8) CONSTRAINT UK_WIU UNIQUE,
CONSTRAINT PK_ID PRIMARY KEY (ID)
)
;

运行此程序时,由于美元符号 ($),我收到错误“无效字符”。但是,如果我将数据类型更改为 BLOB(64),则会收到一条错误消息,提示“缺少右括号”。如果我只做“BLOB”,它运行良好。有什么方法可以定义 BLOB 的长度吗?

谢谢

4

2 回答 2

0

BLOB列的大小不能被限制。它允许您存储最多 [(4 GB - 1) * (数据库块大小)] 数据,仅此而已。如果您需要的数量少于此数量,那很好,没问题。

有关 BLOB(和其他 Oracle 18c 数据类型)的更多信息:https ://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Data-Types.html#GUID-1A71C635-188E-4EC9- B821-1DBEC2B45451

您打算在 Oracle 中创建的表如下所示:

SQL> create table table1
  2    (id     varchar2(32) constraint pk_id primary key,
  3     name   varchar2(50),
  4     sortno number(8) constraint uk_wiu unique,
  5     key    blob,
  6     buffer blob
  7    );

Table created.

SQL>

关于您的代码的另一个反对意见:不要使用CHAR但是VARCHAR2(除非您必须);CHAR将用空格右填充值,直到列的最大长度。

于 2019-05-06T19:58:00.583 回答
0

不,列只是定义为 CLOB 或 BLOB。

没有与列关联的大小。您可以根据自己的喜好放入大小不一的东西,但有一些限制

“最大大小:(4 GB - 1) * DB_BLOCK_SIZE 初始化参数(8 TB 到 128 TB)”..截至 Oracle 11g。

要限制大小,您可以在应用程序层这样做 - 防止人们上传大于 X 的文件,尽管具有 DB 访问权限的人可以这样做。

您可以编写一个存储过程来处理 INSERT/UPDATES,并在其中设置逻辑以防止在大小“太大”时出现 DML。

您也许可以使用函数调用来执行检查约束以获取 lob 的长度...这里的示例

于 2019-05-06T20:01:18.547 回答