我正在尝试将此代码写入toad,但它会抛出一个ORA-00933(SQL命令未正确结束),就在第一个WHEN。
我不确切知道会发生什么。我试图遵循ORACLE文档,但没有成功。有什么帮助吗?
我告诉你用toad写的代码。
select template.seq_temp, rules.fec_desde_serv, rules.seq_rec, rules.seq_agencia, rules.SEQ_TTOO, rules.COD_INTERFACE, pais.COD_PAIS, rules.cod_idioma
from re_t_vp_voucher_template template, re_t_vp_voucher_rules rules, re_t_vp_voucher_rules_pais pais,
case &tipser
when 'TRF' then re_t_vp_voucher_rules_trf trf
when 'ACC' then re_t_vp_voucher_rules_acc acct
else re_t_vp_voucher_rules_otro otro
end
where template.seq_temp = rules.seq_temp
and RULES.SEQ_RULE = PAIS.SEQ_RULE
group by template.seq_temp, rules.fec_desde_serv, rules.seq_rec, rules.seq_agencia, rules.SEQ_TTOO, rules.COD_INTERFACE, pais.COD_PAIS, rules.cod_idioma
order by template.seq_temp, rules.fec_desde_serv;
答案 0 :(得分:3)
您不能在FROM子句中使用CASE构造。
因此,下面突出显示的SQL不正确。
from re_t_vp_voucher_template template, re_t_vp_voucher_rules rules, re_t_vp_voucher_rules_pais pais,
case &tipser
when 'TRF' then re_t_vp_voucher_rules_trf trf
when 'ACC' then re_t_vp_voucher_rules_acc acct
else re_t_vp_voucher_rules_otro otro
end
where template.seq_temp = rules.seq_temp
原因是,您尝试在SQL中使用动态表名,这是不允许的。除非编写动态SQL语句(即在PL / SQL中将语句构建为字符串,然后使用EXECUTE IMMEDIATE或DBMS_SQL包执行它),否则不能在SQL中使用动态表名。
所以重写查询以满足SQL标准,或者(ab)使用动态sql。
CASE是一个表达式,它的作用类似于IF-THEN-ELSE逻辑和Oracle 使用短路评估。所以,它总是需要比较 表达。在FROM子句中你不能拥有它。
答案 1 :(得分:-1)
你的情况是错的。: -
where template.seq_temp = rules.seq_temp
and RULES.SEQ_RULE = PAIS.SEQ_RULE
case &tipser
when 'TRF' then and rules.seq_rule = trf.seq_rule
when 'ACC' then and rules.seq_rule = acct.seq_rule
else and rules.seq_rule = otro.seq_rule
end
尝试删除'和'来自那里的关键词。