【问题标题】:Wrong symbol inside replace function (PL/SQL, ORACLE)替换函数中的错误符号(PL/SQL、ORACLE)
【发布时间】:2018-06-18 17:33:34
【问题描述】:

我在包装内有以下程序:

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

在编译过程中出现错误:

错误(1177,45):PLS-00103:在预期以下之一时遇到符号“_”:* & = - + ; > at in is mod 余数 not rem or != or ~= >= and or like2 like4 likec ||成员子多集

"_" 内部函数有问题:INITCAP(REPLACE(colX, '_', ''))

如何解决?也许是其他方式?

【问题讨论】:

  • INSERT 语句中的括号不平衡。你看到了吗?

标签: sql function plsql package oracle12c


【解决方案1】:

'INSERT 开头的带引号的字符串以colX, ' 结尾。要引用引号,您需要将引号加倍:

'INSERT INTO tableA (col1, col2) 
 (select cola, 
 INITCAP(REPLACE(colX, ''_'', ''''))
 from tableB))'

或者使用q-quoting语法:

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

另外,赋值运算符是:= 而不是: =

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

insert into tablea ( col1, col2 )
select cola, initcap(replace(colx, '_', ''))
from   tableb

少了几个括号。

看起来它根本不需要是动态的,但我假设这是一个简化版本。

【讨论】:

  • 感谢@William,编译没有错误,双引号解决问题!...是的,它是更大的一部分;)
  • @4est - 将单引号加倍是可以的,但请考虑 q-quoting 机制,William 也证明了这一点。这是将单引号加倍的优越解决方案。 docs.oracle.com/cd/B19306_01/server.102/b14200/…
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多