在Oracle SQL Developer中使用DEFINE语句中的Continuation字符

时间:2014-04-01 15:46:11

标签: sql oracle oracle-sqldeveloper

我有以下代码,其中我使用变量将值列表传递给多个SQL语句(我无法保存在表中,因为我没有权限而且不想要维护所有各种SQL部分中的列表。)

只要所有值都在一行上,它就能正常工作......但是因为我有这么多的值;我想将它分成多行并使用Continuation Character' - '。

我正在针对Oracle SQL Developer 2.1.1.64运行Oracle 10g(我也在PL/SQL Developer尝试了此操作,但也失败了)

--=========================================

   define subclasses = ('10-1010-10','10-1010-15','10-1010-20', -

    '10-1010-25','10-1010-30')   --- there are another 60 values...


    select item from item_master where ((subclass) in &&subclasses);

    Select Price from Item_prices where ((subclass) in &&subclasses);

--=========================================

我收到以下错误

ORA-01722: invalid number
01722. 00000 -  "invalid number"

因为它将代码解析为

select item from item_master where ((subclass) in ('10-1010-10','10-1010-15',
'10-1010-20', -'10-1010-25','10-1010-30'))

...在SQL中保留延续代码' - ',然后它转到第二行值。

如果我删除' - '...它只处理第一行的值并解析为

select item from item_master where ((subclass) in ('10-1010-10','10-1010-15','10-1010-20', )

...丢失第二行到第n行的值(并且当它结束时抛出错误','并且没有最终的')')。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

你可以这样做:

column subc new_value subclasses

select q'[('10-1010-10','10-1010-15','10-1010-20',
'10-1010-25','10-1010-30')]' as subc
from dual;

现在&subclasses.将包含所有代码。

注意我使用了q'[...]'引用语法,以避免必须加倍数据中的所有引号。

答案 1 :(得分:0)

我注意到您正在尝试将字符串变量列表替换为select语句。您应该重写自己的define语句,使其成为单个字符串列表,如下所示:

define subclasses = '''10-1010-10'',''10-1010-15'',''10-1010-20'', -
    ''10-1010-25'',''10-1010-30''';   --- there are another 60 values...

-应该可以作为延续字符(请参见Oracle documentation here)。

现在,当执行select语句时,您需要编辑WHERE子句,以便对其进行格式化,以便将这些值直接插入其中:

    Select item from item_master where subclass in (&subclasses);

    Select Price from Item_prices where subclass in (&subclasses);

这最终将被解释为就像您写过一样:

Select item from item_master 
where subclass in ('10-1010-10','10-1010-15','10-1010-20', '10-1010-25','10-1010-30');

但是,如果您有很多值,则在使用SQL * Plus时可能会遇到limitations for substitution variables(即每个变量限制为240个字节)。在这种情况下,您可以将变量拆分为多个变量,然后在SELECT中将它们连接起来,或者如果您在PL / SQL环境中,则可以创建将容纳更大数据量的变量。