Снежинка с использованием REPEAT / SPACE внутри класса VALUES - PullRequest
0 голосов
/ 29 февраля 2020

Простая таблица сценариев с одним столбцом:

CREATE OR REPLACE TABLE t1(c VARCHAR(200));

INSERT INTO t1(c) SELECT repeat('a',100); -- works 
INSERT INTO t1(c) VALUES (repeat('a',100)); -- error

INSERT INTO t1(c) SELECT space(100); -- works
INSERT INTO t1(c) VALUES (space(100)); -- error

SELECT c, LENGTH(c) FROM t1;

SQL Ошибка компиляции: Неверное выражение [LPAD ('', CAST (100 * (CAST (LENGTH ('a') AS) NUMBER (18,0))) AS NUMBER (21,0)), 'a')] в предложении VALUES

Существует ли ограничение, что вызовы выражений / функций могут использоваться с INSERT ... VALUES или это просто ошибка?

1 Ответ

1 голос
/ 29 февраля 2020

Может показаться, что эти выражения будут простыми строковыми функциями, но, глядя на то, как компилятор переводит функцию, она больше не выглядит простой функцией.

Самая простая арифметика c выражения и строковые функции могут быть вычислены во время компиляции, но большинство других выражений не могут.

Почему бы вам не использовать переменные?

set my_spaces=(SELECT space(100)); 
set my_aaaa= (SELECT repeat('a',100)); 

CREATE OR REPLACE TABLE t1(c VARCHAR(200)); 

INSERT INTO t1(c) SELECT repeat('a',100); -- works 

INSERT INTO t1(c) VALUES ($my_aaaa); -- works

INSERT INTO t1(c) SELECT space(100); -- works 

INSERT INTO t1(c) VALUES ( $my_spaces ); -- works

SELECT c, LENGTH(c) FROM t1; 
...