我有以下代码,其中我使用变量将值列表传递给多个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行的值(并且当它结束时抛出错误','并且没有最终的')')。我该如何解决这个问题?
答案 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环境中,则可以创建将容纳更大数据量的变量。