我有以下字符串:
ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence
Run Code Online (Sandbox Code Playgroud)
所以我想选择,Sentence因为它是最后一个时期之后的字符串.我怎样才能做到这一点?
迁移到Oracle 18c企业版后,无法创建基于函数的索引。
这是我的索引 DDL:
CREATE INDEX my_index ON my_table
(UPPER( REGEXP_REPLACE ("DEPT_NUM",'[^[:alnum:]]',NULL,1,0)))
TABLESPACE my_tbspace
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ORA-01743: only pure functions can be indexed
01743. 00000 - "only pure functions can be indexed"
*Cause: The indexed function uses SYSDATE or the user environment.
*Action: PL/SQL functions must be pure (RNDS, RNPS, WNDS, WNPS). SQL
expressions must not use SYSDATE, USER, USERENV(), or anything …Run Code Online (Sandbox Code Playgroud) 我有一个在包装内动态生成的更新语句。
我需要更新的target_field2唯一时间source_field2是NOT NULL,如果NULL保持target_field2原样。
希望对此有一个简单的答案。这是关注的动态部分:
ELSIF cur_field_to_update.FIELD_NAME = 'SOURCE_FIELD2'
THEN
v_update_values :=
v_update_values
|| ', CASE WHEN NVL('''
|| data_cur.IND_TYPE
|| ''', NULL) <> ''D'' THEN NULL ELSE TO_NUMBER(NVL('
|| cur_field_to_update.FIELD_NAME
|| ','
|| TARGET_FIELD2
|| ')) END';
Run Code Online (Sandbox Code Playgroud)
最终看起来像..
UPDATE target_table
SET (target_field1,target_field2) =
(SELECT source_field1,
CASE WHEN NVL('A',NULL) <> 'A'
THEN NULL
ELSE TO_NUMBER(NVL(source_field2,target_field2))
END
FROM source_table);
Run Code Online (Sandbox Code Playgroud)