2017-11-14 8 views
0

複数のデータベースにまたがる特定のレコードを検索し、残りのすべてにアクセスできるマスターDBに挿入するクエリを作成しています。db_linkを使って挿入すると無効な識別子エラーが発生する

しかし、セレクタがうまく動作しても、挿入が失敗すると、存在しないシノニムを使って無効な識別子が返されます。

問合せ:

  INSERT INTO AUDIT_TABLE 

      Select Distinct tr.hmy, trim(tr.uref), tr.stotalamount, tr.upostdate, tr.sdateoccurred 
      ,trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) 
      ,trim(v.ucode) 
      ,trim(v.ulastname) 
      ,trim(p.scode) 
      ,trim(p.saddr1) 
      ,trim(b.scode) 
      ,trim(b.sdesc) 
      ,l.icloseday 
      , case when l.icloseday <> 31 then trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) + (l.icloseday - 1) else last_day(trunc(tr.sdateoccurred)) end 
      , case when l.icloseday <> 31 then 
      case when trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) + l.icloseday <= trunc(tr.sdateoccurred) then add_months((tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1),1) 
       else trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) end 
       else trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) end 
      ,trim(u.uname) 
      ,'' 
      from [email protected]_link tr 
      join [email protected]_link d on d.hchkorchg = tr.hmy 
      join [email protected]_link v on tr.haccrualacct = v.hmyperson 
      join [email protected]_link p on p.hmy = d.hprop 
       and p.itype = 3 
      join [email protected]_link b on b.hmy = tr.hperson 
      join [email protected]_link u on u.hmy = tr.husercreatedby 
      join [email protected]_link l on l.hprop = p.hmy 
      where 
      1=1 
      and tr.itype = 2 
      and tr.manualcheck <> 0 
      and tr.sdatecreated between to_date(trunc(sysdate, 'YEAR')) and to_date(add_months(trunc(sysdate, 'YEAR'), 12)-1) 
      and case when l.icloseday <> 31 then 
       case when trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) + l.icloseday <= trunc(tr.sdateoccurred) then add_months((tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1),1) 
       else trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) end 
       else trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) end <> trunc(tr.UPOSTDATE) 

エラー:

  ORA-00904: "A2"."HUSERCREATEDBY": invalid identifier 
      ORA-02063: preceding line from db_link 

奇妙な部分:すべてのこれらのデータベースは、同じスキーマだけそれらのいくつかは、このエラー私はループを通過して失敗を持っていますすべて。

アップデート2017年11月14日:そこにもっと探し

、私が2つの以下の条件のいずれかを排除する場合INSERTは全く問題はありませんが、私は彼らを見て、ドン」続けるようです単純なSELECTに問題がないときにエンジンがなぜこの2つの理由でエラーになるのか分かりません。

and tr.sdatecreated between to_date(trunc(sysdate, 'YEAR')) and to_date(add_months(trunc(sysdate, 'YEAR'), 12)-1) 

または

それでも
and case when l.icloseday <> 31 then 
          case when trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) + l.icloseday <= trunc(tr.sdateoccurred) then add_months((tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1),1) 
          else trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) end 
          else trunc(tr.sdateoccurred) - (to_number(to_char(tr.sdateoccurred ,'DD')) - 1) end <> trunc(tr.UPOSTDATE) 
+0

権限が不足しているように見えます。他のユーザーに選択アクセスを許可する必要があります。 – XING

+0

しかし、挿入せずに選択を実行しても問題はありません。エラーは、「選択」データを挿入する場合にのみ発生します。 – EkeshOkor

+0

はい。そのため、「INSERT」権限がありません。 – XING

答えて

0

この問題が発生した理由を確認してください、しかし、誰もが同様にこのに実行されている場合、私はDB_LINKは、リモートテーブルにリモート情報を挿入することによってその周りに働いていませんその情報をマスタデータベースのローカルテーブルに挿入します。

begin 
    sql_update:='DROP TABLE AUDIT_TABLE'; 
    execute immediate 'begin [email protected]'||v_database_name||'(:sql_update); end;' using sql_update; 

    EXCEPTION 
     WHEN OTHERS THEN 
      IF SQLCODE = -942 THEN 
      NULL; -- suppresses ORA-00942 exception 
      ELSE 
      RAISE; 
      END IF; 
END; 

sql_update := 'create table AUDIT_TABLE (table structure)'; 
execute immediate 'begin [email protected]'||v_database_name||'(:sql_update); end;' using sql_update; 
commit; 

sql_update := q'[ 
       INSERT INTO [email protected]#DB_NAME# 
       Select {query here} 
       ]'; 
execute immediate replace('begin ' || sql_update || '; end;','#DB_NAME#', v_database_name); 
commit; 

sql_update := q'[ 
       INSERT INTO AUDIT_TABLE select * from [email protected]#DB_NAME# 
       ]'; 
execute immediate replace('begin ' || sql_update || '; end;','#DB_NAME#', v_database_name); 
commit; 
関連する問題