替换函数内的错误符号(PL/SQL,ORACLE)

4es*_*est 0 sql plsql function package oracle12c

我在包内有以下程序:

PROCEDURE test1
IS
     InsertST varchar2(32000) : = 'INSERT INTO tableA (col1, col2) 
                                   (select cola, 
                                   INITCAP(REPLACE(colX, '_', ''))
                                   from tableB))';
Begin
    execute immediate InsertST;
END
Run Code Online (Sandbox Code Playgroud)

在编译期间我收到错误:

错误(1177,45):PLS-00103:遇到以下其中一项时遇到符号"_":*&= - +; </> at in是mod的余数不是rem <>或!=或〜=> = <= <>和/或类似like2 like4 likec之间的|| 成员submultiset

东西是错误的"_"内部功能:INITCAP(REPLACE(colX, '_', ''))

怎么解决?也许是其他方式?

Wil*_*son 5

引用的字符串开始'INSERT于colX, '.要引用引号,您需要将引号加倍:

'INSERT INTO tableA (col1, col2) 
 (select cola, 
 INITCAP(REPLACE(colX, ''_'', ''''))
 from tableB))'
Run Code Online (Sandbox Code Playgroud)

或者使用q引用语法:

q'[INSERT INTO tableA (col1, col2) 
 (select cola, 
 INITCAP(REPLACE(colX, '_', ''))
 from tableB))]';
Run Code Online (Sandbox Code Playgroud)

此外,赋值运算符:=不是: =.

看起来你想要生成这样的语句:

insert into tablea ( col1, col2 )
select cola, initcap(replace(colx, '_', ''))
from   tableb
Run Code Online (Sandbox Code Playgroud)

它有几个括号.

它看起来根本不需要是动态的,但我认为这是一个简化的版本.

  • @ 4est - 加倍单引号是可以的,但确实考虑了q引用机制,威廉也证明了这一点.将单引号加倍是一个非常优越的解决方案.https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm#i42617 (2认同)