是否可以在Oracle的FROM子句中使用CASE WHEN表达式?

时间:2015-04-15 14:51:14

标签: sql oracle plsql

上下文

使用Oracle 12c标准版(其许可模式不允许使用表分区)。

目标

在触发器内使用它可以动态地将行分派给不同的表。

示例

CREATE OR REPLACE trigger TRG_DISPATCH
  instead of insert or update on MY_VIEW
  for each row

DECLARE
  partition_id SIMPLE_INTEGER ;

BEGIN
  partition_id := 1 ;

  insert into
    case
      when partition_id = 1 then "my_table_1"
      when partition_id = 2 then "my_table_2"
    end ( "id", "code", "msg" )
  values
    ( :new."id", :new."code", :new."msg" )
  ;
END ;
/

注意已经知道this cannot be achieved using Microsoft SQL Server 2005,但所有RDBMS都不相同。

1 个答案:

答案 0 :(得分:4)

首先,为什么不使用Oracle中的内置分区功能?更容易。

Oracle支持insert first

insert first
    when partition_id = 1 then
        into my_table_1( "id", "code", "msg" )
            values ( :new."id", :new."code", :new."msg" )
    when partition_id = 2 then
        into my_table_2( "id", "code", "msg" )
            values ( :new."id", :new."code", :new."msg" );