2016-03-04 107 views
0

我写了一个oracle函数,我需要将数据作为q'[var]',其中var是一个变量。但是oracle并没有把它看作一个变量。如何在函数中使用q'[]'运算符与变量

我试过q'['|| var ||']',它不起作用。把q'放在字符串中也是行不通的,因为它并不读q作为操作符。我尝试了多种组合,但似乎没有任何工作。我究竟做错了什么。

我使用的是oracle 11g。

编辑:其实我正在使用sql加载程序来插入数据。在插入之前的控制文件中,我必须从数据中删除单引号。

在控制文件中调用REPLACE_QUOTE函数,它发送从文件接收到的列数据。以下我添加了该特定列的控制文件的内容。

COLUMN "MY_SCHEMA.REPLACE_QUOTE(:COLUMN)" 

这里是函数。

create or replace function REPLACE_QUOTE(v_str in varchar2) return varchar2 
is 
reason varchar2(240); 
begin 
dbms_output.put_line(v_str); 
reason := REPLACE(q'[v_str]','''',null); 
RETURN reason; 
END; 

我试过直接在sql加载器控制文件中的替换函数,但它似乎并没有工作。我也试过REPLACE_QUOTE(Q'[:COLUMN]),这也行不通。

这里是删除引号前的数据。

'Failed to connect to 'http://172.17.70.74:80/xyz.x'' 

我需要删除引号,因为此列无法在数据库中插入。

请帮忙。谢谢。

+0

列每列请编辑您的问题补充功能你写的。我很好奇你为什么认为你需要使用引用机制来对付已经是变量的东西 - 通常只有当你有字符串时才使用它。如果在变量中已经有一个包含引号的字符串,那么您不需要解决报价问题,因为该步骤已经完成。例如。 'v_string:= q'{该字符串的内容包含单引号}';''v_new_string:= v_string ||' OK!';' – Boneist

+1

为什么你需要从你的数据中删除单引号?请在删除任何引号之前提供一些您要加载的示例数据。 – Boneist

+0

也许你根本不需要删除引号 - 也许这将有助于:http://www.orafaq.com/forum/t/153592/ – Boneist

回答

0

我已经解决了这个问题。在控制文件中我去掉OPTIONALLY ENCLOSED BY'“”像

FIELDS TERMINATED BY "," TRAILING NULLCOLS 

,并把它添加到除其中有单引号中它像

column1 OPTIONALLY ENCLOSED BY "'",column2 OPTIONALLY ENCLOSED BY "'", 
columnwithquotes char "substr(:columnwithquotes , 2, length(:columnwithquotes) - 2)" 
0

你可以简单地做:

CREATE OR REPLACE FUNCTION REPLACE_QUOTE(
    v_str IN VARCHAR2 
) RETURN VARCHAR2 DETERMINISTIC 
IS 
BEGIN 
    dbms_output.put_line(v_str); 
    RETURN REPLACE(v_str, ''''); 
END; 
/

v_str充当绑定变量所以不管内容传递到REPLACE_QUOTE功能正好可以直接传递给内部调用REPLACE不改变分隔符的字符串字面。

然后,您可以将其称为:

REPLACE_QUOTE(q['Failed to connect to 'http://172.17.70.74:80/xyz.x']'); 

REPLACE_QUOTE('Failed to connect to ''http://172.17.70.74:80/xyz.x'''); 
+0

更改功能后尝试了两种方法。同样的错误 - 在TERMINATED和ENCLOSED字段后找不到终止符 – Jaydeep

+0

您看过http://stackoverflow.com/a/35323077/1509264 – MT0