如何在传递给Oracle SQL脚本的参数中转义值

时间:2014-03-11 05:06:52

标签: sql oracle sqlplus

我有一个使用sql plus执行的sql脚本。它读取输入参数,开头如下所示:

SET DEFINE ON

DEFINE PARAM1 = '&1'
DEFINE PARAM2 = '&2'

DECLARE
...

现在我想将此脚本与参数一起使用,但我需要使用一些特殊字符,尤其是'

@@./update.sql 'value of first param' 'Doesn't work'
                                            ^
--------------------------------------------| Here's the problem
commit;

当我按照通常的方式连接字符串时这样:

'Doesn'||chr(39)||'t work'

Doesn出现PARAM2。有没有办法以sqlplus将其作为单个字符串读取的方式来转义字符?

2 个答案:

答案 0 :(得分:1)

您需要使用escape characters来实现此目标。

{}使用大括号来转义一串字符或符号。在一组括号中的所有内容都被认为是转义序列的一部分。当您使用大括号转义单个字符时,转义字符将成为查询中的单独标记。

\使用反斜杠字符来转义单个字符或符号。只有反斜杠后面的字符才会被转义。

单字符转义的一些例子

SELECT 'Frank''s site' AS text FROM DUAL;

TEXT
--------------------
Franks's site

了解更多here

用于在SQL * Plus中转义&

SET ESCAPE '\'
SELECT '\&abc' FROM dual;

OR

SET SCAN OFF
SELECT '&ABC' x FROM dual;

逃离外卡

SELECT name FROM emp 
   WHERE id LIKE '%/_%' ESCAPE '/';

SELECT name FROM emp 
   WHERE id LIKE '%\%%' ESCAPE '\';

答案 1 :(得分:1)

从shell中你应该像这样调用脚本:

sqlplus user@db/passwd @update 'value of first param' "Doesn't work"

@update 这个词指的是你的脚本名为update.sql)

然后你必须在你的脚本中使用文字引用:

DEFINE PARAM2 = q'[&2]';

文字can be found here的文档。