2008-09-11 43 views
5

好的,这是一个晦涩难懂的问题,但希望有人能帮助我。Oracle列别名中的双引号

我正在处理的系统在存储过程中构建一个用于执行的动态SQL字符串,并且该动态SQL的一部分定义列别名,它们本身实际上是从用户生成数据的另一个表中检索的值。

因此,例如,字符串可能看起来像这样;

SELECT table1.Col1 AS "This is an alias" FROM table1 

这工作正常。但是,用于别名的值可能包含一个双引号字符,该字符会打破外引号。我想我可能会以别名的方式在别名中跳出双引号,但我一直没有搞清楚如何去做。反斜杠不起作用,并且在一行中使用两个双引号会导致此错误;

SQL Error: ORA-03001: unimplemented feature 
03001. 00000 - "unimplemented feature" 
*Cause: This feature is not implemented. 

有没有人有过这个问题的经验呢? 任何人都有见识的干杯。

p.s.在别名周围需要引号,因为它们可以包含空格。

回答

4

你可以把另一个字符,而不是双引号,并用代码中的双引号代替吗?

事情是这样的:

SELECT table1.Col1 AS "This is |not| an alias" FROM table1 

然后只需更换|与“

我知道这是一个黑客,但我想不出有什么更好的解决方案......而你在做什么有一个黑客无论如何,”好“的方法是选择值和列名分开,并将它们关联到你的代码中,这会使事情变得更加简洁。

1

当我运行此:

select 'test"columnname"' from dual 

甲骨文返回此(注意甲骨文生成的列名):

'TESTCOLUMNNAME' 
-------------------------------- 
test"columnname 

,甲骨文的列名不包括我的双引号的事实告诉我,甲骨文可能无法代表这一点。

就我所见,最好的办法是在使用列名之前从数据中去掉双引号。可悲的是,这也需要你做相同的过滤,当你选择这些列,但我没有看到另一种方式。

0

调查的一个可能有效的领域是查看引用方法。

my $ quotedString = $ dbh-> quote($ string);

2

使用Oracle报价运营商:

select q'#someone's quote#' from dual; 

以“#”可以由任何字符

0

试试这个来代替,两个单引号实际上看起来像一个双引号输出:
select 1 as "University ''John Smith''" from dual;