ORA-00933使用案例/在选择内部时

时间:2014-09-10 07:36:16

标签: sql oracle

我正在尝试将此代码写入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;

2 个答案:

答案 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

尝试删除'和'来自那里的关键词。